无论如何,限制更新谷歌地图时平移

Anyway to restrict updating a google map when panning

本文关键字:谷歌地图 更新 无论如何      更新时间:2023-09-26

我有一个谷歌地图设置与指针。我已经设置好了,所以每当缩放或视口发生变化时它都会相应地加载一组新的指针:

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查询的数据。问题是,我需要设置它,所以如果我们说一个指针是远边缘的视图端口,它应该平移到中心或位置,当信息窗口打开时,它可以在整个端口查看。

问题是,有时信息窗口加载时可能对视图端口太大,导致地图平移,进而触发更新函数重新填充指针。

所以你可以做的是用布尔标志来指示是否调用tm.update()。在单击标记(打开信息窗口)的事件处理程序中,将其设置为false。然后在bounds_changed事件处理程序中,只调用tm。更新该布尔值是否为真。然后也许在bounds_changed结束时,将其重置为true。

另一种猜测-不删除和覆盖已经可见的标记(落入map.getBounds())。当您收到要添加新标记的响应时,如果还没有,请进行验证。

更新:在bounds_changed之后,你有了新的边界。然后查询服务器并获得所需的标记线和其他相关数据。在地图上添加标记时,保存对它们的引用,例如以散列形式保存。如果你有独特的id,那就再好不过了。在另一种情况下,为标记发明某种标识符。然后我们需要添加新的标记,并可能删除其中一些,这是隐藏的。这样的:

// 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];
  }
}