谷歌地图v3 fitBounds()缩放太近,单个标记

有没有办法为fitBounds()设置最大缩放级别? 我的问题是,当地图只被送到一个位置时,它会尽可能地放大,这确实会使地图脱离上下文,并使其无法使用。 也许我采取了错误的做法?

提前致谢!

我喜欢mrt的解决scheme(特别是当你不知道你将要绘制或调整多less点时),除非它抛出了标记,使它不在地图的中心。 我只是把它延长了一个额外的点,从lat和lng减去.01,所以它保持在中心的标记。 很好,谢谢!

 // Pan & Zoom map to show all markers function fitToMarkers(markers) { var bounds = new google.maps.LatLngBounds(); // Create bounds from markers for( var index in markers ) { var latlng = markers[index].getPosition(); bounds.extend(latlng); } // Don't zoom in too far on only one marker if (bounds.getNorthEast().equals(bounds.getSouthWest())) { var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01); var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - 0.01, bounds.getNorthEast().lng() - 0.01); bounds.extend(extendPoint1); bounds.extend(extendPoint2); } map.fitBounds(bounds); // Adjusting zoom here doesn't work :/ } 

你可以在MapOptions (api-reference)中用maxZoom设置你的地图,像这样:

 var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 }); 

这将使地图在使用fitBounds()不会变得更深,甚至从缩放控制中移除缩放级别。

另一个解决scheme是在执行fitBounds()之前,如果检测到它们太小,则展开边界:

 var bounds = new google.maps.LatLngBounds(); // here you extend your bound as you like // ... if (bounds.getNorthEast().equals(bounds.getSouthWest())) { var extendPoint = new google.maps.LatLng(bounds.getNorthEast().lat() + 0.01, bounds.getNorthEast().lng() + 0.01); bounds.extend(extendPoint); } map.fitBounds(bounds); 
 var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 }); 

使用MaxZoom选项最适合不缩放以closures所有标记。

如果是单个位置,则可以使用setCenter()和setZoom()。

你可以使用

 map.setOptions({ maxZoom: [what u want], minZoom: [what u want] }); 

这样你就可以在地图初始化之后设置地图的属性….你可以设置它们多次,但是在你的情况下…你可以在fitBounds()之前设置它们,

祝你好运,rarutu

我防止地图放大到远处的方法是添加下面这行代码:

 var zoomOverride = map.getZoom(); if(zoomOverride > 15) { zoomOverride = 15; } map.setZoom(zoomOverride); 

直接在这一行之后:

 map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds)); 

随意将缩放级别更改为您不希望地图缩放的级别。

如果您有任何问题或疑问,请留下我对我在http://icode4you.net/creating-your-own-store-locator-map-how-to-prevent-the-地图从-移近太紧密上一个单标记;

一旦你添加了所有的真实边界,添加这些行

 var offset = 0.002; var center = bounds.getCenter(); bounds.extend(new google.maps.LatLng(center.lat() + offset, center.lng() + offset)); bounds.extend(new google.maps.LatLng(center.lat() - offset, center.lng() - offset)); 

它得到了真正的边界的中心,然后在东北和西南一个中心增加了两个附加点

这可以有效地设置最小变焦,改变偏移值来增加或减小变焦

我真的很喜欢mrt的解决scheme,如果你总是只有一个点可以使用,那么它就可以很好地工作。 但是我发现,如果边界框不是基于一个点,而是非常接近的点,这仍然可能导致地图放大得太远。

这里有一种方法来首先检查点是否在彼此的定义距离内,如果它们小于最小距离,则将边界延伸最小距离:

 var bounds = new google.maps.LatLngBounds(); // here you extend your bound as you like // ... var minDistance = 0.002; var sumA = bounds.getNorthEast().lng() - bounds.getSouthWest().lng(); var sumB = bounds.getNorthEast().lat() - bounds.getSouthWest().lat(); if((sumA < minDistance && sumA > -minDistance) && (sumB < minDistance && sumB > -minDistance)){ var extendPoint1 = new google.maps.LatLng(bounds.getNorthEast().lat() + minDistance, bounds.getNorthEast().lng() + minDistance); var extendPoint2 = new google.maps.LatLng(bounds.getNorthEast().lat() - minDistance, bounds.getNorthEast().lng() - minDistance); bounds.extend(extendPoint1); bounds.extend(extendPoint2); } 

