问题 使用markerclusterer v3获取谷歌地图边界中的标记列表


我目前有一个谷歌地图填充了数据库中的数据。我正在使用markerclusterer v3来聚类标记以使地图加载更快。我已经搜索了文档,似乎无法找到一种方法来获取地图边界中所有标记的列表。基本上我正在尝试在外部div中创建标记地址的外部列表。目前在页面加载时,它会附加整个收件人列表。我想要做的只是标记,以及当时出现在该地图上的群集中包含的标记出现在列表中。因此,在缩放13处,有6个簇,每个簇有3个,还有一个独奏标记。在缩放14处,存在3个3和2个独奏标记的簇。在缩放13处,列表中将有19个地址,而在缩放14处,列表中将有11个地址。只是地图边界中的标记列表。我目前在初始地图创建时加载所有地址一次。我想在每次缩放时向服务器创建一个ajax帖子,但认为在每个地图移动上都有一点服务器调用是不必要的。必须有一种方法来获取由markersclusterer控制的边界中的标记列表。

.js文件

var markers = [];       
for (var i = 0; i < data.coords.length; i++) {
    var dataInd = data.coords[i];
    var latLng = new google.maps.LatLng(dataInd[1],dataInd[2]);
    var marker = new google.maps.Marker({position: latLng});
    markers.push(marker);

}
var map;
var myOptions = {
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};
function init() {
    map = new google.maps.Map(document.getElementById("map"), myOptions);
    var markerCluster = new MarkerClusterer(map, markers);
}
for (var i=0; i < markers.length; i++) {
    if (map.getBounds.contains(markers[i])) {
         console.log(markers);
    } else {
         console.log('failed');
    }
}

google.maps.event.addDomListener(window, 'load', init); 

5483
2018-01-31 18:36


起源

你在哪里创建/初始化你的地图? - geocodezip
可能重复 如何使用谷歌地图v3检查标记是否在边界内 - geocodezip
在原帖中添加了我的map init - user1881482


答案:


  1. 使您的标记数组全局化。
  2. 使您的地图变量全局(或至少在范围内)。
  3. 运行此代码:

    for (var i=0; i < markers.length; i++) 
    {
        if (map.getBounds().contains(markers[i].getPosition()))
        {
            // markers[i] in visible bounds
        } 
        else 
        {
            // markers[i] is not in visible bounds
        }
    }
    

更新: 您可能需要这样做(如果您尝试将循环添加到init函数)。其他选择(你还没有真正清楚过 为什么 你想这样做):

  1. 初始循环中的标记测试,用于添加标记。
  2. 使用addListenerOnce而不是addListener。
  3. 每当地图被缩放或平移时(当边界再次变化时),您可能想要重新渲染“listOfItems”

    var map = null;
    var markers = [];
    function init() 
    {
        var myOptions = 
        {
            zoom: 13,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map"), myOptions);
        for (var i = 0; i < data.coords.length; i++) 
        {
            var dataInd = data.coords[i];
            var latLng = new google.maps.LatLng(dataInd[1],dataInd[2]);
            var marker = new google.maps.Marker({ position: latLng });        
            markers.push(marker);
            $('#listOfItems').append('<li>' + latlng + '</li>');
        }
    
        var markerCluster = new MarkerClusterer(map, markers);
    
        google.maps.event.addListener(map, 'bounds_changed', function() 
        {
            for (var i = 0; i < markers.length; i++) 
            {
                if (map.getBounds().contains(markers[i].getPosition())) 
                {
                    // markers[i] in visible bounds
                } 
                else 
                {
                    // markers[i] is not in visible bounds
                }
            }
        });
    }
    
    google.maps.event.addDomListener(window, 'load', init);
    

14
2018-01-31 18:51



我在这里遇到了障碍。我似乎无法使我的地图变量全局化。除非在init函数内部,否则它不响应。我已经宣布了 var map; 在init函数之外和 map = new google.maps.Map(document.getElementById("map"), myOptions); 在init函数里面这样可行,但是现在在for循环中map.getBounds无法计算。 - user1881482
你的是什么 充分 代码看起来像(至少关于地图)?如果您在“init”函数中的答案中执行循环,则可能需要添加边界更改的侦听器。 - geocodezip
我在我的问题中添加了修改后的代码。你可以看到底部我正在使用console.log来查看是否有任何事情发生但我收到了错误 TypeError: 'undefined' is not an object (evaluating 'map.getBounds') - user1881482
它没有出现。控制台日志似乎不是一个真实的用例(您可能想要更改 console.log(markers) 至 console.log(markers[i]))。你是什​​么 试 处理这些信息? - geocodezip
基本上我想显示当前在外部div中的地图边界的标记的地址列表。当缩放更改时,该列表将更新以反映边界中的新标记,以便使用新地址刷新列表 - user1881482