2013-01-23 81 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 
相关问题