【问题标题】:Google Maps changing placemark icon solely based on styleUrl string syntax谷歌地图仅基于 styleUrl 字符串语法更改地标图标
【发布时间】:2021-05-31 06:23:53
【问题描述】:

我用 python 编写了一个简单的脚本,它使用 simplekml 包将 CSV 文件转换为 KML 文件。它根据我的数据值之一为我的点着色。

我的问题是:我正在尝试使用尽可能小的图标,因为我的地标彼此非常接近。这在样式 ID 为“icon-1739-7CB342”时效果很好,但在样式 ID 为“2”时失败(Google 我的地图呈现下降)

结果是simplekml生成的默认KML不能用小点渲染,因为我无法控制ID。

我的代码:

import simplekml
import pandas
import sys

infile = sys.argv[1]
outfile = infile.split(".")[0]+".kml"


def genkml():
    kml = simplekml.Kml()
    ok = simplekml.Style()
    ok.iconstyle.color = 'ff42b37c'  # Green
    ok.iconstyle.icon.href = 'https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png'
    ok.iconstyle.scale = 1

    rc = simplekml.Style()
    rc.iconstyle.color = 'ff00eaff'  # Yellow
    rc.iconstyle.icon.href = 'https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png'
    rc.iconstyle.scale = 1

    seco = simplekml.Style()
    seco.iconstyle.color = 'ff0051e6'  # Red
    seco.iconstyle.icon.href = 'https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png'
    seco.iconstyle.scale = 1
    
    df = pandas.read_csv(infile)
    cuenta = 1
    for lon, lat, desc in zip(df["longitude"], df["latitude"], df["desc"]):
        nogal = kml.newpoint()
        nogal.name = "Nogal"+"-"+str(cuenta)
        nogal.description = desc.upper()
        nogal.coords = [(lon, lat)]
        if "OK" in nogal.description:
            nogal.style = ok
        if "RC" in nogal.description:
            nogal.style = rc
        if "SECO" in nogal.description:
            nogal.style = seco
        cuenta += 1
    kml.save(outfile)
    print(kml.kml())

if __name__ == "__main__":
    genkml()

我的测试输入文件:

type,date time,latitude,longitude,accuracy(m),altitude(m),geoid_height(m),speed(m/s),bearing(deg),sat_used,sat_inview,name,desc
W,2021-05-30 21:08:27,28.66231833,-100.83812667,1,257.122,-23.722,0.000,,28,33,,Q31 ok
W,2021-05-30 21:11:56,28.66243667,-100.83811000,1,256.922,-23.722,0.000,,26,35,,O32 ok

生成的 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">
        <Style id="2">
            <IconStyle id="3">
                <color>ff42b37c</color>
                <colorMode>normal</colorMode>
                <scale>1</scale>
                <heading>0</heading>
                <Icon id="4">
                    <href>https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                </Icon>
            </IconStyle>
        </Style>
        <Placemark id="12">
            <name>Nogal-1</name>
            <description>Q31 OK</description>
            <styleUrl>#2</styleUrl>
            <Point id="11">
                <coordinates>-100.83812667,28.66231833,0.0</coordinates>
            </Point>
        </Placemark>
        <Placemark id="14">
            <name>Nogal-2</name>
            <description>Q32 OK</description>
            <styleUrl>#2</styleUrl>
            <Point id="13">
                <coordinates>-100.83811,28.66243667,0.0</coordinates>
            </Point>
        </Placemark>
    </Document>
</kml>

修改后的 KML,具有手动添加的样式 (ID = “icon-1739-7CB342”),Nogal-2 呈现为一个小点,Nogal-1 呈现为一个水滴(请注意,唯一的区别样式之间是ID):

<?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">
        <Style id="2">
            <IconStyle>
                <color>ff42b37c</color>
                <scale>1</scale>
                <Icon>
                    <href>https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                </Icon>
            </IconStyle>
        </Style>
        <Style id="icon-1739-7CB342">
            <IconStyle>
                <color>ff42b37c</color>
                <scale>1</scale>
                <Icon>
                    <href>https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
                </Icon>
            </IconStyle>
        </Style>
        <Placemark id="12">
            <name>Nogal-1</name>
            <description>Q31 OK</description>
            <styleUrl>#2</styleUrl>
            <Point id="11">
                <coordinates>-100.83812667,28.66231833,0.0</coordinates>
            </Point>
        </Placemark>
        <Placemark id="14">
            <name>Nogal-2</name>
            <description>Q32 OK</description>
            <styleUrl>#icon-1739-7CB342</styleUrl>
            <Point id="13">
                <coordinates>-100.83811,28.66243667,0.0</coordinates>
            </Point>
        </Placemark>
    </Document>
</kml>

The rendered image by Google My Maps. I would like to use Nogal-2's icon without having to manually add the icon-1739-7CB342 style

【问题讨论】:

  • 也许将 &lt;href&gt; 更改为 https://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png 并将其缩放为更小。
  • 谢谢@geocodezip。这是我在两种情况下都使用的 URL,但图标呈现方式不同。
  • @geocodezip 尽管比例是浮点数,但我尝试了一个数字 image 中的“点”不相比较
  • 意思是在我上面的评论中为“点”网址输入http://www.gstatic.com/mapspro/images/stock/959-wht-circle-blank.png
  • @geocodezip 这会渲染一个圆圈,但没有点那么小(即使我可以使用的最小比例为 0.4 或更低)。不过,这是一个很好的建议。如果 ID 问题没有被揭开神秘面纱,我会使用它。

标签: python kml simplekml


【解决方案1】:

尝试将样式 ID 更改为以字母开头。根据 XML 规范(因此在 KML 中),ID 属性不能以数字开头。如果这不能解决问题,请告诉我们,我可以仔细查看您的 KML。

【讨论】:

  • 嗨@Christiaan,问题是ID是由simplekms确定的。我继续将“2”更改为“icon-2”,结果相同。我的印象是 Google 我的地图会解释 ID,但我还没有找到任何支持该 ID 的文档。在之前的测试中,图标的颜色是由 ID 中的颜色代码而不是颜色属性中的颜色代码呈现的。感谢您的帮助。
  • 您是否确保将所有 ID 更改为不以数字开头,包括文档 ID、地标 ID 和点 ID?我想知道xml解析是否由于ID而部分失败。而且我确定您已经完成了此操作,但请仔细检查您是否更新了 Style 标记和引用它们的 styleUrl 标记中的样式 ID。你能分享一个仍然显示问题的更新 KML 吗?另外,您是否尝试过在 Google 地球专业版中打开 KML,是否显示同样的问题?
  • 嗨@Christiaan,Google 地球专业版以不同的方式显示问题:“icon-2”ID 显示下降,而“icon-1739-7CB342”ID 显示红色方块“X”。可以在here 找到所有ID 以字母开头的更新后的KML。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多