有没有一种方法来设置fitBounds()
的最大缩放级别?
我的问题是,当地图只显示一个位置时,它会尽可能地缩小到最小,这使得地图失去了上下文并且变得没有用。也许我的方法不正确?
有没有一种方法来设置fitBounds()
的最大缩放级别?
我的问题是,当地图只显示一个位置时,它会尽可能地缩小到最小,这使得地图失去了上下文并且变得没有用。也许我的方法不正确?
我喜欢mrt的解决方案(特别是当你不知道需要映射或调整多少个点时),但它会使标记偏离地图中心。 我只是将其扩展了一个额外的点,分别从lat和lng中减去0.01,这样就可以保持标记在中心位置。非常好用,谢谢mrt!
// 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 :/
}
fitBounds()
方法时无法可靠地调整缩放级别的原因是缩放是异步发生的:https://dev59.com/enA75IYBdhLWcg3w_umD#2990316 - Metro Smurf您可以使用MapOptions
中的maxZoom
来设置地图的最大缩放级别,如下所示:(api-reference)
var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });
使用fitBounds()
可以防止地图进一步缩放,甚至将缩放级别从缩放控件中移除。
maxZoom
,然后在通过更改边界触发的 idle
事件上再次使用 map.setOptions({ maxZoom: undefined })
取消设置。这可以防止在 idle
事件中重置缩放而产生的缩放效果。 - El Yobo另一种解决方案是,在执行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 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));
它获取实际边界的中心点,然后添加两个额外的点,一个位于中心点的东北方,另一个位于西南方。
这有效地设置了最小缩放级别,更改偏移值以增加或减少缩放。
var map = new google.maps.Map(document.getElementById("map"), { maxZoom: 10 });
使用MaxZoom选项最好,这样可以避免将标记缩放得太近。
你可以使用
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-map-from-zooming-in-too-close-on-a-single-marker
对于我来说,我通过在fitBounds之后创建一个空闲事件来解决这个问题。现在完美运行。我想这可能是最简洁的解决方案之一。
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);
}
});
我非常喜欢mrt的解决方案,如果你只需要一个点来工作,它可以完美地运行。然而,我发现如果边界框不是基于一个点,而是点非常靠近彼此,这仍然可能导致地图缩放得太远。
下面是一种方法,首先检查点是否在定义的距离范围内,然后如果它们小于该最小距离,则将边界扩展该最小距离:
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);
}