【问题标题】:Replace coordinates in KML file with python3用python3替换KML文件中的坐标
【发布时间】:2020-12-26 10:58:34
【问题描述】:

我需要替换 KML 文件中的所有坐标:

<coordinates>
24.6206,58.0265,10
24.6218,58.0245,260
24.6234,58.0221,510
24.6257,58.0191,760
</coordinates>

我尝试过这种方式但是root最后是空的:

from pykml import parser
import requests

kmlFile = requests.get('https://predict.habhub.org/kml.php',params=ploadsKml)
root = parser.fromstring(bytes(kmlFile.text, encoding='utf8'))
    
coordinates_before = root.Document.Placemark.LineString.coordinates
string_updated_coordinates="'\\n34.4534,56.5675\\n34.4786,57.1274\\n'"
updated_coordinates = literal_eval(string_updated_coordinates)
coordinates_before._setText(updated_coordinates)
print (root)

但是root是空的。

这里是完整的 kml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Flight Path</name>
<description><![CDATA[Flight data be3aa40 <br>Site: 58.02651, 24.62057 at 14:5 on 26/12/2020]]></description>
<Placemark>
<name>Path</name>
<description>Test v.78</description>
<styleUrl>#yellowPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tesselate>1</tesselate>
<altitudeMode>absolute</altitudeMode>
<coordinates>
24.6206,58.0265,10
24.6218,58.0245,260
24.6234,58.0221,510
24.6257,58.0191,760
</coordinates>
</LineString></Placemark>
<Placemark>
<name>Balloon Launch</name>
<description>GPS TEST 58.0265, 24.6206 </description>
<Point><coordinates>32.6206,78.0265,0</coordinates></Point>
</Placemark>
</Document></kml>

仅需要替换这 4 个坐标,将剩余信息保留在 kml 文件中。

【问题讨论】:

  • Kml 文件是从predict.habhub.org 下载的。我使用原始坐标进行一些计算并生成新坐标。之后,新坐标必须替换原来的坐标。
  • 您的 KML 无效,&lt;Document&gt; &lt;description&gt; 标记包含无效字符(&lt;&gt;)。
  • 我更正了描述标签
  • 是的,我导入解析器和请求
  • 如果要打印root,需要序列化,print(etree.tostring(etree.ElementTree(root), pretty_print=True))

标签: python xml kml pykml


【解决方案1】:

kml 中的命名空间也给我带来了问题。于是我就这样管理了,它行得通,肯定还有其他方法:

root = lxml.html.fromstring(bytes(kmlFile, encoding='utf8'))

ns = {"kml": "http://www.opengis.net/kml/2.2"}

tree  = etree.parse("myfile1.kml")
for simple_data in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:LineString/kml:coordinates", namespaces=ns):  
    simple_data.text=gpsString
    
with open(OUTPUTFILE, 'wb') as f:
    f.write(etree.tostring(tree))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多