当前位置: 首页 > 知识库问答 >
问题:

Python从包含多个位置标记的KML文件中提取数据

干高歌
2023-03-14

我有一个KML文件如下:

<?xml version="1.0"?><kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>MST =T</name>
<description><![CDATA[<p>KML test file</p>
<p>This is a test version.</p>]]></description>
<Style id="spstyle5">
    <IconStyle>
        <color>ff3EE23E</color>
        <Icon><href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href></Icon>
    </IconStyle>
    <LineStyle>
        <color>ff3EE23E</color>
        <width>4</width>
    </LineStyle>
</Style>
<Folder>
    <name>Track5</name>
    <visibility>0</visibility>
            <name>sp5_sp6_ Track</name>
            <description><![CDATA[<i>sp5_sp6_</i> track<br>pantrack id:5]]></description>
            <Placemark>
                <name>sp5_sp6_ MST</name>
                <description><![CDATA[<i> species sp5_sp6_</i> mst<br>long= 648.000 corte 0.250000]]></description>
                <styleUrl>#spstyle5</styleUrl>
                <MultiGeometry>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            8.000,8.000 6.000,7.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            5.000,7.000 6.000,7.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            3.000,8.000 5.000,7.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            2.000,8.000 3.000,8.000
                        </coordinates>
                    </LineString>
                </MultiGeometry>
            </Placemark>
</Folder>
<Style id="spstyle7">
    <IconStyle>
        <color>ffBC77DC</color>
        <Icon><href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href></Icon>
    </IconStyle>
    <LineStyle>
        <color>ffBC77DC</color>
        <width>4</width>
    </LineStyle>
</Style>
<Folder>
    <name>Track7</name>
    <visibility>0</visibility>
            <name>sp1_sp2_sp6_ Track</name>
            <description><![CDATA[<i>sp1_sp2_sp6_</i> track<br>pantrack id:7]]></description>
            <Placemark>
                <name>sp1_sp2_sp6_ MST</name>
                <description><![CDATA[<i> species sp1_sp2_sp6_</i> mst<br>long= 441.000 corte 0.250000]]></description>
                <styleUrl>#spstyle7</styleUrl>
                <MultiGeometry>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            11.000,6.000 12.000,6.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            12.000,6.000 12.000,4.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            12.000,4.000 11.000,3.000
                        </coordinates>
                    </LineString>
                </MultiGeometry>
            </Placemark>
</Folder>
<Style id="spstyle8">
    <IconStyle>
        <color>ff97287A</color>
        <Icon><href>http://maps.google.com/mapfiles/kml/paddle/wht-blank.png</href></Icon>
    </IconStyle>
    <LineStyle>
        <color>ff97287A</color>
        <width>4</width>
    </LineStyle>
</Style>
<Folder>
    <name>Track8</name>
    <visibility>0</visibility>
            <name>sp3_sp6_sp4_sp6_ Track</name>
            <description><![CDATA[<i>sp3_sp6_sp4_sp6_</i> track<br>pantrack id:8]]></description>
            <Placemark>
                <name>sp3_sp6_sp4_sp6_ MST</name>
                <description><![CDATA[<i> species sp3_sp6_sp4_sp6_</i> mst<br>long= 757.000 corte 0.250000]]></description>
                <styleUrl>#spstyle8</styleUrl>
                <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>
                            11.000,6.000 11.000,5.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            11.000,6.000 12.000,6.000
                        </coordinates>
                    </LineString>
            <LineString>
                        <tessellate>true</tessellate>
                        <altitudeMode>clampToGround</altitudeMode>
                        <coordinates>
                            11.000,5.000 12.000,4.000
                        </coordinates>
                    </LineString>
                </MultiGeometry>
            </Placemark>
</Folder>

</Document>
</kml>

我想分别提取每个placemark的名称以及与该placemark关联的LineString标记中的所有坐标,结果如下:

Placemark A 
x, y
x, y
x, y
...
Placemark B
x, y
x, y
x, y

我已经尝试了这里提出的所有解决方案,但没有一个适合我的数据。事实上,那里的所有解决方案都是高度通用的,并且没有提供用于检查它们的测试数据。

更新:我在下面的代码中取得了一些进展,它允许提取所有的位置标记和线性坐标(我只是忘记了该死的命名空间):

