维基百科推荐使用公式,理由是公式用到了大量余弦函数, 而两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出 0.999… 的结果, 会导致较大的舍入误差。而公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。 以前采用三角函数表计算时的确会有这个问题,但经过实际验证,采用计算机来计算时,两个公式的区别不大。 稳妥起见,这里还是采用公式。
Haversine 公式
其中
为地球半径,可取平均值
, 表示两点的纬度;
表示两点经度的差值。
距离计算函数
下面就是计算球面间两点之间距离的函数。
from math import sin, asin, cos, radians, fabs, sqrt EARTH_RADIUS=6371 def hav(theta): s = sin(theta / 2) return s * s def get_distance_hav(lat0, lng0, lat1, lng1): "用haversine公式计算球面两点间的距离。" lat0 = radians(lat0) lat1 = radians(lat1) lng0 = radians(lng0) lng1 = radians(lng1) dlng = fabs(lng0 - lng1) dlat = fabs(lat0 - lat1) h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng) distance = 2 * EARTH_RADIUS * asin(sqrt(h)) return distance
|