1

프랑스에 집중된 약 80.000 개의 마커 맵을 관리해야합니다. 이렇게하려면 뷰포트 범위를 가져 와서 뷰포트 내부에 마커가 포함 된 동적 JSON (PHP 포함)을 호출하기로 결정했습니다. 그리고 이것은 "유휴"이벤트에.뷰포트에서 마커 제거

이 솔루션에 문제가 있습니다. 사실, 이미 존재하는 마커는 (동일한 위치에서) 다시 플롯되어 결과적으로 아무것도 계산되지 않습니다.

해결하기 위해 JSON 쿼리 전후의 마커 목록을 비교합니다 (덕분에 jQuery)를 사용하여 새 마커 만 플롯합니다. 그리고 그것은 작동합니다!

이제 현재 맵에 표시되지 않은 마커를 제거하고 싶습니다. 또는 마커의 제목 인 ID로 지정된 마커 목록 (jQuery 덕택에 얻을 수 있음). 그렇다면 어떻게 마커를 삭제할 수 있습니까? 나는 MarkerManager를 사용하고 있다고 명시한다.

그렇지 않으면 내가 마커를 제거하지 않으면 어떤 경우에 다시 그려지는 것 같아요 ... 예를 들어, 도시 A를보고 있고, 도시 B를보기 위해지도를 이동하고,

var map; 
var mgr; 
var markers = []; 

function initialize(){ 

    var mapOptions = { 
     zoom: 6, 
     center: new google.maps.LatLng(46.679594, 2.109375) 
    }; 
    map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); 

    var mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: false }; 

    mgr = new MarkerManager(map, mgrOptions); 

    google.maps.event.addListener(map, 'idle', function() { 
     mapEvent(); 
    }); 

} 

function mapEvent(){ 
    if(map.getZoom() >= 8){ 
     var bounds = map.getBounds(); 
     getSupports(bounds.getNorthEast(), bounds.getSouthWest()); 
    } else { 
     // Todo 
    } 
} 


var markerslistID = new Array(); 
var markerslistData = {}; 

function getSupports(ne, sw){ 

    newMarkerslistID = new Array(); 
    newMarkerslistData = {}; 

    // Getting the markers of the current view 
    $.getJSON('./markerslist.php?nelat='+ne.lat()+'&nelng='+ne.lng()+'&swlat='+sw.lat()+'&swlng='+sw.lng(), function(data) { 

     for (var i = 0; i < data.points.length; i++) { 
      var val = data.points[i]; 

      newMarkerslistID.push(val.id); 
      newMarkerslistData[val.id] = new Array(val.lat, val.lng, val.icon); 
     } 

     // List of New Markers TO PLOT 
     var diffNewMarkers = $(newMarkerslistID).not(markerslistID).get(); 
     // List of Old markers TO REMOVE 
     var diffOldMarkers = $(markerslistID).not(newMarkerslistID).get(); 

     // Plotting the NEW MARKERS 
     for(var i = 0; i < diffNewMarkers.length; i++){ 
      var marker = new google.maps.Marker({ 
       position: new google.maps.LatLng(newMarkerslistData[diffNewMarkers[i]][0], newMarkerslistData[diffNewMarkers[i]][1]), 
       title : diffNewMarkers[i], 
       icon : './images/'+newMarkerslistData[diffNewMarkers[i]][2]+'.png' 
      }); 

      mgr.addMarker(marker, 0); 

     } 

     /***************************************** 
     HERE WE HAVE TO REMOVE 
     THE MARKERS CONTAINED IN diffOldMarkers 
     *****************************************/ 

     mgr.refresh(); 

     // Switching the new list to the old, for the next event 
     markerslistID = newMarkerslistID; 
     markerslistData = newMarkerslistData; 

    }); 
} 

여러분의 도움에 감사드립니다 : 당신은 여기

코드는 ... 다시 도시 A와 얻는다.

답변

2

현재 뷰포트에없는 모든 마커를 숨기는 한 줄짜리 표시기입니다.

!map.getBounds().contains(marker.getPosition()) && marker.setVisible(false); 

또는 답변에 대한

if (map.getBounds().contains(marker.getPosition()) && !marker.getVisible()) { 
    marker.setVisible(true); 
} 
else if (!map.getBounds().contains(marker.getPosition()) && marker.getVisible()) { 
    marker.setVisible(false); 
} 
+0

감사를. 하지만 이렇게하려면 관리자 (mgr 변수)에 포함 된 마커를 반복해야합니다. 그러나 어떻게? –