from pykml import parser

filename = "output0.kml"
with open(filename) as f:
    root = parser.parse(f).getroot()
    pms = root.findall('.//{http://earth.google.com/kml/2.1}Placemark')
    lst = doc.findall('.//{http://earth.google.com/kml/2.1}LineString')

for pm in pms:
    print(pm.name)
for ls in lst:
    print(ls.coordinates)

但是仍然不知道如何提取按placemark分组的坐标!

共有1个答案

阎裕
2023-03-14

只需为循环嵌套,其中内部解析工作脱离外部解析元素。此外,您还可以使用内置的etree模块,因为kml是xml文件。

import xml.etree.ElementTree as et

doc = et.parse("source.kml")

nmsp = '{http://earth.google.com/kml/2.1}'

for pm in doc.iterfind('.//{0}Placemark'.format(nmsp)):
    print(pm.find('{0}name'.format(nmsp)).text)

    for ls in pm.iterfind('{0}MultiGeometry/{0}LineString/{0}coordinates'.format(nmsp)):
        print(ls.text.strip().replace('\n',''))

# sp5_sp6_ MST
# 8.000,8.000 6.000,7.000
# 5.000,7.000 6.000,7.000
# 3.000,8.000 5.000,7.000
# 2.000,8.000 3.000,8.000
# sp1_sp2_sp6_ MST
# 11.000,6.000 12.000,6.000
# 12.000,6.000 12.000,4.000
# 12.000,4.000 11.000,3.000
# sp3_sp6_sp4_sp6_ MST
# 8.000,8.000 8.000,7.000
# 8.000,7.000 11.000,6.000
# 11.000,6.000 11.000,5.000
# 11.000,6.000 12.000,6.000
# 11.000,5.000 12.000,4.000

 类似资料:
  • 问题内容: 我已将一些地址上传到BatchGeo,并下载了要从中提取坐标的结果KML文件。我设法在这里在线整理了混乱的文本文件,但是我不知道如何解析它以提取坐标。 似乎有几个适用于python的kml库,但在文档方面却没有太多(例如pyKML)。通过本教程,我已经了解了这一点,并创建了一个’lxml.etree._ElementTree’对象,但不确定其属性: 这给出了错误: 那么如何获取坐标列表

  • 我想从. kml文件中提取值,以便使用R进行描述。 文件如下: 这是我想提取的,包含在 即。: xmlToList给我,我认为NULL,因为CDATA标记意味着以下内容不被解析器处理: 我认为这就是所谓的“CDATA这个术语是用来描述XML解析器不应该解析的文本数据……解析器会忽略CDATA节中的所有内容。CDATA节以“”开头 以下内容对我也不起作用,也许是出于与CDATA相关的同样原因: 有人

  • 我想使用R从一个数组中读取“when”值。由Google My tracks创建的kml文件(摘录如下): 节点“when”是“与位置相对应的时间值(在gx:coord元素中指定)”。“gx:coord”是“由经度、纬度和高度三个值组成的坐标值”。(https://developers.google.com/kml/documentation/kmlreference#gxtrack) 我想要的值

  • 我想摘录: 图像标记和 类数据内的锚标记文本 我成功地提取了img src,但从锚标记中提取文本时遇到了问题。 这是整个HTML页面的链接。 这是我的代码: 我试图做的是提取图像src(link)和div class=data中的标题,例如: 应提取: 尼康COOLPIX L26 16.1 MP数码相机,配备5倍变焦NIKKOR玻璃镜头和3英寸LCD(红色)

  • 我有一个文件。 使用Pandas,从这个文件中获得两个DataFrame和的最佳策略是什么? 输入如下所示: 到目前为止,我想到的最好的方法是转换这个文件转换为Excel工作簿(),将表格拆分为工作表并使用: 然而: 这种方法需要模块。 这些日志文件必须被实时分析,这样就可以更好地找到一种方法来分析它们,因为它们来自日志。 真正的日志比那两个有更多的表。

  • 问题内容: 我试图提取具有特定文本文件之间的文本: 然后将其转储到文本文件中,以便 谢谢您的帮助。 问题答案: 这对我来说足够好了。您的样本数据在一个名为“ data.txt”的文件中,输出将进入“ result.txt”