Pergunta

Eu estive nisso o dia inteiro e honestamente estou sem ideias. Eu tenho algumas camadas WMS que gostaria de exibir/não exibir, dependendo do nível de zoom atual. Sim, passei pelos documentos da API e eles parecem claros como o dia, mas sigo tudo o que é sugerido e não estou obtendo os resultados desejados :(

Esta foi uma das fontes que eu olhei: http://trac.osgeo.org/openlayers/wiki/SettingZoomlevels

Então, para piorar as coisas, descobri que, se você tiver uma camada de base de mapa de rua aberta exibindo na carga, parece limitar seu controle sobre os níveis numzoomlevados do mapa, exatamente o que eu precisava, já que eu quero usar isso como minha camada de base de carregamento ...

Então, minhas perguntas são:

O que estou fazendo errado? É verdade que realmente não há solução alternativa no controle dos níveis de zoom ao usar uma camada de base de mapa de rua aberta na carga? Ou há algo que eu simplesmente não sei?

Aqui estão algumas das minhas tentativas de código: Tome 1: Tib_Villages Camada deve mostrar apenas quando o nível de zoom é 8-10, não funciona!

var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: null, //setting the map's zoom levels to null
            allOverlays: false
        }

var osm = new OpenLayers.Layer.OSM(); //MY base layer

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                );

Tome 2: a camada TIB_VILLAGES deve mostrar apenas quando o nível de zoom é 8-10, o mapa deve ter apenas 10 níveis de zoom, mas, em vez disso, tem 19, pois a camada de mapa de rua aberta a aplica, não funciona!

var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: 10, //setting the map's zoom levels to 10 only
            allOverlays: false
        }

var osm = new OpenLayers.Layer.OSM(); //MY base layer

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: null, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                )

;

Tome 3: Depois de se livrar da camada de base do mapa da rua Open na carga, o mapa possui apenas 10 níveis de zoom, conforme especificado, mas a camada TIB_VILLAGES deve mostrar apenas quando o nível de zoom é 8-10, não funciona!

var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: 10, //setting the map's zoom levels to 10
            allOverlays: false
        }

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                );

Todas as suas sugestões são sinceramente apreciadas!

elshae

Foi útil?

Solução

Eu recomendaria usar o MaxScale e o MinScale nas camadas em vez da resolução, mas isso talvez seja uma questão de gosto. :-) Não consigo me relacionar com um valor de resolução, mas é fácil entender uma escala e manter a longo prazo, quando outros olham para o seu código.

Outras dicas

Tente usar minResolution e maxResolution ao invés de minZoomLevel. Geralmente funciona bem. Você pode obter resolução para qualquer alavanca de zoom se ligar map.getResolution() método.

Outra opção é ouvir OpenLayers.Map's zoomend Visibilidade da camada de eventos e alternância de acordo. Algo assim:

map.events.on({ "zoomend": function (e) {
    if (this.getZoom() > 2) {
      layer1.setVisibility(false);
      layer2.setVisibility(true);
    }
    else {
      layer2.setVisibility(false);
      layer1.setVisibility(true);
    }
  }
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top