Google Maps API v3:我可以在fitBounds之后设置缩放吗?

chr*_*ris 197 javascript google-maps google-maps-api-3 fitbounds

我想在嵌入式Google Map(API v3)上绘制一组点.除非缩放级别太低(即缩小太多),否则我希望能够容纳所有点.我的方法是这样的:

var bounds = new google.maps.LatLngBounds();

// extend bounds with each point

gmap.fitBounds(bounds); 
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Run Code Online (Sandbox Code Playgroud)

这不起作用.如果在fitBounds之后直接调用,则最后一行"gmap.setZoom()"不会更改地图的缩放级别.

有没有办法获得边界的缩放级别而不将其应用于地图?解决这个问题的其他想法?

LGT*_*LGT 328

编辑:见Matt Diamond的评论如下.

得到它了!试试这个:

map.fitBounds(bounds);
var listener = google.maps.event.addListener(map, "idle", function() { 
  if (map.getZoom() > 16) map.setZoom(16); 
  google.maps.event.removeListener(listener); 
});
Run Code Online (Sandbox Code Playgroud)

修改您的需求.

  • 很好的解决方案,完全省去了很多麻烦.只是想补充一点,你可以通过使用addListenerOnce方法进一步简化它......这样,你不必保存监听器并手动删除它,因为方法会为你处理. (75认同)
  • 这具有看到地图"跳过"的行为.而是监听"zoom_change"事件,并在调用fitBounds()之前进行设置.请参阅下面的答案 (8认同)
  • 您可以使用“addListnerOnce”来避免删除它的逻辑。 (3认同)

Jim*_*vin 67

我在我的一个应用程序中解决了类似的问题.你对这个问题的描述让我感到有点困惑,但我认为你有同样的目标......

在我的应用程序中,我想绘制一个或多个标记,并确保地图显示所有标记.问题是,如果我完全依赖于fitBounds方法,那么当存在单个点时,缩放级别将被最大化 - 这是不好的.

解决方案是在有多个点时使用fitBounds,在只有一个点时使用setCenter + setZoom.

if (pointCount > 1) {
  map.fitBounds(mapBounds);
}
else if (pointCount == 1) {
  map.setCenter(mapBounds.getCenter());
  map.setZoom(14);
}
Run Code Online (Sandbox Code Playgroud)

  • 您的答案解决了我使用Google Maps V3的问题.谢谢! (4认同)

Ben*_*man 43

我多次来到这个页面得到答案,虽然所有现有的答案都非常有用,但他们并没有完全解决我的问题.

google.maps.event.addListenerOnce(googleMap, 'zoom_changed', function() {
    var oldZoom = googleMap.getZoom();
    googleMap.setZoom(oldZoom - 1); //Or whatever
});
Run Code Online (Sandbox Code Playgroud)

基本上我发现'zoom_changed'事件阻止了地图的UI"跳过",这是在我等待"空闲"事件时发生的.

希望这有助于某人!

  • 另请注意,如果使用`zoom_changed`,则应在调用`fitBounds()`之前添加侦听器 (6认同)
  • 很好,我也有'跳过/自动缩放'的行为.就像其他读者的注意事项一样:一定要使用"addListenerOnce"作为Benjamin而不是"addListener",或者打破你的浏览器为何一直崩溃的原因;-) (4认同)
  • Benjamin,我认为最好使用`bounds_changed`,因为`fitBounds`保持缩放级别时不必触发`zoom_changed`.我的尝试http://jsfiddle.net/rHeMp/10/没有确认,但不应该依赖于未定义的行为. (3认同)

Rob*_*ton 11

我刚刚通过提前设置maxZoom来修复此问题,然后将其删除.例如:

map.setOptions({ maxZoom: 15 });
map.fitBounds(bounds);
map.setOptions({ maxZoom: null });
Run Code Online (Sandbox Code Playgroud)

  • 我发现如果你在调用fitBounds后立即重置maxZoom,这不起作用,因为缩放是异步发生的(所以maxZoom在放大时会回到null).等到"空闲"重置它会解决这个问题,虽然我猜. (2认同)

Ati*_*riq 5

请试试这个:

map.fitBounds(bounds);

// CHANGE ZOOM LEVEL AFTER FITBOUNDS
zoomChangeBoundsListener = google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
  if (this.getZoom()){
    this.setZoom(15);
  }
});
setTimeout(function(){
  google.maps.event.removeListener(zoomChangeBoundsListener)
}, 2000);
Run Code Online (Sandbox Code Playgroud)