javascript - 将标记移出视口(viewport)

标签 javascript google-maps-api-3 google-maps-markers viewport markermanager

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

我在使用此解决方案时遇到了问题。事实上,已经存在的标记被重新绘制(在同一位置),因此对 map 的权衡毫无意义......

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

现在,我想删除 map 上当前未显示的标记。或者由 ID 指定的标记列表(感谢 jQuery,这也是标记的标题)。那么,如何删除这样的标记呢?我指定我正在使用 MarkerManager。

否则你猜如果我不删除这些标记,在某些情况下它们会被重新绘制...例如,你正在查看城市A,你移动 map 查看城市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;

    });
}

感谢您的帮助。

最佳答案

一行代码,用于隐藏不在当前视口(viewport)中的所有标记。

!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);
}

关于javascript - 将标记移出视口(viewport),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312582/

相关文章:

javascript - 直到在 firefox 中刷新后图像和 jquery 才加载

javascript - 重新利用 map 标记进行加权热图

javascript - 在 WordPress 帖子中为所有图像设置样式

jquery - 谷歌地图信息窗口在 fancybox 中无法正确显示

android - 使用android将图像加载到 map 标记中

javascript - 如何将 Promise.all 与多个参数一起使用?

javascript - 如何处理 AngularJS 循环中的 if 语句?

javascript - Vue.js - 从组件内的根实例访问数据

android - 如何使用 Picasso 为 Google Marker 自定义图标创建语音气泡边框?

javascript - 禁用谷歌地图中的信息窗口阴影(v2)