如何在 Python 中尽可能进行飞行路径投影?
How to make a flight path projection if possible in Python?
我有纬度、经度和高度数据,想使用 Python 绘制如下图所示的图。地图可以省略,没有必要。
我试过使用 mplot3d polygon plot tutorial 但无法弄清楚如何使用不同的 x 和 y 值使其不是一条直线。有什么想法吗?
似乎最简单的方法是使用 Google 地球。
现在有两种方法可以解决这个问题。如果你想要一张静态图片,第一种方法很简单。第二种方法允许飞行路径的动画。两者均在此答案中进行了解释。
方法一
使用以下 Python 代码我制作了一个 KML
文件,它允许我创建静态可视化。
f = open('flight.kml', 'w')
#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
f.write("<kml xmlns='http://earth.google.com/kml/2.2'>\n")
f.write("<Document>\n")
f.write("<Placemark>\n")
f.write(" <name>flight</name>\n")
f.write(" <LineString>\n")
f.write(" <extrude>1</extrude>\n")
f.write(" <altitudeMode>absolute</altitudeMode>\n")
f.write(" <coordinates>\n")
for i in range(0,len(data['altitude']),10): #Here I skip some data
f.write(" "+str(data['LON_GPS'][i]) + ","+ str(data['LAT_GPS'][i]) + "," + str(data['altitude'][i]) +"\n")
f.write(" </coordinates>\n")
f.write(" </LineString>\n")
f.write("</Placemark>\n")
f.write("</Document>")
f.write("</kml>\n")
f.close()
代码生成的 KML
文件通常如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<Placemark>
<name>flight</name>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>
54.321976,-4.90948,39232.0
54.320946,-4.90621,39232.0
...
...
52.329865,4.71601,0
52.329693,4.71619,0
</coordinates>
</LineString>
</Placemark>
</Document></kml>
使用上面的代码创建 *.kml
文件后,在 Google Earth 中可以使用 File, Import... Google 然后地球会自动显示您在下面看到的图像。
方法二
我也终于想出了如何为飞行制作动画。我找到的解决方案是将静态答案中的单个 <Placemark>
拆分为多个地标。将 <TimeSpan>
信息添加到每个地标中,然后允许发生动画。为了获得相同的视觉效果,我必须为每个地标设置起始坐标和结束坐标,以便创建合适的 <LineString>
。结果可以查到in this video。该视频是使用 Google 地球
中的 Record a Tour
按钮创建的
f = open(fname+'.kml', 'w')
#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
f.write("<kml xmlns='http://earth.google.com/kml/2.2'>\n")
f.write("<Document>\n")
f.write(" <name>flight</name>\n")
for i in range(1,len(data['altitude'])):
f.write("<Placemark>\n")
f.write(" <TimeSpan>\n <begin>" + '2015-12-02T%02i:%02i:%02iZ' % (data['UTC_HOUR'][i], data['UTC_MIN'][i], data['UTC_SEC'][i]) + "</begin>\n </TimeSpan>\n")
f.write(" <LineString>\n")
f.write(" <extrude>1</extrude>\n")
f.write(" <altitudeMode>absolute</altitudeMode>\n")
f.write(" <coordinates>" +str(data['LON_GPS'][i-1]) + ","+ str(data['LAT_GPS'][i-1]) + "," + str(data['altitude'][i-1]) + " " +str(data['LON_GPS'][i]) + ","+ str(data['LAT_GPS'][i]) + "," + str(data['altitude'][i]) +"</coordinates>\n")
f.write(" </LineString>\n")
f.write("</Placemark>\n")
f.write("</Document>")
f.write("</kml>\n")
f.close()
生成的 KML
文件如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<name>A332_Conventional</name>
<Placemark>
<TimeSpan>
<begin>2015-12-02T08:45:13Z</begin>
</TimeSpan>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>-0.85058,53.338535,39200 -0.81538,53.332012,39200</coordinates>
</LineString>
</Placemark>
...
...
<Placemark>
<TimeSpan>
<begin>2015-12-02T09:27:03Z</begin>
</TimeSpan>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>4.71361,52.331066,0 4.71498,52.330379,0</coordinates>
</LineString>
</Placemark>
</Document></kml>
我有纬度、经度和高度数据,想使用 Python 绘制如下图所示的图。地图可以省略,没有必要。
我试过使用 mplot3d polygon plot tutorial 但无法弄清楚如何使用不同的 x 和 y 值使其不是一条直线。有什么想法吗?
似乎最简单的方法是使用 Google 地球。
现在有两种方法可以解决这个问题。如果你想要一张静态图片,第一种方法很简单。第二种方法允许飞行路径的动画。两者均在此答案中进行了解释。
方法一
使用以下 Python 代码我制作了一个 KML
文件,它允许我创建静态可视化。
f = open('flight.kml', 'w')
#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
f.write("<kml xmlns='http://earth.google.com/kml/2.2'>\n")
f.write("<Document>\n")
f.write("<Placemark>\n")
f.write(" <name>flight</name>\n")
f.write(" <LineString>\n")
f.write(" <extrude>1</extrude>\n")
f.write(" <altitudeMode>absolute</altitudeMode>\n")
f.write(" <coordinates>\n")
for i in range(0,len(data['altitude']),10): #Here I skip some data
f.write(" "+str(data['LON_GPS'][i]) + ","+ str(data['LAT_GPS'][i]) + "," + str(data['altitude'][i]) +"\n")
f.write(" </coordinates>\n")
f.write(" </LineString>\n")
f.write("</Placemark>\n")
f.write("</Document>")
f.write("</kml>\n")
f.close()
代码生成的 KML
文件通常如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<Placemark>
<name>flight</name>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>
54.321976,-4.90948,39232.0
54.320946,-4.90621,39232.0
...
...
52.329865,4.71601,0
52.329693,4.71619,0
</coordinates>
</LineString>
</Placemark>
</Document></kml>
使用上面的代码创建 *.kml
文件后,在 Google Earth 中可以使用 File, Import... Google 然后地球会自动显示您在下面看到的图像。
方法二
我也终于想出了如何为飞行制作动画。我找到的解决方案是将静态答案中的单个 <Placemark>
拆分为多个地标。将 <TimeSpan>
信息添加到每个地标中,然后允许发生动画。为了获得相同的视觉效果,我必须为每个地标设置起始坐标和结束坐标,以便创建合适的 <LineString>
。结果可以查到in this video。该视频是使用 Google 地球
Record a Tour
按钮创建的
f = open(fname+'.kml', 'w')
#Writing the kml file.
f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
f.write("<kml xmlns='http://earth.google.com/kml/2.2'>\n")
f.write("<Document>\n")
f.write(" <name>flight</name>\n")
for i in range(1,len(data['altitude'])):
f.write("<Placemark>\n")
f.write(" <TimeSpan>\n <begin>" + '2015-12-02T%02i:%02i:%02iZ' % (data['UTC_HOUR'][i], data['UTC_MIN'][i], data['UTC_SEC'][i]) + "</begin>\n </TimeSpan>\n")
f.write(" <LineString>\n")
f.write(" <extrude>1</extrude>\n")
f.write(" <altitudeMode>absolute</altitudeMode>\n")
f.write(" <coordinates>" +str(data['LON_GPS'][i-1]) + ","+ str(data['LAT_GPS'][i-1]) + "," + str(data['altitude'][i-1]) + " " +str(data['LON_GPS'][i]) + ","+ str(data['LAT_GPS'][i]) + "," + str(data['altitude'][i]) +"</coordinates>\n")
f.write(" </LineString>\n")
f.write("</Placemark>\n")
f.write("</Document>")
f.write("</kml>\n")
f.close()
生成的 KML
文件如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.2'>
<Document>
<name>A332_Conventional</name>
<Placemark>
<TimeSpan>
<begin>2015-12-02T08:45:13Z</begin>
</TimeSpan>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>-0.85058,53.338535,39200 -0.81538,53.332012,39200</coordinates>
</LineString>
</Placemark>
...
...
<Placemark>
<TimeSpan>
<begin>2015-12-02T09:27:03Z</begin>
</TimeSpan>
<LineString>
<extrude>1</extrude>
<altitudeMode>absolute</altitudeMode>
<coordinates>4.71361,52.331066,0 4.71498,52.330379,0</coordinates>
</LineString>
</Placemark>
</Document></kml>