1

Мне нужно управлять картой около 80.000 маркеров, сконцентрированных во Франции. Для этого я решил получить границы области просмотра и вызвать динамический JSON (с PHP), который содержит маркеры внутри области просмотра. И это на «праздном» событии.Удалить маркеры из окна просмотра

У меня возникла проблема с этим решением. Действительно, маркеры, которые уже существуют, были перепроектированы (в том же положении), что, следовательно, весит карту впустую ...

Для ее решения сравнивается список маркеров до и после запроса JSON (благодаря jQuery), чтобы отображать только новые маркеры. И это работает!

Теперь я хотел бы удалить маркеры, которые в настоящее время не отображаются на карте. Или список маркеров (я получаю его благодаря 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; 

    }); 
} 

Спасибо за вашу помощь.

ответ

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) ... Но как? –