平面上计算距离比较简单,假设A点(x1,y1),B点(x2,y2),则AB两点之间的距离公式为:
import math
# 计算两点之间的距离
# 输入两个点的坐标,输出距离
def distance(x1, y1, x2, y2):
dis = math.sqrt((x1 - x2) * (x1 - x2) (y1 - y2) * (y1 - y2))
return dis
print(distance(0, 0, 100, 100)) # 141.4213562373095
球面
球面距离公式是计算球面上两点间距离的公式。假设点A (经度角α1,纬度角β1) ;点B (经度角α2,纬度角β2),r为球体半径,则两点之间的距离为:
在假设参考球体为正球体时,可以按照球面距离公式求解两点之间的大地线或大圆(Great Circle)距离。
import math
# 计算两点之间的球面距离
# 输入两个点的经纬度坐标,输出为距离,单位为米
def distance(lon1, lat1, lon2, lat2):
r = 6371000 # 地球平均半径
α1 = math.radians(lon1) # 经度角α1
β1 = math.radians(lat1) # 纬度角β1
α2 = math.radians(lon2) # 经度角α2
β2 = math.radians(lat2) # 纬度角β1
return r * math.acos(math.cos(β1) * math.cos(β2) * math.cos(α1 - α2) math.sin(β1) * math.sin(β2)) # 球面距离公式
print(distance(120, 30, 116, 40)) # 1169754.0702297834
因为球面距离公式中有cos(α1-α2),当两点之间的距离很短时,余弦函数会得出0.99.....的结果,因为四舍五入,会导致较大的误差。Haversine方法进行了某种变换消除了cos(α1-α2),因此可以避免上述问题。
需要说明的是,随着计算机性能的提升,以当前计算机的一般计算精度,这已经不是问题。用计算器可能会有这个问题。
同样地,假设点A (经度角α1,纬度角β1) ,点B (经度角α2,纬度角β2)。Haversine公式如下: