更改 KML 中的标签 id 属性 (Simplekml)

问题描述

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

SELECT FName,SName,bookedLessons.bookedHour,bookedLessons.bookedDate,bookedLessons.lesson 
FROM users JOIN bookedLessons 
WHERE  teacherID = 11 
  AND users.userID = (SELECT userID FROM bookedLessons WHERE teacherID = 11)

这将生成以下文档

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

请注意,在某些标签中,id 属性看起来好像是从某个 simplekml 索引生成的。我需要将分配给 <?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 更改为 <Style id="5">

这会更改 Google 我的地图上的图标。如何使用 simplekml 执行此操作?

解决方法

在(入门)文档中,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</coordinates>
            </Point>
        </Placemark>
    </Document>
</kml>

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...