在gmaps api 3中,getBoundsZoomLevel()的等效函数是什么?

23
在API v2中,地图对象有一个方便的方法getBoundsZoomLevel()。我用它来获取最适合边界的缩放级别,然后以某种方式操纵这个最佳缩放级别,最后设置所需的缩放级别。
API v3中,我找不到类似的功能。(从v2到v3迁移时真是一次持续的沮丧体验)
我真的需要再次使用map.fitBounds()map.getZoom()进行操作,并setZoom()吗?那真的很愚蠢!

3
请访问https://dev59.com/8W025IYBdhLWcg3wW0yx,了解如何计算给定边界框的缩放级别。 - Dr.Molle
感谢@Dr.Molle。很遗憾你必须自己编写函数,所以在这种情况下,我更喜欢我上面提出的愚蠢解决方案。但是我会使用您提供的链接来解决另一个问题,谢谢! - Tomas
+1 - 我很惊讶你没有得到更多的点赞。 - Edward J Beckett
你从map.fitBounds()中缺少了什么?到目前为止,它似乎很好地将地图居中于边界,并进入适合地图大小和边界大小的缩放级别。 - chrismarx
1个回答

36

下面是我实现的一个函数:

/**
* Returns the zoom level at which the given rectangular region fits in the map view. 
* The zoom level is computed for the currently selected map type. 
* @param {google.maps.Map} map
* @param {google.maps.LatLngBounds} bounds 
* @return {Number} zoom level
**/
function getZoomByBounds( map, bounds ){
  var MAX_ZOOM = map.mapTypes.get( map.getMapTypeId() ).maxZoom || 21 ;
  var MIN_ZOOM = map.mapTypes.get( map.getMapTypeId() ).minZoom || 0 ;

  var ne= map.getProjection().fromLatLngToPoint( bounds.getNorthEast() );
  var sw= map.getProjection().fromLatLngToPoint( bounds.getSouthWest() ); 

  var worldCoordWidth = Math.abs(ne.x-sw.x);
  var worldCoordHeight = Math.abs(ne.y-sw.y);

  //Fit padding in pixels 
  var FIT_PAD = 40;

  for( var zoom = MAX_ZOOM; zoom >= MIN_ZOOM; --zoom ){ 
      if( worldCoordWidth*(1<<zoom)+2*FIT_PAD < $(map.getDiv()).width() && 
          worldCoordHeight*(1<<zoom)+2*FIT_PAD < $(map.getDiv()).height() )
          return zoom;
  }
  return 0;
}

谢谢!您的代码产生与旧的v2 getZoomByBounds相同的值。 - Kirk Ouimet
可以使用(map.getDiv()).style.width代替$(map.getDiv()).width(),同样适用于高度。 - Jaykishan
1
@Jaykishan 我想你指的是 .offsetWidth 和 .offsetHeight(样式属性可能未设置). - Mark
我一开始也不知道为什么它不工作,但后来我发现它需要一个“projection_changed”事件监听器。现在它像魔法般地工作了。如果有人遇到同样的问题,只是提一下。 - user2718671
1
我已经寻找了三个多小时了。我甚至编写了一个检查器,可以检查随机边界,并且在我进行的20,000次随机检查中,这个函数总是有效的。似乎总是与谷歌所说的有界缩放匹配。 - ParoX
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接