2

私は郵便番号テーブルを持っていますが、そこから郵便番号を取得して調整し、返すクエリをどのように作成できるか疑問に思ってlatitudelongitudeました。これはどのように行うことができますか?

これが私のテーブル構造です:

mysql> describe zipcodes;
+-----------+-----------------------+------+-----+---------+----------------+
| Field     | Type                  | Null | Key | Default | Extra          |
+-----------+-----------------------+------+-----+---------+----------------+
| id        | bigint(20)            | NO   | PRI | NULL    | auto_increment | 
| zip       | mediumint(5) unsigned | NO   | MUL | NULL    |                | 
| longitude | varchar(15)           | NO   | MUL | NULL    |                | 
| latitude  | varchar(15)           | NO   | MUL | NULL    |                | 
| city      | varchar(25)           | NO   |     | NULL    |                | 
| state     | varchar(25)           | NO   |     | NULL    |                | 
| county    | varchar(25)           | NO   |     | NULL    |                | 
| zipClass  | varchar(25)           | NO   |     | NULL    |                | 
+-----------+-----------------------+------+-----+---------+----------------+

longitudelatitude座標に最も近い郵便番号を取得できるようにしたいと思います。

4

2 に答える 2

1

テーブルが与えられた場合、指定された緯度と経度と各郵便番号の緯度と経度の間の距離を計算し、最小値を選択する必要があります。

(明らかに、「最も近い」郵便番号を見つけても、指定された地点が実際に郵便番号の境界内にあるとは限りません。)

以下のクエリには、「大円距離」計算の 1 つの実装が含まれていますが、この計算はzipcodesテーブル内のすべての行に対して実行されるため、コストのかかる操作になります。

SELECT ACOS( COS(RADIANS( d2.latitude ))
           * COS(RADIANS( d1.latitude ))
           * COS(RADIANS( d2.longitude ) - RADIANS( d1.longitude ))
           + SIN(RADIANS( d2.latitude ))
           * SIN(RADIANS( d1.latitude ))
           ) * 3958.82 AS distance_miles
     , d2.*
  FROM zipcodes d2
  JOIN (SELECT 44.9800 AS latitude, -93.2636 AS longitude) d1
 ORDER BY distance_miles DESC
 LIMIT 10
于 2013-01-23T20:45:52.810 に答える
1

これが私が見つけたクエリです。うまくいくようです。

SELECT zip, city, state, ((
    ACOS(SIN(-094.076163 * PI() / 180) * 
    SIN(latitude * PI() / 180) + 
    COS(-094.076163 * PI() / 180) * 
    COS(latitude * PI() / 180) * 
    COS((44.661216 - longitude) * PI() / 180)) * 180 / PI()
) * 60 * 1.1515) AS `distance` FROM zipcodes ORDER BY `distance` limit 1;
于 2013-01-23T17:44:15.403 に答える