正矢、半正矢等三角函数,在现有教育体系内从没有涉及到,理解起来相对困难一些。下面的代码将计算地球表面两点距离的半正矢公式翻译成可用numpy的三角函数计算的函数。另外,我有一个更容易理解的思路,希望对题主有帮助:
import numpy as np
def haversine(p1, p2, r=6371):
lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2))
dlat, dlon = lat2 - lat1, lon2 - lon1
a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2
c = 2 * np.arcsin(np.sqrt(a))
return c * r
def get_arc(p1, p2, r=6371):
lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2))
x1, y1, z1 = r*np.cos(lat1)*np.cos(lon1), r*np.cos(lat1)*np.sin(lon1), r*np.sin(lat1)
x2, y2, z2 = r*np.cos(lat2)*np.cos(lon2), r*np.cos(lat2)*np.sin(lon2), r*np.sin(lat2)
theta = np.arccos(np.dot((x1,y1,z1),(x2,y2,z2))/(r*r))
return theta * r
西安 = (34.260958, 108.942369)
莫斯科 = (55.755825, 37.617298)
haversine(西安, 莫斯科)
5793.22364495678
get_arc(西安, 莫斯科)
5793.223644956781