例如,我可能有这样的一些信息:
<trkpt lat="-33.8161780" lon="150.8710320">
<ele>73.0</ele>
<time>2017-07-08T22:05:45Z</time>
<extensions>
<power>0</power>
<gpxtpx:TrackPointExtension>
<gpxtpx:atemp>7</gpxtpx:atemp>
<gpxtpx:hr>115</gpxtpx:hr>
<gpxtpx:cad>27</gpxtpx:cad>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>
我该如何从这些信息中计算速度呢?我已经使用了python etree模块来解析这个文件,并且把所有的信息都放在了Pandas数据库中。
有人提到我可能应该显示Pandas的数据框,它看起来像这样:
longitude latitude ele temp
time
2017-07-08 22:05:45 150.8710320 -33.8161780 73.0 7
2017-07-08 22:05:46 150.8710350 -33.8161500 73.0 7
2017-07-08 22:05:47 150.8710440 -33.8161170 73.0 7
2017-07-08 22:05:48 150.8710540 -33.8160820 73.0 7
2017-07-08 22:05:49 150.8710690 -33.8160430 73.0 7
等等。
1条答案
按热度按时间gmxoilav1#
speed
等于distance / time
。longitude
和latitude
大概代表地球表面的位置。如果我们接受半径为6371 km的球体作为地球的近似,那么我们可以很容易地将longitude
和latitude
转换为xyz
坐标:现在计算连续点之间的距离并不困难:
然而,这是一个弦长--球体表面上两点之间的直线距离。如果两点相距很远,弦将穿过地球表面。假定运动是在地球表面上进行的。因此,更精确的距离计算将使用arclength:
中心角使用dot product formula。
计算完弧长(距离)后,我们还必须计算连续观测(即数据框的行)之间的
time
间隔:因此,使用
speed = distance / time
:收益率
如果您注解掉
并重新运行脚本,您将看到所有中间计算。您将注意到
df['distance']
非常接近df['arclength']
。由于地球表面上的点相距不远,因此弦长是弧长的一个很好的近似值。因此,对于您发布的数据本来也可以工作得一样好。但是,
arclength
的计算更健壮一点,因为如果点相距较远,它会给出更准确的值。