Google Maps API v3中如何动态更改KML多边形的颜色

4
我正在使用Google Maps v3 API加载KML图层,想要在不编辑KML文件本身的情况下改变KML的颜色,是否可以使用JavaScript或其他方式实现?
很遗憾,我无法发布链接,但这是相当标准的内容。
var map = new google.maps.Map(document.getElementById("mymap"), { some options });
var regionLayer = new google.maps.KmlLayer("http://.../some.kml");
regionLayer.setMap(map);

你能分享一下你的代码吗?或者给个链接,这样我们就可以看到它的运行情况,更好地了解如何解决问题? - Trott
相关 https://stackoverflow.com/questions/36446124/interactive-change-of-kml-polygons-style-in-google-maps - Michael
2个回答

2
据我理解文档,“不行”,但并不是特别清楚。我正在尝试做类似的事情(但更新mouseover/mouseout的颜色)。
KML文件由Google服务器加载,解析并发送给您的JavaScript对象以应用于地图,因此当您的JavaScript KMLLayer看到它时,它已经全部排好序了。
您可以尝试使用样式和styleUrl。这应该允许您设置多种不同的样式,然后在运行时应用,但是我还没有使其工作。

这个问题有任何进展吗?据我所知,kml叠加层包含普通的谷歌地图多边形或线条对象。一定有办法可以访问它们。在v3地图中,点击事件会为所点击的对象提供一个随机ID。类似于id:“g37a571f194fd2a75” - RubbelDeCatc

1
我通过创建一个 Web 服务来完成这个任务,该服务将 KML 文件读入字符串,将样式部分插入到 KML 字符串的开头,并为每个唯一命名的地标添加 styleURL。使用 .net Web 服务修改标记非常简单,并将其写回托管 Web 服务的服务器。
例如,这里使用了一个包含地标 ID 和颜色标志的类:
    public string KMLStyler(string URL, string URLName, Data[] MyData)
    {
        try
        {
            ReadFile(URL);

            string NewKML = ReadFile(URL);

            string RedStyle = "<Style id=\"red\"><LineStyle><color>7F7F7F7F</color><width>2</width></LineStyle><PolyStyle><color>7F0000FF</color><fill>1</fill><outline>1</outline></PolyStyle></Style>";
            string BlackStyle = "<Style id=\"black\"><LineStyle><color>7F7F7F7F</color><width>2</width></LineStyle><PolyStyle><color>7F7F7F7F</color><fill>1</fill><outline>1</outline></PolyStyle></Style>";
            string GreenStyle = "<Style id=\"green\"><LineStyle><color>7F7F7F7F</color><width>2</width></LineStyle><PolyStyle><color>7F00FF00</color><fill>1</fill><outline>1</outline></PolyStyle></Style>";
            string BlueStyle = "<Style id=\"blue\"><LineStyle><color>7F7F7F7F</color><width>2</width></LineStyle><PolyStyle><color>7F7F7F7F</color><fill>1</fill><outline>1</outline></PolyStyle></Style>";


            //add styles to top
            int EndID = 0;
            EndID = NewKML.IndexOf("</name>") + 7;
            NewKML = NewKML.Insert(EndID, RedStyle);

            EndID = NewKML.IndexOf("</name>") + 7;
            NewKML = NewKML.Insert(EndID, BlackStyle);

            EndID = NewKML.IndexOf("</name>") + 7;
            NewKML = NewKML.Insert(EndID, GreenStyle);

            EndID = NewKML.IndexOf("</name>") + 7;
            NewKML = NewKML.Insert(EndID, BlueStyle);

            //add each style to each placemark


            foreach (Data MyDataSingle in MyData)
            {
                int NamePos = NewKML.IndexOf(MyDataSingle.Name);

                if (NamePos == -1) throw new Exception("Did not find '" + MyDataSingle.Name + "' within File");
                NamePos += MyDataSingle.Name.Length + 7;

                int MultiGeometryStartPos = NewKML.IndexOf("<MultiGeometry>", NamePos);
                int MultiGeometryEndPos = NewKML.IndexOf("</MultiGeometry>", NamePos);
                int PolygonStartPos = NewKML.IndexOf("<Polygon>", NamePos);

                int InsertPos = 0;
                if (MultiGeometryStartPos < PolygonStartPos)
                {
                    if (MultiGeometryStartPos != -1)
                    {
                        InsertPos = MultiGeometryStartPos;
                    }
                    else
                    {
                        InsertPos = PolygonStartPos;
                    }
                }
                else
                {
                    InsertPos = PolygonStartPos;
                }

                if (MyDataSingle.Red)
                {
                    NewKML = NewKML.Insert(InsertPos, "<styleUrl>#red</styleUrl>");
                }
                if (MyDataSingle.Black)
                {
                    NewKML = NewKML.Insert(InsertPos, "<styleUrl>#black</styleUrl>");
                }
                if (MyDataSingle.Green)
                {
                    NewKML = NewKML.Insert(InsertPos, "<styleUrl>#green</styleUrl>");
                }
                if (MyDataSingle.Blue)
                {
                    NewKML = NewKML.Insert(InsertPos, "<styleUrl>#blue</styleUrl>");
                }
            }

            string NewFileName = WriteFile(NewKML, URLName);

            return NewFileName;
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }
    }

    public string WriteFile(string KMLData, string URLName)
    {
        string FileName = "http:\\blah.co.uk\blah.kml";
        StreamWriter writer = new StreamWriter("C:/inetpub/blah.kml");

        writer.Write(KMLData);
        writer.Flush();
        writer.Close();

        return FileName;
    }

    public string ReadFile(string URL)
    {
        string File = "";
        StreamReader reader = new StreamReader(WebRequest.Create(URL).GetResponse().GetResponseStream());
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            File += line;
        }

        return File;
    }

这不是动态的,你不想在每次鼠标悬停时重新加载整个数据。 - RubbelDeCatc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接