使用python计算从gps跟踪点行进的距离

时间:2014-05-28 20:06:22

标签: python time gps distance haversine

我有这个非常愚蠢的问题要问。我有这样的旅程的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 个答案:

答案 0 :(得分:2)

解析gps点后,需要提取每个点的纬度/经度点。您可以使用从here改编的以下公式来获取每对点之间的距离,并将它们与总距离相加。

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"从最后开始。

当然,这些假设是很好的圆圈线。你可能正在旅行某种网络,所以这肯定不是真实的世界。

答案 1 :(得分:1)

为了估算您拥有的GPS轨迹点之间的行进距离,您肯定需要考虑所有连续点之间的距离。更准确地说,如果你有N个位置,你需要迭代你拥有的所有位置,并总结每个点P_i和P_i + 1之间的距离(按记录时间排序)。

如果你只计算第一个和最后一个点之间的距离,结果就没有任何意义了。想象一下在移动代表大圆的轨道时记录的一组N个点。第一点和最后一点几乎相同,因此导致距离非常小,即使您在圆圈中移动时的总距离明显更大。

但是,请注意,总计连续点之间的距离仍然只是对行进总距离的估计。根据您的曲目的分辨率(即,提交曲目位置的频率),与实际距离相比的准确度可能会有很大差异。