Javascript 从视口中删除标记

Javascript 从视口中删除标记,javascript,google-maps-api-3,google-maps-markers,viewport,markermanager,Javascript,Google Maps Api 3,Google Maps Markers,Viewport,Markermanager,我必须管理一张集中在法国的大约80000个标记的地图。 为此,我决定获取视口的边界并调用动态JSON(使用PHP),其中包含视口内的标记。这是关于“空闲”事件的 我面临这个解决方案的问题。事实上,已经存在的标记被重新绘制(在相同的位置),从而使地图变得毫无意义 为了解决这个问题,比较JSON查询前后的标记列表(感谢jQuery),以便只绘制新的标记。而且它有效 现在,我想删除地图上当前未显示的标记。或者由ID指定的标记列表(由于jQuery,我得到了它),ID也是标记的标题。那么,怎样才能删除这

我必须管理一张集中在法国的大约80000个标记的地图。 为此,我决定获取视口的边界并调用动态JSON(使用PHP),其中包含视口内的标记。这是关于“空闲”事件的

我面临这个解决方案的问题。事实上,已经存在的标记被重新绘制(在相同的位置),从而使地图变得毫无意义

为了解决这个问题,比较JSON查询前后的标记列表(感谢jQuery),以便只绘制新的标记。而且它有效

现在,我想删除地图上当前未显示的标记。或者由ID指定的标记列表(由于jQuery,我得到了它),ID也是标记的标题。那么,怎样才能删除这样的标记呢?我指定我正在使用MarkerManager

否则,你猜如果我不移除这些标记,它们在某些情况下会被重新绘制。。。例如,您正在查看城市A,移动地图以查看城市B,然后返回城市A

代码如下:

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;

    });
}
var映射;
风险经理;
var标记=[];
函数初始化(){
变量映射选项={
缩放:6,
中心:新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=新MarkerManager(映射、mgr选项);
google.maps.event.addListener(映射'idle',函数(){
mapEvent();
});
}
函数mapEvent(){
如果(map.getZoom()>=8){
var bounds=map.getBounds();
getSupports(bounds.getNorthEast(),bounds.getSouthWest());
}否则{
//待办事项
}
}
var markerslistID=新数组();
var markerslistData={};
功能支持(东北、西南){
newMarkerslistID=新数组();
newMarkerslistData={};
//获取当前视图的标记
$.getJSON('./markerslist.php?nelat='+ne.lat()+'&nelng='+ne.lng()+'&swlat='+sw.lat()+'&swlng='+sw.lng(),函数(数据){
对于(变量i=0;i

感谢您的帮助。

使用一行程序隐藏当前视口中未显示的所有标记

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


谢谢你的回答。但要做到这一点,我必须循环包含在manager(mgr变量)中的标记。。。但是怎么做呢?
if (map.getBounds().contains(marker.getPosition()) && !marker.getVisible()) {
    marker.setVisible(true);
} 
else if (!map.getBounds().contains(marker.getPosition()) && marker.getVisible()) {
    marker.setVisible(false);
}