【问题标题】:How to get a list of coordinates from a KML file in Python如何从 Python 中的 KML 文件中获取坐标列表
【发布时间】:2017-08-24 13:39:55
【问题描述】:

我有一个具有以下结构的 KML 文件:

<?xml version="1.0"?><kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Test KML</name>
<description><![CDATA[<p>This is a test version.</p>]]></description>
<Style id="spstyle7">
    <IconStyle>
        <color>ff4DF6D8</color>
        <Icon><href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href></Icon>
    </IconStyle>
    <LineStyle>
        <color>ff4DF6D8</color>
        <width>4</width>
    </LineStyle>
</Style>
<Folder>
    <name>Track1</name>
    <visibility>0</visibility>
            <name>Test1</name>
            <description><![CDATA[test1]]></description>
            <Placemark>
                <name>test1</name>
                <description><![CDATA[test1]]></description>
                <MultiGeometry>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            11.000,4.000 11.000,3.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            11.000,4.000 12.000,4.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            12.000,5.000 12.000,4.000
                        </coordinates>
                    </LineString>
                </MultiGeometry>
            </Placemark>
</Folder>
<Style id="spstyle7">
    <IconStyle>
        <color>ff4DF6D8</color>
        <Icon><href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href></Icon>
    </IconStyle>
    <LineStyle>
        <color>ff4DF6D8</color>
        <width>4</width>
    </LineStyle>
</Style>
<Folder>
    <name>Track2</name>
    <visibility>0</visibility>
            <name>Test2</name>
            <description><![CDATA[test2]]></description>
            <Placemark>
                <name>test2</name>
                <description><![CDATA[test2]]></description>
                <MultiGeometry>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            8.000,8.000 8.000,7.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            8.000,7.000 11.000,6.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            9.000,1.000 10.000,1.000
                        </coordinates>
                    </LineString>
                </MultiGeometry>
            </Placemark>
</Folder>
</Document>
</kml>

我想获取 coordinates 标记内的所有坐标,将其放入列表或列表列表(每个文件夹一个)。

一开始,我写了以下代码:

import xml.etree.ElementTree as ET
tree = ET.parse("test.kml")
root = tree.getroot()
results = root.findall('Folder')
textnumbers = [r.find('Placemark/LineString/coordinates').text for r in results]
print textnumbers

但它返回一个空列表。如果我尝试仅获取 Folder 名称,请使用以下代码:

for folder in root.findall('Folder'):
    name = folder.find('name')
    print name

我也得到一个空字符串。为什么解析器找不到 Folder 标签?有什么提示吗?

提前感谢您提供的任何帮助。

【问题讨论】:

  • @Wondercricket ...这是不明智的。不必为 XML 解析删除命名空间。
  • 我看不到命名空间与我的问题有什么关系。
  • 这正是你的问题,因为你有一个带有未声明前缀的命名空间,但不用于解析,因此没有结果!
  • 当然,我没有注意它。谢谢!
  • 您是否从文档中删除了命名空间?如果有命名空间,您可以轻松读取 XML

标签: python kml


【解决方案1】:

其实我在这里找到了一个很好的解决方案:https://gis.stackexchange.com/questions/89543/get-points-from-a-kml-linestring

相应地修改我的代码:

import xml.etree.ElementTree as ET
tree = ET.parse("test.kml")
root = tree.getroot()

lineStrings = tree.findall('.//{http://earth.google.com/kml/2.1}LineString')

for attributes in lineStrings:
    for subAttribute in attributes:
        if subAttribute.tag == '{http://earth.google.com/kml/2.1}coordinates':
            print subAttribute.tag, subAttribute.text

我已经能够检索到所有坐标数据。

其他可能的解决方案(未测试)也可以在这里找到:https://programmingadvent.blogspot.com.br/2013/06/kmzkml-file-parsing-with-python.html 和这里:http://gsp.humboldt.edu/olm_2016/courses/GSP_318/04_3_2_Parsing_XML.html

最好的问候,

【讨论】:

  • 尽管您抓取了代码并找到了答案。真正的问题是您需要明确声明命名空间 (xmlns),就像在大括号 {...} 中所做的那样,如 docs 所示。此外,您没有使用双 .// XML 运算符解析到 LineString 节点以获取所有 坐标
  • 冻糕,我不明白。上面的代码实际上得到了“坐标”标签内的所有坐标,这就是我想要的。它在大括号内显式声明了命名空间。
  • @maurobio 我添加了一个可以解决您的问题的答案。看看它。谢谢。
  • 这个解决方案并不优雅,但至少它提供了一种无需安装任何库即可在 KML 文件中导航和提取内容的方法。如果你知道相关的标签,你可以得到任何你想要的东西,它只会产生混乱的代码。仍然为我工作并节省了我一些时间。
【解决方案2】:

您的根是 kml 节点而不是您假设的 Document 节点

当你执行tree.getroot() 时,你会抓住kml 节点。在这种情况下,如果您只是将代码更改为包含 Document 作为 root 的子节点,它应该可以工作。

其实只有一行要改的应该是这样的:

result = root.findall('Document/Folder')

【讨论】:

  • 谢谢,但不幸的是它不起作用。我仍然有一个空列表。
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多