使用Python计算GPS轨迹点之间的行驶距离
我有一个很简单的问题想问。我的旅程中有一些GPS轨迹点,像这样:
863.3,2013-10-05T01:21:07Z,0,13.348841,77.686539
863.3,2013-10-05T01:21:08Z,1,13.348841,77.686539
863.3,2013-10-05T01:21:23Z,2,13.348708,77.686248
861.1,2013-10-05T01:21:28Z,3,13.348647,77.686088
867.0,2013-10-05T01:29:03Z,4,13.34732,77.682364
我想知道的就是旅行的总距离:我只需要考虑第一个轨迹点和最后一个轨迹点吗?还是说我需要计算每一个轨迹点之间的距离?
2 个回答
1
为了估算你在GPS轨迹点之间行驶的距离,你需要考虑所有连续点之间的距离。更具体地说,如果你有N个位置,你需要遍历所有的位置,并把每个点P_i和下一个点P_i+1之间的距离加起来(按照记录的时间顺序)。
如果你只计算第一个点和最后一个点之间的距离,那结果就没有任何意义。想象一下,有N个点是在你沿着一条大圆圈移动时记录下来的。第一个点和最后一个点几乎是一样的,所以计算出来的距离会非常小,尽管你在圆圈里移动的总距离要大得多。
不过,要注意的是,连续点之间的距离相加仍然只是对总行驶距离的一个估算。根据你的轨迹的分辨率(也就是记录位置的频率),与实际距离相比,准确性可能会有很大差异。
3
一旦你解析了你的GPS点,你需要提取每个点的经纬度。你可以使用下面这个公式,改编自这里,来计算每对点之间的距离,然后把这些距离加起来,得到总距离。
import math
def getDistance(lat1,lon1,lat2,lon2):
# This uses the haversine formula, which remains a good numberical computation,
# even at small distances, unlike the Shperical Law of Cosines.
# This method has ~0.3% error built in.
R = 6371 # Radius of Earth in km
dLat = math.radians(float(lat2) - float(lat1))
dLon = math.radians(float(lon2) - float(lon1))
lat1 = math.radians(float(lat1))
lat2 = math.radians(float(lat2))
a = math.sin(dLat/2) * math.sin(dLat/2) + \
math.cos(lat1) * math.cos(lat2) * math.sin(dLon/2) * math.sin(dLon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = R * c * 0.621371 # Converting km to miles with "* 0.621371"
return d
需要注意的是,这个函数返回的距离是以英里为单位的,但如果你想用公里来表示,只需要把最后的“* 0.621371”去掉就可以了。
当然,这个计算是基于大圆航线的假设。实际上,你可能是在某种网络上旅行,所以这个计算结果在现实中可能并不完全准确。