3 votos

Openlayers usando Google Maps como capa base: ¿es posible alejar el zoom más allá de la extensión máxima?

Véase la imagen adjunta. Así es cuando se carga la página. Actualmente estoy usando

map.zoomToMaxExtent();

enter image description here

Todo funciona bastante bien pero me gustaría alejarme más/ver todo el mundo usando capas de OSM/Google Map: ¿es esto posible?

Tenga en cuenta que la barra de zoom de la izquierda está ajustada a la barra más baja cuando se carga la página (si no puede ver bien el mapa, haga clic con el botón derecho en la imagen y péguela en una nueva pestaña del navegador).

Este el post fue algo útil pero incluso cuando lo hago MIN_ZOOM_LEVEL que no hace mucho.

También hay que tener en cuenta que no estoy estableciendo ningún límite, extensión o resolución. Jugar con ellos tampoco parece funcionar.

Se agradece cualquier aportación.

Edición: aquí hay un código compartido si quieres echar un vistazo: http://codeshare.io/GLC4i

ACTUALIZACIÓN: http://i.imgur.com/mSpTchY.png Esto no está perfeccionado todavía (y me hace pensar que algo puede estar mal con mi código OL en sí) pero actualmente estoy usando esto

var extent = new OpenLayers.Bounds(-1.32,81.71,-1.18,-61.80).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:3857"));

He intentado

var extent = new OpenLayers.Bounds(-20037508.34279,-10018754.17139,20037508.34279,10018754.17139);

(tanto con como sin transformación) pero esto no hizo nada.

ACTUALIZACIÓN 2 : http://i.imgur.com/XzuGxrn.png

wrapDateLine: false funciona bien por ahora: puede alejar el zoom, desplazarse, etc.

Ahora me gustaría cortar todo lo que está a la izquierda de la línea de la fecha en el lado izquierdo del mapa (la "primera" parte), y cortar todo lo que está a la derecha de la línea de la fecha en el lado derecho del mapa (la "tercera" parte), manteniendo el mapa a pantalla completa. He probado con los límites, las resoluciones, pero no ha funcionado. ¿Es esto posible?

Algo así pero que ocupe toda la pantalla: ¿es posible hacerlo? Véase más abajo:

http://i.imgur.com/feBEnx3.png

2voto

C. Ross Puntos 126

Este es el comportamiento por defecto de OpenLayers cuando se utilizan las capas de Google. El parámetro que controla esto es wrapDateLine: false . Simplemente modifique su código con esto para poder hacer más zoom:

    var google_default =  new OpenLayers.Layer.Google("Google Default", {wrapDateLine: false})
    var google_satellite = new OpenLayers.Layer.Google("Google Satellite", {type: google.maps.MapTypeId.SATELLITE, wrapDateLine: false})

Cuando se utilizan capas WFS es una buena idea no utilizar wrapDateLine: false de todos modos. De lo contrario, podrías acabar con tus vectores en el lado equivocado de la Línea de Fecha y fuera del mapa visible.

Actualización:

Estás utilizando una capa de GoogleMaps. Esta capa ya ha establecido el maxExtent al valor por defecto -20037508.34,-20037508.34,20037508.34,20037508.34 . No tienes que jugar con eso.

En algunos casos, OpenLayers ajusta el nivel mínimo (con zoom) para que se ajuste al tamaño de su mapa. Si está utilizando el wrapDateLine: true (que es el valor por defecto con las capas de Google) en su baseLayer, el nivel de zoom se ajusta para mostrar un mapa no más ancho que su maxExtent.

Ahora, respondiendo a tu pregunta original, para poder alejar más el zoom, puedes hacerlo:

  • set wrapDateLine: false en sus capas de Google
  • o desactivar este código directamente en OpenLayers (Tenga en cuenta que esto es no una solución limpia):

    OpenLayers.Map.prototype.adjustZoom = function(zoom) {
        return zoom
    }

Este es el código revelador de OpenLayers que impide alejar el zoom cuando wrapDateLine se establece como verdadero en su capa. Esto siempre se llama cuando se acerca/aleja con OpenLayers >= 2.13:

 /**
 * Method: adjustZoom
 *
 * Parameters:
 * zoom - {Number} The zoom level to adjust
 *
 * Returns:
 * {Integer} Adjusted zoom level that shows a map not wider than its
 * <baseLayer>'s maxExtent.
 */
adjustZoom: function(zoom) {
    if (this.baseLayer && this.baseLayer.wrapDateLine) {
        var resolution, resolutions = this.baseLayer.resolutions,
            maxResolution = this.getMaxExtent().getWidth() / this.size.w;
        if (this.getResolutionForZoom(zoom) > maxResolution) {
            if (this.fractionalZoom) {
                zoom = this.getZoomForResolution(maxResolution);
            } else {
                for (var i=zoom|0, ii=resolutions.length; i<ii; ++i) {
                    if (resolutions[i] <= maxResolution) {
                        zoom = i;
                        break;
                    }
                }
            } 
        }
    }
    return zoom;
},

1voto

Vasu Puntos 11

He echado un vistazo a tu código compartido. Prueba a configurar el maxExtent propiedad.

Creo que has colocado 360 y -360 porque quieres alejar el zoom?

var options = {
        maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
        controls: [
                new OpenLayers.Control.Navigation(),
                new OpenLayers.Control.LayerSwitcher(),
                new OpenLayers.Control.PanZoomBar()
        ]
        //zoomToExtent: bounds.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")),
};

Actualización:

En realidad, no estoy seguro de que puedas alejar el zoom más que new OpenLayers.Bounds(-180, -90, 180, 90) con la capa de Google Maps.

En mi aplicación de mapas web la capa de OpenStreet maps me permite pero no la de google maps. Puede que el servicio esté restringido a eso.

enter image description here enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X