【问题标题】:Dynamically change colour of KML polygon in Google Maps API v3在 Google Maps API v3 中动态更改 KML 多边形的颜色
【发布时间】:2011-08-24 22:27:17
【问题描述】:

我正在使用 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);干杯,尼尔

标签: google-maps-api-3 kml


【解决方案1】:

根据我对文档的理解,“不”,但不是特别清楚。我正在尝试做类似的事情(但更新 mouseover/mouseout 的颜色)。

KML 文件由 Google 服务器加载、解析并发送到您的 javascript 对象以应用于地图,因此,当您的 javascript KMLLayer 看到它时,一切都已整理完毕。

您可以使用 Styles 和 styleUrl 做一些事情。这应该允许您设置许多不同的样式,然后可以在运行时应用,但是,我还没有让它工作。

【讨论】:

  • 有关于这个问题的消息吗?据我所知,kml 覆盖内容是普通的谷歌地图多边形或线对象。必须有一种访问 em 的方法。在地图 v3 中,点击事件为被点击的对象提供了一个随机 ID。类似 id:"g37a571f194fd2a75"
【解决方案2】:

我通过创建一个 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;
    }

【讨论】:

  • 这不是动态的,您不想在每次鼠标悬停时重新加载整个数据。
猜你喜欢
  • 2016-01-02
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多