tenía este mismo problema. Esto es lo que finalmente funcionó para resolver varios de los problemas que tuve con otras soluciones.
* hace cumplir correctamente los límites independientemente de si utiliza las teclas de flecha o el ratón
* no se detiene por debajo del borde si mantenga pulsado las teclas de flecha, debido a la aceleración bandeja haciendo que se "exceso" de la borde en un solo paso, por lo que se detiene en corto (intente mantener presionada la tecla de flecha en una dirección hasta llegar al borde, luego suéltela y presiónela nuevamente, y con algunas soluciones, se desplazará un poco más)
* No se "recupera" cuando toca el borde
* Impone correctamente los límites en el cambio de zoom
EDITAR: Ok, entonces funciona cuando se cambia el zoom con la rueda de desplazamiento, pero no con el control del zoom. Déjame jugar un poco con esto, y veré si puedo hacerlo funcionar también ...
EDIT 2: Resulta que el problema se debe a que eliminé el control de panorama. Siempre que el control de panorama esté presente, funciona bien, tanto con la rueda de desplazamiento como con el control del zoom.
EDIT 3: No ... eso no fue todo. Actualicé el código para manejar el control de zoom.
// 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);
usando el evento bounds_changed en lugar de zoom_changed en este caso no tiene sentido. Se disparará en cualquier ocasión cuando se cambien los límites, pero solo le interesan los casos en los que se cambia el zoom. – TMS
@ tomas-t No estoy de acuerdo con que el manejo del evento bounds_changed sea 'sin sentido'. Si está después de los límites cuando el zoom cambió, ¿no podría verificar getZoom en su controlador bounds_change? La documentación que publiqué justifica el comportamiento (error de borde del caso), pero la solución parece bastante simple para mí. – RedBlueThing
por supuesto que puede hacerlo, pero para el caso en que OP quiere manejar el evento bounds_changed en lugar de zoom_changed es innecesario overkill, porque el evento se dispararía incluso durante el paneo, etc. Mire la solución en mi respuesta. – TMS