使用python计算从gps轨迹点行进的距离[关闭]
Posted
技术标签:
【中文标题】使用python计算从gps轨迹点行进的距离[关闭]【英文标题】:Calculating distance travelled from gps track points using python [closed] 【发布时间】:2014-05-28 20:06:21 【问题描述】:我有一个非常愚蠢的问题要问。我有这样一段旅程的 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
我只想找到行进的距离:我应该只考虑第一个轨迹点和最后一个轨迹点吗?还是我需要找到每个轨迹点之间的距离?
【问题讨论】:
这个问题似乎是题外话,因为它是关于几何的。 这取决于你。您提到的两个概念是distance and displacement。第一个点和最后一个点之间的长度是位移,每个点之间的长度之和就是距离。 这是有道理的。非常感谢。 【参考方案1】:解析完 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”来保持单位为(公里)。
当然,这些都是假设大圆线。您可能正在旅行某种网络,所以这肯定不准确。
【讨论】:
【参考方案2】:为了估算您拥有的 GPS 跟踪点之间的行进距离,您肯定需要考虑所有连续点之间的距离。更准确地说,如果您有 N 个位置,则需要遍历所有位置并总结每个点 P_i 和 P_i+1 之间的距离(按记录时间排序)。
如果你只计算第一个点和最后一个点之间的距离,结果根本没有任何意义。想象一组 N 个点,这些点在移动代表一个大圆圈的轨道时被记录下来。第一个点和最后一个点几乎相同,因此距离非常小,即使您在圆圈中移动时经过的总距离要大得多。
但是,请注意,将连续点之间的距离相加仍然只是对总行驶距离的估计。根据您的轨道分辨率(即您的轨道位置提交的频率),与实际距离相比,精度可能会有很大差异。
【讨论】:
以上是关于使用python计算从gps轨迹点行进的距离[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
查找表示 GPS 路线的两条线之间的距离(MATLAB、Java、C++ 或 Python)