MySQL获得最接近的数值结果,同时比较两列(纬度和经度)

时间:2018-11-12 19:43:45

标签: mysql

我有一个具有经度和纬度的城市,以及一个具有经度和纬度的城市名称数据库。由于可以有多个同名城市,因此我想匹配地理位置最接近的城市。

举个例子,我在纽约的经纬度为40.7262,而经度为-73.9796。我想找到离纽约最近的班戈市,并且在数据库中有几个:

Bangor  PA  40.86555560 -75.20694440
Bangor  NY  44.81222220 -74.39777780
Bangor  ME  44.80111110 -68.77833330

我可以通过以下查询获得最接近的纬度:

Select * from cities 
where city='bangor'  
order by abs(Latitude - 40.7262) limit 1;

我可以通过以下查询获得最接近的经度:

Select * from cities 
where city='bangor' 
order by abs(Longitude - -73.9796) limit 1;

但这并不能使我成为最接近的城市,因为纽约州班戈市一案获胜,而班戈区宾夕法尼亚州又获胜。如何写我的查询以同时考虑纬度和经度来找到最近的城市?

1 个答案:

答案 0 :(得分:3)

我们可以使用Haversine formula来确定地图上两个点之间的距离(给定它们的纬度和经度)。您可以通过以下链接获取更多详细信息:http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

我们使用引用链接中所述的公式,确定距Bangor城市的距离(以公里为单位),然后根据计算出的距离确定ORDER BYLIMIT 1使我们可以考虑最近的城市。

SELECT *, 
       111.045 *
       DEGREES(ACOS(COS(RADIANS(40.7262))
         * COS(RADIANS(Latitude))
         * COS(RADIANS(-73.9796 - Longitude))
         + SIN(RADIANS(40.7262))
         * SIN(RADIANS(Latitude)))) AS distance_in_km
FROM cities 
WHERE city='bangor'  
ORDER BY distance_in_km LIMIT 1;