Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果没有给出速度标记本身,如何从gpx文件计算速度?_Python_Algorithm_Pandas_Gpx - Fatal编程技术网

Python 如果没有给出速度标记本身,如何从gpx文件计算速度?

Python 如果没有给出速度标记本身,如何从gpx文件计算速度?,python,algorithm,pandas,gpx,Python,Algorithm,Pandas,Gpx,例如,我可能有如下信息: <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>

例如,我可能有如下信息:

<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>
                     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
以此类推。

速度等于距离/时间。经度和纬度大概代表地球表面的位置。如果我们接受半径为6371 km的球体作为地球的近似值,那么我们可以轻松地将经度和纬度转换为xyz坐标:

r = 6371000 # meters
df['theta'] = np.deg2rad(df['longitude'])
df['phi'] = np.deg2rad(df['latitude'])
df['x'] = r*np.cos(df['theta'])*np.sin(df['phi'])
df['y'] = r*np.sin(df['theta'])*np.sin(df['phi'])
df['z'] = r*np.cos(df['phi'])
现在不难计算连续点之间的距离:

df['x2'] = df['x'].shift()
df['y2'] = df['y'].shift()
df['z2'] = df['z'].shift()
df['distance'] = np.sqrt((df['x2']-df['x'])**2 + (df['y2']-df['y'])**2 + (df['z2']-df['z'])**2)
但是,这是弦长-球体表面上两点之间的直线距离。如果两个点相距很远,弦就会穿过地球表面。大概是在地球表面运动。因此,更精确的距离计算将使用:

中心角度使用的是

计算完弧长距离后,我们现在还必须计算连续观测之间的时间间隔,即数据帧的行:

df['time'] = (df.index.to_series().diff() / pd.Timedelta(seconds=1))
因此,使用速度=距离/时间:

屈服

                      ele   latitude   longitude  temp     speed
time                                                            
2017-07-08 22:05:45  73.0 -33.816178  150.871032     7       NaN
2017-07-08 22:05:46  73.0 -33.816150  150.871035     7  3.119892
2017-07-08 22:05:47  73.0 -33.816117  150.871044     7  3.712201
2017-07-08 22:05:48  73.0 -33.816082  150.871054     7  3.940673
2017-07-08 22:05:49  73.0 -33.816043  150.871069     7  4.433590
如果你不加评论的话

df = df[columns + ['speed']]
然后重新运行脚本,您将看到所有中间计算。你会 注意,df['distance']与df['arclength']非常接近。自从 点在地球表面相距不远,弦长为 弧长的良好近似值。那么你发布的数据呢

df['speed'] = df['distance'] / df['time'] 
也会起到同样的作用。但是,弧长计算有点复杂 更稳健,因为如果点距离较远,它将提供更准确的值
分开。

给定两个时空坐标,您可以计算平均速度。因为您已经将XML解析为数据帧,如果您将数据帧作为起点,我们可能会更容易显示计算结果。您只需取两个相邻的数据点,计算它们之间的距离,然后除以时差,对吗?
                      ele   latitude   longitude  temp     speed
time                                                            
2017-07-08 22:05:45  73.0 -33.816178  150.871032     7       NaN
2017-07-08 22:05:46  73.0 -33.816150  150.871035     7  3.119892
2017-07-08 22:05:47  73.0 -33.816117  150.871044     7  3.712201
2017-07-08 22:05:48  73.0 -33.816082  150.871054     7  3.940673
2017-07-08 22:05:49  73.0 -33.816043  150.871069     7  4.433590
df = df[columns + ['speed']]
df['speed'] = df['distance'] / df['time']