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

Javascript 无论如何,在平移时限制更新谷歌地图,javascript,google-maps,Javascript,Google Maps,我有一个谷歌地图设置了指针。我将其设置为每当缩放更改或视口更改时,都会相应地加载一组新指针: google.maps.event.addListener(xmap, 'zoom_changed', function(event){ tm.update(); }); google.maps.event.addListener(xmap, 'bounds_changed', function(event){ tm.update(); }); google.maps

我有一个谷歌地图设置了指针。我将其设置为每当缩放更改或视口更改时,都会相应地加载一组新指针:

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

出现的问题是,有时加载的infowindow对于视图端口来说可能太大,导致映射平移,从而触发更新函数重新填充指针


处理此问题的最佳方法是什么。

因此,您可以使用类似布尔标志的东西来指示是否调用tm.update()。在标记单击事件处理程序中(打开信息窗口),将其设置为false。然后,在已更改的事件处理程序中,仅当布尔值为true时才调用tm.update。然后,也许在边界结束时,u发生了变化,将其重置为true

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

更新: 边界更改后,您有了新的边界。然后查询服务器并获取所需的标记坐标和其他相关数据。在地图上添加标记时,请保存对它们的引用,例如,在哈希中。如果你有一些独特的身份证-这是完美的。在另一种情况下,为标记器发明某种标识符。然后我们需要添加新的标记,并可能删除其中一些隐藏的标记。像这样:

// 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];
  }
}
//
var markersOnMap={}
//获取数据并添加新标记时
markersData=从请求中收到的标记数组
对于(var i=0;i
我如何才能做到这一点,然后我会被要求对每个标记进行检查,不是吗?