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?

Foi útil?

Solução

O MinZoomlevel não é suportado para camadas XYZ, das quais OSM é uma subclasse.

Veja os seguintes ingressos para soluções alternativas:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top