2011-05-13 4 views
3

Google지도 v3 API를 사용하여 KML 레이어를로드하고 KML 파일을 편집하지 않고 KML 색상을 기본 파란색에서 변경할 수 있기를 원합니다. 그 자체. 자바 스크립트 또는 다른 방법을 사용하여이 작업을 수행 할 수 있습니까?Google지도 API 버전 3에서 KML 다각형의 색상을 동적으로 변경합니다.

감사합니다, 닐 문서, '아니오',하지만 특히 명확하지 않다에 대한 이해에서

+0

당신은 당신의 코드를 공유 할 수 있습니다 예를 들어

이 장소 ID와 색상 플래그를 포함하는 클래스를 사용? 어쩌면 우리는 실제 상황에서 그것을 볼 수 있고 문제에 접근하는 방법에 대한 더 나은 아이디어를 얻을 수있는 링크일까요? – Trott

+0

불행히도 링크를 게시 할 수 없지만 꽤 표준적인 내용입니다. 완료하면 : var map = new google.maps.Map (document.getElementById ("mymap"), {some options}); 나는 다음과 같이한다 : var regionLayer = new google.maps.KmlLayer ("http : //.../some.kml"); 및 regionLayer.setMap (map); 환호, Neil – dotnetnutty

답변

2

. 비슷한 일을하려고합니다. (그러나 mouseover/mouseout의 색상을 업데이트하십시오.)

KML 파일은 Google 서버에 의해로드되고 자바 스크립트 객체와 함께 전송되어지도에 적용됩니다. 따라서 자바 스크립트 KMLLayer가 볼 때까지 모두 정렬됩니다.

Styles 및 styleUrl을 사용하여 할 수 있습니다. 이것은 런타임에 적용될 수있는 다양한 스타일을 설정할 수 있도록 해 주지만, 제대로 작동하지는 않습니다.

+0

감사합니다 nicodemus13. – dotnetnutty

+0

이 문제에 관한 뉴스가 있습니까? 내가 아는 한 kml 오버레이 내용은 일반 Google지도 다각형 또는 선 개체입니다. em에 액세스 할 수있는 방법이 있어야합니다. 지도 v3에서 click 이벤트는 클릭 된 객체에 대한 임의의 ID를 제공합니다. ** id와 같은 것 : "g37a571f194fd2a75"** – RubbelDeCatc

1

KML 파일을 문자열로 읽은 다음 KML 문자열의 시작 부분에 스타일 섹션을 삽입하고 각 고유 한 이름의 장소 표시에 styleURL을 삽입하는 웹 서비스를 만들어이 작업을 수행했습니다. .net 웹 서비스를 사용하여 마크 업을 수정하고 웹 서비스를 호스팅하는 서버에 다시 작성하는 것은 매우 간단합니다.

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; 
    } 
+0

이것은 모든 마우스 오버 시마다 전체 데이터를 다시로드하고 싶지 않습니다. – RubbelDeCatc

관련 문제