我有一个网络服务器,其中有一些用于 KML 点的图标。
目前,每个 KML 点都使用图标和标签来引用网络服务器中图像的位置。因此,当在 Google 地球中查看数据时,这些点具有来自网络服务器的自定义图标。
理想情况下,我想导出 KML 数据,以便任何人都可以在 Google 地球中查看它,而无需访问网络服务器。
有没有办法使用pykml将图像嵌入到KML文件中?
如果想要共享 KML 文件中的自定义图像或图标,而无需将这些图像托管在可公开访问的 Web 服务器上,则需要将 KML 和图像打包到 KMZ 文件中。
您可以使用 pykml(或 simplekml)创建一个独立的 KMZ 文件,其中包含 KML 和引用的图标。
from zipfile import ZipFile
from pykml.factory import KML_ElementMaker as KML
from lxml import etree
kml = KML.Placemark(
KML.name("Hello World!"),
KML.Style(
KML.IconStyle(
KML.scale(1.0),
KML.Icon(
KML.href("marker.png")
)
)
),
KML.Point(
KML.coordinates("-64.5253,18.4607")
)
)
# serialize KML to a string
kml = etree.tostring(kml, pretty_print=True, xml_declaration=True, encoding='UTF-8')
# create a ZipFile object
with ZipFile('IconStyle.kmz', 'w') as zipObj:
zipObj.writestr('doc.kml', kml) # Add doc.kml entry
zipObj.write('marker.png') # Add icon to the zip
更新:
Marc Compere 在下面的评论中补充说,simplekml 库也可用于创建 KMZ 文件。事实上,如果在 icon href 中指定本地文件,那么当调用 savekmz() 方法时,它会自动添加到创建的 KMZ 文件中。
在 simplekml 中创建 KMZ 文件的示例。
import simplekml
kml = simplekml.Kml()
pnt = kml.newpoint(name='Hello World!', coords=[(-64.5253, 18.4607)])
pnt.style.iconstyle.icon.href = 'marker.png'
kml.savekmz("test.kmz")