Cómo limitar el zoom y el desplazamiento en Google Maps

En ocasiones nos interesa restringir el desplazamiento del usuario sobre el mapa a un área determinada, o limitar los niveles de zoom máximo y mínimo.

En el caso del zoom la solución es bastante sencilla. Solo hay que sobreescribir los métodos getMinimumResolution() y getMaximumResolution() de cada uno de los tipos de mapas GMapType presentes en nuestro mapa.
Para el caso del desplazamiento, la solución es algo más compleja. Consiste en escuchar el evento move, que es lanzado por el objeto GMap cuando hay un desplazamiento, y comprobar las coordenadas del mapa tras el desplazamiento. Si estas coordenadas quedan fuera del área a la que queremos limitar el desplazamiento, usamos el metodo GMap.setCenter para que el mapa quede dentro de nuesta área.

Esta clase implementa la funcionalidad deseada:

  1. /******  TRestricter  **********************************************/
  2.  
  3. // Constructor
  4. TRestricter = function (map) {
  5. this.map = map;
  6. }
  7. // Función que activa la limitación del desplazamiento entre la esquina inferior izquierda
  8. // y la esquina superior derecha
  9. TRestricter.prototype.restrict = function (sw, ne) {
  10. this.map._allowedBounds = new GLatLngBounds(sw, ne);
  11. GEvent.addListener(this.map, 'move', this.checkBounds);
  12. }
  13. // Función que desactiva la limitación del desplazamiento
  14. TRestricter.prototype.unrestrict = function () {
  15. this.map._allowedBounds = null;
  16. }
  17. // Listener encargado de comprobar el desplazamiento
  18. TRestricter.prototype.checkBounds = function() {
  19. if (!this._allowedBounds || this._allowedBounds.contains(this.getCenter())) return;
  20. var x = Math.min(Math.max(this.getCenter().lng(), this._allowedBounds.getSouthWest().lng()), this._allowedBounds.getNorthEast().lng());
  21. var y = Math.min(Math.max(this.getCenter().lat(), this._allowedBounds.getSouthWest().lat()), this._allowedBounds.getNorthEast().lat());
  22. this.setCenter(new GLatLng(y,x));
  23. }
  24. // Establece los límites de zoom del mapa
  25. TRestricter.prototype.zoomLevels = function (min, max) {
  26. var array = this.map.getMapTypes() || [];
  27. for (var i=0; i
  28. array[i].getMinimumResolution = function () { return min };
  29. array[i].getMaximumResolution = function () { return max };
  30. }
  31. }

Y aquí tenemos un ejemplo de la clase en acción

Share:
  • del.icio.us
  • Google
  • E-mail this story to a friend!
  • Print this article!

Leave a Comment