我认为您的问题是您具有
city两个城市之间的值,您希望计算它们之间的距离。
该查询将为您完成工作,并以km为单位得出距离。它使用球余弦定律公式。
请注意,您将表格与其自身相连,因此可以检索两个坐标对以进行计算。
SELECt a.city AS from_city, b.city AS to_city, 111.111 * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude)) * COS(RADIANS(b.Latitude)) * COS(RADIANS(a.Longitude - b.Longitude)) + SIN(RADIANS(a.Latitude)) * SIN(RADIANS(b.Latitude))))) AS distance_in_km FROM city AS a JOIN city AS b ON a.id <> b.id WHERe a.city = 3 AND b.city = 7
请注意,该常数
111.1111是每米纬度的公里数,它是根据米的旧的拿破仑式定义,即从赤道到极点的距离的千分之一。该定义对于位置查找器工作足够接近。
如果要确定英里数而不是公里数,请
69.0改用。
http://sqlfiddle.com/#!9/21e06/412/0
如果您正在寻找附近的地点,则可能会想使用类似以下的子句:
HAVINg distance_in_km < 10.0 ORDER BY distance_in_km DESC
那就是(正如我们在美国马萨诸塞州波士顿附近所说的)邪恶的缓慢。
在这种情况下,您需要使用边界框计算。请参阅此文章以了解有关操作方法。
http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-
loc/
该公式包含一个
LEAST()函数。为什么?因为如果
ACOS()函数的参数甚至稍大于1,该函数就会引发错误。当所讨论的两个点非常靠近时,由于浮点epsilon(不准确,带有
COS()和
SIN()计算的表达式有时会产生略大于1的值)。)。该呼叫与问题对应。
LEAST(1.0,dirty-great-expression)
有一个更好的办法,一个公式通过撒迪厄斯·文森。它使用
ATAN2()而不是
ACOS()这样,因此不易受到epsilon问题的影响。



