2013-01-23 109 views
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座標。

+0

這是已填充了42K郵編美國數據庫。 –

+0

'SELECT zip FROM zipcode where where longitude = your_longitude AND latitude = your_latitude'?不知道你的問題 – cheesemacfly

+0

這是行不通的,因爲緯度/經度是拉鍊的確切座標。 –

回答

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; 
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 
相關問題