【问题标题】:How to make a flight path projection if possible in Python?如果可能,如何在 Python 中进行飞行路径投影?
【发布时间】:2016-11-25 05:07:40
【问题描述】:

我有纬度、经度和高度数据,并想使用 Python 绘制如下图所示的图。地图可以省略,没必要。

我尝试使用mplot3d polygon plot tutorial,但不知道如何设置不同的 x 和 y 值,使其不是一条直线。有什么想法吗?

【问题讨论】:

    标签: python animation 3d kml altitude


    【解决方案1】:

    似乎最简单的方法是使用 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 地球中,您可以使用文件、导入...简单地导入它,然后 Google 地球会自动显示您在下面看到的图像。

    方法二

    我也终于想出了如何为飞行设置动画。我找到的解决方案是将单个&lt;Placemark&gt; 从静态答案中拆分为多个地标。将&lt;TimeSpan&gt; 信息添加到每个地标然后允许动画发生。为了获得相同的视觉效果,我必须为每个地标设置起始坐标和结束坐标,以便创建正确的&lt;LineString&gt;。结果可以在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>
    

    【讨论】:

    • 我建议编辑您以前的答案以包含其他信息,而不是创建新答案。
    • @MichaelMolter 感谢您的提示。我现在已将两个答案合并为一个
    猜你喜欢
    • 2019-03-25
    • 2020-01-26
    • 1970-01-01
    • 2014-12-11
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多