我有一个使用指针设置的谷歌地图。我已经设置了它,所以每当缩放改变或视口都会相应地加载一组新的指针时:
google.maps.event.addListener(xmap, 'zoom_changed', function(event){
tm.update();
});
google.maps.event.addListener(xmap, 'bounds_changed', function(event){
tm.update();
});
google.maps.event.addListenerOnce(xmap, 'tilesloaded', function(){
tm.update();
});
我还设置了它,以便点击任何指针将打开一个信息框,该信息框将填充来自ajax查询的数据。问题是我需要设置它,以便如果让我们说指针指向视口的远边缘,它应该平移到中心或者当信息窗口打开时它可以在整个端口中查看的位置
出现的问题是,有时加载时的信息窗口对于视口来说可能太大而导致地图平移,从而触发更新功能再次重新填充指针。
最好的办法是什么。
答案 0 :(得分:1)
所以你可以做的就是用布尔标志来表示是否调用tm.update()。在标记点击的事件处理程序中(打开infowindows),将其设置为false。然后在bounds_changed事件处理程序中,如果该布尔值为true,则仅调用tm.update。然后也许在bounds_changed结束时,将其重置为true。
答案 1 :(得分:1)
另一个猜测 - 不要删除和覆盖已经可见的标记(落入map.getBounds())。当您使用要添加的新标记来回复响应时 - 请验证它是否已经存在。
更新: 在bounds_changed之后你有了新的界限。然后,您查询服务器并获取所需的标记坐标和其他相关数据。在地图上添加标记时,请保存对它们的引用,例如,在哈希中。如果你有一些独特的身份 - 它是完美的。在其他情况下,为标记发明某种标识符。然后我们需要添加新标记,并可能删除其中一些隐藏的标记。像这样:
// somewhere initially
var markersOnMap = {}
// when got data and adding new markers
markersData = array of markers you've received from request
for (var i=0; i < markersData.length; i++)
{
var datum = markersData[i];
if (typeof(markersOnMap[datum.id]) == 'undefined')
{
// add marker to map
var marker = new google.maps.Marker({
position: ...,
etc.
});
marker.setMap(mymap);
markersOnMap[datum.id] = marker;
}
}
// you may clean up hidden markers or
// leave it for future or what you want.
// suppose we delete out of view markers
for (var id in markersOnMap)
{
if (!mymap.getBounds().contains(markersOnMap[id].getPosition()))
{
// get rid of it
markersOnMap[id].setMap(null);
delete markersOnMap[id];
}
}