【问题标题】:Change the tag id attribute in KML (Simplekml)更改 KML 中的标签 id 属性 (Simplekml)
【发布时间】:2021-07-23 06:42:15
【问题描述】:

simplekml 中是否可以更改标签中的 id 属性?

import simplekml
kml = simplekml.Kml()
pnt = kml.newpoint(name='A Point')
pnt.coords = [(1.0, 2.0)]
kml.save("icon.kml")

这将生成以下文档

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
    <Document id="1">
        <Folder id="2">
            <Style id="5">
                <IconStyle id="6">
                    <colorMode>normal</colorMode>
                    <scale>1</scale>
                    <heading>0</heading>
                    <Icon id="7">
                        <href>https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                    </Icon>
                </IconStyle>
            </Style>
            <Placemark id="4">
                <name>A Point</name>
                <styleUrl>#5</styleUrl>
                <Point id="3">
                    <coordinates>1.0,2.0,0.0</coordinates>
                </Point>
            </Placemark>
        </Folder>
    </Document>
</kml>

请注意,在某些标签中,id 属性看起来好像是从某个 simplekml 索引生成的。我需要将分配给&lt;Style id="5"&gt; 标签的ID 更改为&lt;Style id="icon-1532-0288D1-nodesc-normal"&gt;

这将更改“Google 我的地图”上的图标。如何使用 simplekml 做到这一点?

【问题讨论】:

    标签: python simplekml


    【解决方案1】:

    看起来在(入门)文档https://simplekml.readthedocs.io/en/latest/gettingstarted.html 中,针对不同类型的对象生成的 id 标签不同,即“feat_1”、“feat_2”、“geom_0”:

    import simplekml
    kml = simplekml.Kml()
    pnt = kml.newpoint(name="A Point")
    print kml.kml()
    

    这是生成的:

    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
        <Document id="feat_1">
            <Placemark id="feat_2">
                <name>A Point</name>
                <Point id="geom_0">
                    <coordinates>0.0, 0.0, 0.0</coordinates>
                </Point>
            </Placemark>
        </Document>
    </kml>
    

    我查看了源代码,看起来至少在 1.3.2 版本中,他们摆脱了这一点,并通过计数来生成标签 ID。

    class Kmlable(object):
        """Enables a subclass to be converted into KML."""
        _globalid = 0
        _currentroot = None
        _compiling = False
        _namespaces = ['xmlns="http://www.opengis.net/kml/2.2"', 'xmlns:gx="http://www.google.com/kml/ext/2.2"']
        
        def __init__(self):
            self._id = str(Kmlable._globalid)
            Kmlable._globalid += 1
            try:
                from collections import OrderedDict
                self._kml = OrderedDict()
            except ImportError:
                self._kml = {}
    

    出于某种原因,这些 id 标签被设计为只读:

        @property
        def id(self):
            """The id string (read only)."""
            return self._id
    

    你可以改变它的一种 hack-y 方式是(在 base.py 中):

    class Kmlable(object):
        """Enables a subclass to be converted into KML."""
        #_globalid = 0
        _globalid = 'your_string_here'
        _currentroot = None
        _compiling = False
        _namespaces = ['xmlns="http://www.opengis.net/kml/2.2"', 'xmlns:gx="http://www.google.com/kml/ext/2.2"']
        
        def __init__(self):
            self._id = str(Kmlable._globalid)
            #Kmlable._globalid += 1
            try:
                from collections import OrderedDict
                self._kml = OrderedDict()
            except ImportError:
                self._kml = {}
    

    但这会为您的 kml 文档中的每个对象设置相同的 id:

    import simplekml
    kml = simplekml.Kml()
    pnt = kml.newpoint(name="A Point")
    print(kml.kml())
    
    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
        <Document id="your_string_here">
            <Placemark id="your_string_here">
                <name>A Point</name>
                <Point id="your_string_here">
                    <coordinates>0.0, 0.0, 0.0</coordinates>
                </Point>
            </Placemark>
        </Document>
    </kml>
    

    希望这有助于您的理解。不是一个完整的答案,但是太长了,无法在 cmets 中发布。

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多