我有大约200,000,000个坐标序列,其中一个看起来像这样:
[[30.654508, 104.086337], [30.654878999999998, 104.085479], [30.655219, 104.084691], [30.655027, 104.084949], [30.654555, 104.086073], [30.654078000000002, 104.08710500000001], [30.653726000000002, 104.087848], [30.653376, 104.088552], [30.653190000000002, 104.088975]]
现在我想计算一个序列中每个点之间的半径距离之和,这意味着该轨迹的总长度。
我使用此代码计算两点之间的半径距离:
def cal_haversine(point1, point2):
lat_o,lon_o, lat_d,lon_d = point1[0][0],point1[0][1],point2[0][0],point2[1][1]
sin = math.sin
cos = math.cos
atan2 = math.atan2
sqrt = math.sqrt
lon1,lat1 = lon_o,lat_o
lon2,lat2 = lon_d, lat_d
R=6371000 #metres
phi1=lat1 * (3.1415 / 180)
phi2=lat2 * (3.1415 / 180)
Dphi= phi2 - phi1
Dlambda = (lon2 -lon1) * (3.1415 / 180)
a = sin(Dphi / 2) ** 2 + cos(phi1)*cos(phi2) *sin(Dlambda/2)**2
c = 2 * atan2(sqrt(a),sqrt(1-a))
d = R*c/1000.0 # to kilometer
return d
由于要计算的序列太多,因此使用循环计算所有序列的距离可能会非常慢。
我猜这种计算可能有更快的方法,比如使用矢量化方法。有没有更好的方法?