这是使用Haversine公式在Python中计算距离的答案,使用
从纬度/经度点到小弧段的距离。
import numpy as np
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')
def bear( latA,lonA,latB,lonB ):
b= np.arctan2( np.sin(lonB-lonA)*np.cos(latB) , np.cos(latA)*np.sin(latB) - np.sin(latA)*np.cos(latB)*np.cos(lonB-lonA) )
return b
def crossarc( p1, p2, p3 ):
"""
CROSSARC Calculates the shortest distance
between an arc (defined by p1 and p2) and a third point, p3.
Input lat1,lon1,lat2,lon2,lat3,lon3 in degrees.
"""
lat1,lon1 = p1
lat2,lon2 = p2
lat3,lon3 = p3
lat1= np.radians(lat1);
lat2= np.radians(lat2);
lat3= np.radians(lat3);
lon1= np.radians(lon1);
lon2= np.radians(lon2);
lon3= np.radians(lon3);
bear12 = bear(lat1,lon1,lat2,lon2);
bear13 = bear(lat1,lon1,lat3,lon3);
dis13 = dist.pairwise(np.array([[lat1, lon1]]), np.array([[lat3, lon3]]))[0][0]
diff = np.abs(bear13-bear12);
if diff > np.pi:
diff = 2 * np.pi - diff;
if diff > (np.pi/2):
dxa = dis13
else:
dxt = np.arcsin( np.sin(dis13)* np.sin(bear13 - bear12) );
dis12 = dist.pairwise(np.array([[lat1, lon1]]), np.array([[lat2, lon2]]))[0][0]
dis14 = np.arccos( np.cos(dis13) / np.cos(dxt) );
if dis14 > dis12:
dxa = dist.pairwise(np.array([[lat2, lon2]]), np.array([[lat3, lon3]]))[0][0]
else:
dxa = np.abs(dxt);
return dxa
并且我们有
p1 = 48.36736702002282, 11.112351406920268
p2 = 48.36728222003929, 11.112716801718284
p3 = 48.36720362305641, 11.112587917596102
然后,crossarc(p1,p2,p3)
将返回距离(haversine),例如要转换为米,请使用地球半径。
print("Distance in meters: {}".format( 6371000 * crossarc(p1,p2,p3) ))
输出结果为
Distance in meters: 11.390566923942787