【发布时间】:2010-11-03 10:27:09
【问题描述】:
我正在尝试在缩放更改后获取地图的边界, 但是 zoom_changed 事件在重新计算边界之前触发。因此,在 zoom_changed 处理程序中,您会得到以前的边界,而不是新的边界。
有什么方法可以让缩放变化得到正确的界限吗?
【问题讨论】:
标签: google-maps google-maps-api-3
我正在尝试在缩放更改后获取地图的边界, 但是 zoom_changed 事件在重新计算边界之前触发。因此,在 zoom_changed 处理程序中,您会得到以前的边界,而不是新的边界。
有什么方法可以让缩放变化得到正确的界限吗?
【问题讨论】:
标签: google-maps google-maps-api-3
我也有同样的问题。这是我最终解决的几个问题,我在其他解决方案中遇到的问题。
*无论您使用鼠标还是箭头键,都正确地执行边界
*如果按住箭头键,则不会在边缘附近停止,因为平移加速会导致它在一步中“越过”边缘,所以它会在边缘附近停止(尝试同时按住箭头键)方向直到你碰到边缘,然后松开并再次按下它,通过一些解决方案,它会滚动一点)
*碰到边缘时不会“反弹”
*适当地强制缩放变化的界限
编辑:好的,所以当您使用滚轮更改缩放时它可以工作,但不能使用缩放控件。让我玩一下,看看我是否也能让它工作......
编辑 2:原来,问题是因为我删除了平移控件。只要存在平移控件,就可以正常使用滚轮和缩放控件。
编辑 3:不……不是这样。我已经更新了处理缩放控件的代码。
// bounds of the desired area
var allowedBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(-64, -64),
new google.maps.LatLng(64, 64)
);
var zoomChanged = false;
google.maps.event.addListener(map, 'center_changed', function() {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
}, this);
google.maps.event.addListener(map, 'zoom_changed', function() {
zoomChanged = true;
}, this);
google.maps.event.addListener(map, 'bounds_changed', function() {
if(zoomChanged) {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
zoomChanged = false;
}
}, this);
【讨论】:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3&sensor=false"></script>
这是bug,如果您有兴趣,请在此问题上加注星标。
有一个丑陋的解决方法:
google.maps.event.addListener(map, 'zoom_changed', function () {
google.maps.event.addListenerOnce(map, 'bounds_changed', function (e) {
my_zoom_handler(); // do your job here
});
});
【讨论】:
bounds_changed 事件在缩放事件之前到达,此代码将不起作用。 Maps API fires these latter events independently.
'idle' 而不是'bounds_changed',因为在动画期间触发了'bounds_changed' 事件。我认为 OP 希望它在之后触发。
要绑定 bounds_changed 并在缩放后使用标记/地图内容,请使用:
google.maps.event.addListener(map, 'zoom_changed', function() {
this.zoomChanged = true;
});
google.maps.event.addListener(map,"bounds_changed",function() {
if (this.zoomChanged) {
this.zoomChanged = false;
// DO YOUR STUFF
}
});
【讨论】:
如果您尝试检测视口中的变化,请务必使用特定的 bounds_changed 事件,而不是组成 zoom_changed 和 center_changed 事件。因为 Maps API 会独立触发后面的这些事件,所以 get_bounds() 可能不会报告有用的结果,直到视口已权威更改之后。如果您希望在此类事件之后获取 get_bounds(),请务必改为监听 bounds_changed 事件。
【讨论】: