2010-11-21 19 views
19

Estoy usando OpenLayers para mostrar un mapa en una página web. Estoy usando mosaicos de CloudMade, pero los mismos problemas ocurren con los mosaicos de Mapnik de OpenStreetMap.Nivel de zoom mínimo/máximo en OpenLayers

Estoy tratando de restringir el mapa para que el usuario no pueda acercarse a la vista del mundo. Quiero que se mantengan en un nivel de zoom de la ciudad como mínimo.

He intentado usar las propiedades minZoomLevel/maxZoomLevel/numZoomLevels; solo las propiedades maxZoomLevel y numZoomLevels parecen funcionar, mientras que la propiedad minZoomLevel parece ignorarse por completo.

¿Hay alguna otra manera de lograr esto?

Respuesta

11

Puede anular la función isValidZoomLevel. Algo como esto (no probado):

OpenLayers.Map.isValidZoomLevel = function(zoomLevel) { 
    return ((zoomLevel != null) && 
     (zoomLevel >= 2) && // set min level here, could read from property 
     (zoomLevel < this.getNumZoomLevels())); 
} 

EDITAR

O lo que se necesita para anular las resoluciones disponibles, véase el ejemplo aquí: http://dev.openlayers.org/examples/zoomLevels.html

+0

Sin embargo, eso no va a ajustar la barra de zoom. –

+0

David, lo siento ignorado los controles. He agregado más mi respuesta - ver Editar. Básicamente, necesitaría definir las resoluciones que desea permitir. – Jonathan

+0

Aunque esta respuesta no funciona para los controles, sí solucionó mi problema, ya que simplemente quería limitar el uso del zoom por un cierto nivel (mediante la rueda de desplazamiento o zoomToExtent). ¡Gracias! – SoWeLie

0

Definición de resoluciones no resuelve el problema (incluso en v2.1) - No encontré ninguna solución pernament para esto, así que hice mi propio zoombar en JS - eso es lo que recomendaría a cualquiera que encuentre problemas con zoombar usando tiles personalizados.

+0

Encontré que definir resoluciones funcionaba perfecto. Sin embargo, tuve que hacer algunas matemáticas. – rocketsarefast

6

I conocer la forma más sencilla para restringir los niveles maxZoom para una capa XYZ era reemplazar el método getNumZoomLevels:

map.getNumZoomLevels = function(){ 
     return 10; 
     }; 

Este pevents zoom más allá del nivel 10 y también dibuja el control zoomBar correctamente. Esto y una combinación de la opción zoomOffset deberían permitirle controlar fácilmente el zoom mínimo/máximo sin tener que meterse con resoluciones o subclases.

+0

Hice el truco para mí. Es horrible, pero funciona. Gracias. – Countzero

+0

Estoy de acuerdo - es desagradable, pero después de algunas horas inútiles jugando con resoluciones que realmente no me importa ... – Graham

+0

Lo mismo aquí. Extraño que no hay una manera más directa de hacer esto, pero bueno. Gracias de todos modos. – Countzero

0

Terminé con esta solución, ya que no pude entender cómo utilizar zoomOffset en mi configuración.

 map.getNumZoomLevels = function(){ 
      return (options.maxzoom-options.minzoom+1); 
     }; 

     map.isValidZoomLevel = function(zoomLevel) { 
      var valid = ((zoomLevel != null) && 
       (zoomLevel >= options.minzoom) && 
       (zoomLevel <= options.maxzoom)); 
      if(!valid && map.getZoom() == 0){ 
       map.zoomTo(options.maxzoom - (options.maxzoom - options.minzoom)/2); 

      } 
      return valid; 
     } 
0

que hemos probado algo como esto y que funciona para mí:

map.newMoveTo = map.moveTo; 
map.moveTo = function(lonlat,zoom,options){ 
    return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false; 
}; 
2

Otras respuestas aquí se refieren a las versiones de OpenLayers anteriores a la versión 3.

Con OpenLayers 3, puede utilizar la opción maxZoom mapa cuando la inicialización del mapa, de la siguiente manera:

var map = new ol.Map({ 
     target: 'mapcontainer-001', 
     layers: layers, // Layers need to be initialized previously 
     view: new ol.View({ 
      center: ol.proj.transform([-5.12345, 42.12345], 'EPSG:4326', 'EPSG:3857'), 
      zoom: 12, 
      maxZoom: 19 
     }) 
    }); 

Más información se puede encontrar en OpenLayers documentación: http://openlayers.org/en/v3.0.0/doc/tutorials/concepts.html

0

Ahora uso este en el "Ver":

view: new ol.View({ 
    center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'), 
    zoom: 15, 
    maxZoom: 17, 
    minZoom: 6 
}), 

y funciona bien

Cuestiones relacionadas