我有一个具有经度和纬度的城市,以及一个具有经度和纬度的城市名称数据库。由于可以有多个同名城市,因此我想匹配地理位置最接近的城市。
举个例子,我在纽约的经纬度为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;
但这并不能使我成为最接近的城市,因为纽约州班戈市一案获胜,而班戈区宾夕法尼亚州又获胜。如何写我的查询以同时考虑纬度和经度来找到最近的城市?
答案 0 :(得分:3)
我们可以使用Haversine formula来确定地图上两个点之间的距离(给定它们的纬度和经度)。您可以通过以下链接获取更多详细信息:http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
我们使用引用链接中所述的公式,确定距Bangor
城市的距离(以公里为单位),然后根据计算出的距离确定ORDER BY
。 LIMIT 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;