如何确定哪些标记在我的Google地图中可见?

时间:2009-05-11 22:50:48

标签: javascript google-maps google-maps-markers

这是我想要做的。我有大约160个名胜古迹。用户输入我使用Google进行地理编码的地址(邮政编码,完整地址等)。然后我创建一个以此点为中心的Google地图,并为地图中的每个感兴趣点添加一个标记(使用MarkerManager)。到目前为止一切都很好。

我想在地图旁边显示与正在显示的标记对应的项目列表。当用户拖动窗口,或放大或缩小等等时,我想更新此列表。如果一次显示太多项目,我想向用户显示一条消息。

最好的方法是什么?我尝试在MarkerManager中添加一个监听器,这样当它改变时我可以找出仍然显示的标记。然而,事件似乎没有按照我的预期发射,即当显示的标记发生变化时。此外,我怀疑每次循环超过160多个这样的标记会有效。

             GEvent.addListener(mgr, "changed", 
                function(bounds, markerCount) 
                {
                    var visibleBounds = map.getBounds();

                    for (var i = 0; i < gmarkers.length; i++) 
                    {
                        //alert(gmarkers[i].getPoint());
                        if (visibleBounds.containsLatLng(gmarkers[i].getLatLng())) {

                            // this will need to be replaced with an ajax call
                            // to get the details from the server
                            strHtml += "<div>Another item</div>";
                            count ++;
                        }
                    }
                    alert(count);
                });

实现这一目标的最佳方法是什么?

更新:此代码有效,但只有在地图移动了一定的最小距离时才会触发事件。因此,如果用户将地图拖动一小段距离,则事件似乎不会触发。

3 个答案:

答案 0 :(得分:1)

“更改”事件仅在标记发生变化时才会触发,因此肯定存在小动作不会改变任何事物的情况。 MarkerManager扩展了它的工作范围,使其在移动时更加平滑(它显示离开地图的标记,在一定距离内)。

答案 1 :(得分:1)

您需要收听“空闲”事件,该事件在平移或缩放后地图变为空闲时触发。

google.maps.event.addListener(map, 'idle', function() {
  var bounds = map.getBounds();
  ...
});

答案 2 :(得分:0)

要获得所有标记,首先必须找到当前视口的边界,然后必须循环所有标记并查看它们是否包含在边界内。以下是一个例子。

var bounds = map.getBounds();

for(var i = 0; i < markers.length; i++){ // looping through my Markers Collection        
if(bounds.contains(markers[i].position))
 console.log("Marker"+ i +" - matched");
}