这是我想要做的。我有大约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);
});
实现这一目标的最佳方法是什么?
更新:此代码有效,但只有在地图移动了一定的最小距离时才会触发事件。因此,如果用户将地图拖动一小段距离,则事件似乎不会触发。
答案 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");
}