javascript - osm - openlayers wms example
Nivel de zoom mínimo/máximo en OpenLayers (9)
Estoy usando OpenLayers para mostrar un mapa en una página web. Estoy usando mosaicos de CloudMade, pero ocurren los mismos problemas con los mosaicos de MapStreet de OpenStreetMap.
Estoy tratando de restringir el mapa para que el usuario no pueda acercarse por completo a la vista del mundo; quiero que se mantenga en un nivel aproximado de la ciudad como mínimo.
He intentado usar las minZoomLevel
/ maxZoomLevel
/ numZoomLevels
; solo las propiedades maxZoomLevel
y numZoomLevels
parecen funcionar, mientras que la propiedad minZoomLevel
parece ignorarse por completo.
¿Hay otra manera de lograr esto?
Ahora uso esto en la "Vista":
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
Definir resoluciones no resuelve el problema (incluso en v2.1). No encontré ninguna solución permanente para esto, así que hice mi propio zoombar en JS. Eso es lo que recomendaría a cualquiera que tenga problemas con zoombar usando la costumbre. azulejos
Descubrí que la forma más sencilla de restringir los niveles de maxZoom para una capa XYZ era anular el método getNumZoomLevels:
map.getNumZoomLevels = function(){
return 10;
};
Estos eventos van más allá del nivel 10 y también dibujan el control de la barra de zoom 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.
La mejor respuesta que encontré (incluido un ejemplo) fue en OpenLayers: limita el número de niveles de zoom . No lo pego aquí, por favor vea las instrucciones allí.
Otras respuestas aquí se refieren a las versiones de OpenLayers anteriores a la versión 3.
Con OpenLayers 3, puede usar la opción de mapa maxZoom
al inicializar el 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
})
});
Puede encontrar más información en la documentación de OpenLayers: http://openlayers.org/en/v3.0.0/doc/tutorials/concepts.html
Podría 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 necesitaría anular las resoluciones disponibles, consulte el ejemplo aquí: http://dev.openlayers.org/examples/zoomLevels.html
Probé algo como esto y funciona para mí:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
Terminé con esta solución porque no pude averiguar cómo usar 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;
}
minZoomLevel no es compatible con las capas XYZ, de las cuales OSM es una subclase.
Vea las siguientes entradas para soluciones provisionales:
- http://trac.osgeo.org/openlayers/ticket/2909 (aplicar un desplazamiento de zoom)
- http://trac.osgeo.org/openlayers/ticket/2189 (agregue el parche minZoomLevel)