Min/Max Zoom Nível em OpenLayers
-
27-09-2019 - |
Pergunta
Estou usando o OpenLayers para exibir um mapa em uma página da web. Estou usando ladrilhos do Cloudmade, mas os mesmos problemas ocorrem com os mapas Mapnik do OpenStreetMap.
Estou tentando restringir o mapa para que o usuário não possa aumentar o zoom até a visão do mundo - quero que eles permaneçam aproximadamente em um zoom no nível da cidade no mínimo.
Eu tentei usar o minZoomLevel
/ maxZoomLevel
/ numZoomLevels
propriedades; apenas o maxZoomLevel
e numZoomLevels
propriedades parecem funcionar, enquanto o minZoomLevel
A propriedade parece ser completamente ignorada.
Existe outra maneira de conseguir isso?
Solução
O MinZoomlevel não é suportado para camadas XYZ, das quais OSM é uma subclasse.
Veja os seguintes ingressos para soluções alternativas:
- http://trac.osgeo.org/openlayers/ticket/2909 (Aplique um deslocamento de zoom)
- http://trac.osgeo.org/openlayers/ticket/2189 (Adicione Patch Minzoomlevel)
Outras dicas
Você poderia substituir o isValidZoomLevel
função. Algo assim (não testado):
OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
return ( (zoomLevel != null) &&
(zoomLevel >= 2) && // set min level here, could read from property
(zoomLevel < this.getNumZoomLevels()) );
}
EDITAR
Ou você precisaria substituir as resoluções disponíveis, veja o exemplo aqui: http://dev.openlayers.org/examples/zoomlevels.html
Eu achei a maneira mais simples de restringir os níveis de maxzoom para uma camada XYZ era substituir o método GetNumZoomLevels:
map.getNumZoomLevels = function(){
return 10;
};
Esses peves diminuem o zoom além do nível 10 e também desenham o controle do zoombar corretamente. Este e uma combinação do zoomOffset
A opção deve permitir que você controla facilmente o zoom min/max sem precisar mexer com resoluções ou subclasses.
Outras respostas aqui consulte as versões do OpenLayers antes da versão 3.
Com o OpenLayers 3, você pode usar o maxZoom
Opção de mapa ao inicializar o mapa, como segue:
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
})
});
Mais informações podem ser encontradas na documentação do OpenLayers: http://openlayers.org/en/v3.0.0/doc/tutorials/conccepts.html
Agora eu uso isso no "View":
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
E funciona bem
Definir resoluções não resolve o problema (mesmo na v2.1) - eu não encontrei nenhuma correção de pernamento para isso, então fiz meu próprio zoombar no JS - é isso que eu recomendaria para quem encontrar problemas com o Zoombar usando o costume azulejos.
Acabei com essa solução, pois não consegui descobrir como usar o ZooMoffset na minha configuração.
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;
}
Eu tentei algo assim e funciona para mim:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
A melhor resposta que encontrei (incluindo um exemplo) foi em OpenLayers - Limite o número de níveis de zoom. Eu não colo aqui, por favor, veja as instruções ali.