2013-05-24 4 views
1

지도에 도형 (폴리 라인)을 그려서 AJAX를 통해 데이터베이스에 저장할 수있는 응용 프로그램이 있습니다 (이름, 설명 등). 필자는 최근에 v2가 아닌 GMap APIv3을 사용하도록 코드를 이식했습니다. 그것은 잘 작동하는 것처럼 보였지만 지난 몇 주 동안 사용자가 많은 모양 (~ 20 개)과 많은 점 (모양 당 80-200 개)을 가지고있을 때 몇 가지 끔찍한 성능 문제를 발견했습니다.KML 오버레이를 사용한 Google지도 성능 문제

한 사용자의지도가 브라우저가 정지 된 경우 (IE9와 최신 Chrome 모두)별로 나빠질 수 있습니다. 앱이 v2 GMap을 사용했을 때 이런 일이 발생하지 않았으며 v3에서 항상 이런 식으로되었는지 확인할 수 없었습니다. 나는 blitz-gmap (https://code.google.com/p/blitz-gmap-editor/)을 사용하여 그리기 요소를 처리하고 다음 코드를 사용하여 KML을 구문 분석하고 오버레이를 만듭니다. 오버레이를 사용하여 숨기거나 삭제하기 위해 다른 div의 도형을 참조합니다. 앱이 멈추는 원인을 KML에 제공 할 수도 있지만 Google 어스와 GMap4 (http://www.mappingsupport.com/p/gmap4.php) 모두에서 정상적으로로드됩니다. 나는 뻔뻔스럽게 무언가를하고 있는가?

편집 : 여기에 문제를 일으키는 KML이 있습니다 ... http://pastebin.com/ksB6zAun 4 개의 가장 큰 모양 (해안선 모양)을 제거한 후에도 브라우저가 정지됩니다.

this.setMapFromKML = function (kmlString) { 
    if (kmlString.length == 0) { 
     return false; 
    } 
    if (typeof geoXML3 == "undefined") { // check for include of geoxml3 parser 
     // http://code.google.com/p/geoxml3/ 
     alert("geoxml3.js not included"); 
     return; 
    } 
    if (!geoXml) 
     geoXml = new geoXML3.parser({ 
      map:mapObj, 
      zoom:false, 
      suppressInfoWindows:true 
     }); 

    geoXml.parseKmlString(kmlString); 
    var tmpOverlay, ovrOptions; 
    for (var m = 0; m < geoXml.docs[0].placemarks.length; m++) { 
     if (geoXml.docs[0].placemarks[m].Polygon) { 

      tmpOverlay = geoXml.docs[0].placemarks[m].polygon; 
      if (isEditable) { 
       tmpOverlay.setEditable(true); 
      } 
      tmpOverlay.type = "polyline"; 
     } else if (geoXml.docs[0].placemarks[m].LineString) { 

      tmpOverlay = geoXml.docs[0].placemarks[m].polyline; 
      if (isEditable) { 
       tmpOverlay.setEditable(true); 
      } 
      tmpOverlay.type = "polyline"; 
     } else if (geoXml.docs[0].placemarks[m].Point) { 

      tmpOverlay = geoXml.docs[0].placemarks[m].marker; 
      tmpOverlay.type = "marker"; 
     } 


     var uniqueid = uniqid(); 
     tmpOverlay.uniqueid = uniqueid; 
     if (geoXml.docs[0].placemarks[m].id) { 
      tmpOverlay.id = geoXml.docs[0].placemarks[m].id; 
     } else { 
      tmpOverlay.id = -1; 
     } 
     if (geoXml.docs[0].placemarks[m].name) { 
      tmpOverlay.title = geoXml.docs[0].placemarks[m].name; 
     } else { 
      tmpOverlay.title = ""; 
     } 

     if (geoXml.docs[0].placemarks[m].description) { 
      tmpOverlay.content = geoXml.docs[0].placemarks[m].description; 
     } else { 
      tmpOverlay.content = ""; 
     } 

     //attach the click listener to the overlay 
     AttachClickListener(tmpOverlay); 

     //save the overlay in the array 
     mapOverlays.push(tmpOverlay); 
    } 
    mapObj.fitBounds(geoXml.docs[0].bounds); //adjust map to show all filters 
} 
+0

KML을 제공 할 수 있습니까? 나는 네이티브 Google Maps API v3 객체로 렌더링되는 정점의 수라고 생각합니다. 객체가 편집 가능한 경우에만 발생합니까? – geocodezip

+0

KML의 pastebin에 대한 링크를 제공했습니다. 나는 그것들을 편집 할 수 없게 만들려고 노력하지 않았지만 그것이 GMap4에서 잘로드되는 이유일지도 모른다. – smedrick

+0

[이 페이지] (http://www.geocodezip.com/blitz-gmap-editor/test5_complexKml.html)에서 "KML 매핑 구문 분석"을 클릭하기 전에 편집 모드를 전환하면 Chrome에 적어도 확인이 표시됩니다 그리고 IE10) – geocodezip

답변

2

모든 폴리 라인 편집 을 만들기위한 중요한 성능 저하 (각 정점은 드래그 마커를 얻는다)가있다. 실제로 변경할 필요가있는 폴리선 (한 번에 하나씩)의 편집 만 허용하고 편집 할 수 없도록 기본 설정합니다.

+0

그녀는 이제 코딱지로 매끄러운를로드 중입니다. 정말 고맙습니다! tmpOverlay.setEditable (true)을 false로 변경하고 클릭 리스너를 해제했습니다. 이것은 당분간은 가능하지만 앞으로는 하나의 도형을 클릭하여 편집하는 기능을 추가 할 것입니다. – smedrick