选择问题

时间:2010-02-28 12:51:29

标签: sql mysql

假设我有一张包含城市列表的表格:

city | latitude | longitude
---------------------------
XX   | 34.800   | 48.550

假设我有一个用户的大致位置(纬度/经度),我如何找到最近的城市?也就是说,如何找到纬度和经度最接近用户纬度/经度的城市?

3 个答案:

答案 0 :(得分:2)

结帐

Creating a Store Locator with PHP, MySQL & Google Maps

此处提供的计算方法独立于Google地图,您应该可以从那里获得完整的算法。

只需要警惕不同的映射方法和产生的不同坐标。根据坐标使用的映射,您可能需要调整算法的参数。

答案 1 :(得分:0)

Google maps api有一项新功能可以反转地理缓存

玩得开心:)

More info on their wiki

答案 2 :(得分:0)

您可以使用geospatial extensions for MySQL

下面的公式将找到两点之间的海里距离。

3600 * acos(sin(latitude2_rads))             * sin(latitude1_rads)+ cos(latitude2_rads)             * cos(latitude1_rads)             * cos(longitude1_rads - longitude2_rads))

所以你可以把它连接成一个选择如下(在下面-7是必需的lat,-14是必需的lon)

假设纬度/经度字段为度:

select * FROM NDB as c1
order by  acos(sin(radians(-7))
          * sin(radians(latitude)) + cos(radians(-7))
          * cos(radians(latitude))
          * cos(radians(longitude) - radians(-14)))
limit 0,1

对于大型数据集,这可能效率不高,我只是针对一个包含22,706条记录的表运行它,花了0.163秒。

如果性能是一个问题,那么最好预先计算固定数据中所有点的距离,然后使用它而不是在SQL中计算它。