首先比较纬度之间的距离。每个纬度相距约 69 英里(111 公里)。范围从赤道处的 68.703 英里(110.567 公里)到两极处的 69.407 英里(111.699 公里)不等(由于地球略呈椭圆形)。两个位置之间的距离将等于或大于其纬度之间的距离。
请注意,对于经度而言并非如此 - 每个经度的长度取决于纬度。但是,如果您的数据仅限于某个区域(例如单个国家/地区) - 您也可以计算经度的最小和最大范围。
继续进行低精度、快速距离计算,假设地球是球形的:
坐标为 {lat1,lon1} 和 {lat2,lon2} 的两点之间的大圆距离 d 由下式给出:
d = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
数学上等效的公式(对于短距离较少受舍入误差影响)为:
d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
d 是以弧度表示的距离
distance_km ≈ radius_km * distance_radians ≈ 6371 * d
(6371公里是地球平均半径 http://m.wolframalpha.com/input/?i=radius%20of%20the%20earth)
这种方法的计算要求是最低的。然而,对于小距离,结果非常准确。
然后,如果它在给定距离内,或多或少,请使用更准确的方法。
地理图书馆 http://sourceforge.net/projects/geographiclib/不过,这是我所知道的最准确的实现文森特逆公式 http://en.wikipedia.org/wiki/Vincenty%27s_formulae也可以使用。
如果您使用的是 RDBMS,请将纬度设置为主键,将经度设置为辅助键。如上所述,查询纬度范围或纬度/经度范围,然后计算结果集的精确距离。
请注意,所有主要 RDBMS 的现代版本都原生支持地理数据类型和查询。