希望这可以帮助别人!

这使您可以直接控制最大允许的范围拟合缩放。

 var fitToMarkers = function(map, markers, maxZoom) { if (typeof maxZoom == 'undefined') maxZoom = 15; google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } }); var bounds = new google.maps.LatLngBounds(); for (var m = 0; m < markers.length; m++) { var marker = markers[m]; var latlng = marker.getPosition(); bounds.extend(latlng); } map.fitBounds(bounds); }; 

我用这个块解决了,因为Google Maps V3是事件驱动的:

您可以告诉API在zoom_changed事件触发时将缩放设置回合适的数量:

 var initial = true google.maps.event.addListener(map, "zoom_changed", function() { if (intial == true){ if (map.getZoom() > 11) { map.setZoom(11); intial = false; } } }); 

我用intial使地图不会放大太多的加载时,最终fitBounds permorfed,没有任何缩放事件超过11将是不可能的用户。

我有基于限制最大缩放时拟合边界soulution。 适用于我(在Win 7 – IE 9,FF 13,Chrome 19上testing):

 // When fitting bounds: var bounds = new google.maps.LatLngBounds(); // ... // extend bounds as you like // .. // now set global variable when fitting bounds window.fittingBounds = true; map.fitBounds(bounds); window.fittingBounds = false; // attach this event listener after map init google.maps.event.addListener(map, 'zoom_changed', function() { // set max zoom only when fitting bounds if (window.fittingBounds && map.getZoom() > 16) { this.setZoom(16); } }); 

而..这是另一个。
和mrt和Ryan一样的想法,但是

  • 也可以工作,如果边界大小不完全是零(*)
  • 防止在两极附近变形
  • 使用getCenter()而不是getNorthEast()

(*)注意:如果该框已经足够大,那么添加这两个额外的点应该没有效果。 所以我们不需要进一步的检查。

 function calcBounds(markers) { // bounds that contain all markers var bounds = new google.maps.LatLngBounds(); // Using an underscore _.each(). Feel free to replace with standard for() _.each(markers, function(marker) { bounds.extend(marker.getPosition()); }); // prevent lat/lng distortion at the poles var lng0 = bounds.getNorthEast().lng(); var lng1 = bounds.getSouthWest().lng(); if (lng0 * lng1 < 0) { // Take the cos at the equator. var cos = 1; } else { var cos0 = Math.cos(lng0); var cos1 = Math.cos(lng1); // Prevent division by zero if the marker is exactly at the pole. var cos_safe = Math.max(cos0, cos1, 0.0001); } var cos0 = Math.cos(bounds.getNorthEast.lng() * Math.PI / 180); var cos1 = Math.cos(bounds.getSouthWest.lng() * Math.PI / 180); // "radius" in either direction. // 0.0006 seems to be an ok value for a typical city. // Feel free to make this value a function argument. var rLat = 0.0006; var rLng = rLat / cos_safe; // expand the bounds to a minimum width and height var center = bounds.getCenter(); var p0 = new google.maps.LatLng(center.lat() - rLat, center.lng() - rLng); var p1 = new google.maps.LatLng(lat.center() + rLat, center.lng() + rLng); bounds.extend(p0); bounds.extend(p1); return bounds; } 

编辑:我不完全确定,如果我的比例计算正确,考虑到我们有一个墨卡托投影。 我可能会重新编辑这个..

它已经在这里回答了Google Maps v3:强制min。 缩放级别使用fitBounds时,它按预期工作:)所以现在如果在合适的范围后缩放比较less,那么可以说13,那么你可以设置你preffer的新缩放

调用fitBounds()方法后,请尝试再次设置缩放级别。 它将强制地图处于缩放级别,同时居中于正确的位置。

至于我,我们通过在fitBounds之后创build一个空闲事件来解决这个问题。 完美地工作。 猜猜这是最干净的解决scheme之一

 var locations = [['loc', lat, lng], ['loc', lat, lng]]; ..... for (i = 0; i < locations.length; i++) { var map = new google.maps.Map(document.getElementById('map'), { zoom: 10 }); .... create markers, etc. } .... map.fitBounds(bounds); google.maps.event.addListenerOnce(map, 'idle', function() { if (locations.length == 1) { map.setZoom(11); } });