OpenLayers: use escalas em vez de resoluções

8

Se aventurando no OpenLayerscódigo-fonte, parece que tudo relacionado aos níveis de zoom é feito usando resoluções. Justo o suficiente, pois isso se relacionava diretamente ao espaço da tela.

No entanto, eu gostaria de usar escalas e definir mais explicitamente as escalas permitidas.
- Isso é possível?

Até agora, criei um conjunto de escalas que transformo em resoluções:

var scales = [500, 1000, 2000, 4000, 10000, 25000, 50000];
var resolutions = [];
for(var i = 0; i < scales.length; i++) {
    resolutions.push(OpenLayers.Util.getResolutionFromScale(scales[i], units));
}

map = new OpenLayers.Map('', {                        
    ...
    minScale: scales[scales.length - 1],
    maxScale: scales[0],        
    resolution: resolutions,
    numZoomLevels: scales.length,
    ...
});

Meu problema é que a primeira e a última escala são respeitadas, mas entre a resolução atual convertida em escala não está entre as que eu especifiquei.
- O que eu perdi?

Chau
fonte

Respostas:

18

Para usar escalas no seu mapa:

  • Defina apenas a opção 'escalas'. Não defina maxResolution, minResolution, maxScale, minScale, numZoomLevels ou qualquer outra propriedade relacionada à escala. Defina-o como uma matriz de denominadores de escala (ou escalas).
  • Configure uma unidade: observe que, para metros, deve ser 'm', para graus, 'graus' etc.
  • Você pode definir um maxExtent. Não defina um minExtent.

Depois de fazer isso, as escalas devem ser usadas no seu mapa. (Observe que eles serão ordenados do mais diminuído de zoom - denominador de maior escala - para o mais ampliado - menor denominador de escala.)

No seu caso, isso deve ser exatamente como:

map = new OpenLayers.Map('map', {                        
  scales: scales,
  units: 'm' // or whatever       
});

Em seguida, adicione sua camada.

Observe que as opções de resolução baseadas em camadas 'controlarão' o mapa; normalmente, você deve especificar apenas essas coisas no mapa ou nas camadas, não nas duas.

Observe que a camada base controla as escalas gerais do mapa; as sobreposições serão totalmente controladas pelas camadas de base.

Observe que o OpenLayers usa uma suposição de DPI de 72. Para controlar essa configuração de DPI, você pode definir o OpenLayers.DOTS_PER_INCH antes de criar seu mapa. Um valor típico (usado pela especificação do SLD) será diferente; portanto, se essa suposição for importante para você, altere esse parâmetro de configuração para corresponder ao seu servidor.

Christopher Schmidt
fonte
1
@ Christopher : Muito obrigado. Era exatamente isso que eu estava procurando e funcionava como um encanto :) Sinto falta de encontrar o scalesparâmetro na fonte ou nos documentos: dev.openlayers.org/docs/files/OpenLayers/Map-js.html
Chau
1
 var options = { scales: [50000000, 30000000, 10000000, 5000000],
                resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125],
                minScale: 50000000,
                maxResolution: "auto",
                maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
                maxResolution: 0.17578125,
                maxScale: 10000000,
                minResolution: "auto",
                minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
                minResolution: 0.0439453125,
                numZoomLevels: 5,
                units: "degrees"
              };
map = new OpenLayers.Map( $('map') , options);

É necessário definir unidades: units: "degrees"

String - As unidades nas quais a camada será exibida.

Isso afeta o cálculo da escala de resolução.

Fonte oficial: http://trac.openlayers.org/wiki/SettingZoomLevels

Mapperz
fonte