Como calcular a escala do nível de zoom atual com parâmetros como extensão, resolução?

8

Eu tenho os seguintes parâmetros:

Width and height of Map: 450px, 560px

units : 'meters'

maxExtent : new OpenLayers.Bounds(806677.9759,802420.9858,8876817.5647,853497.8186405064)

resolutions: [199.51887828322785, 99.75943914161392, 49.87971957080696, 
24.93985978540348, 12.46992989270174, 6.23496494635087, 3.117482473175435, 
1.5587412365877176, 0.7793706182938588, 0.3896853091469294, 0.1948426545734647, 
0.09742132728673235, 0.048710663643366174, 0.024355331821683087, 0.012177665910841544,
0.006088832955420772, 0.003044416477710386, 0.001522208238855193]

numZoomLevels: 18

OpenLayers.DOTS_PER_INCH = 90.71428571428572;

Quem me inspirou a calcular a escala do nível de zoom atual?

Brady
fonte

Respostas:

14

A escala do mapa é definida como uma proporção de displayed units / measured units. Seu caso específico é um pouco mais difícil, pois temos que percorrer duas escalas e duas unidades diferentes para chegar às unidades do mundo real.

Assumindo que a escala horizontal é equivalente à escala vertical, primeiro examinamos a resolução de pixels horizontais . Com isso, estamos tentando encontrar o pixel das unidades exibidas:

scale = display / measured

      = feature / pixels

      = |(806677m - 876817m)| / 450px // I'm assuming you've made a typo with 8876817

      = 70140 / 450

      = 166.66 metres per pixel (inversely 0.006 pixels per metre)

Em segundo lugar, convertendo a escala de pixels para encontrar a distância da tela por pixel:

      = real distance / pixel distance

      = 2.54cm (1 inch) / 90 pixels

      = 0.028 ~0.03

Reunindo tudo:

   0.028 cm per pixel = 166.66 metres / x

   x * 0.028 = 166.66

   x = 166.66 / 0.028

   x = 5952.1

Portanto, sua escala de mapa é de aproximadamente 1: 6000.

nagytech
fonte
Muito apreciado por sua descrição extremamente detalhada. Vou calcular seguir o seu caminho. Obrigado.
Brady
Sem problemas. Se você estiver calculando a escala repetidamente, poderá condensar a equação. Eu apenas o coloquei em camadas por simplicidade.
Nagytech 19/07/12
Haha, sim! Na verdade, quero saber qual é o nível de zoom para o valor da escala '1: 3500'. Porque algumas camadas no meu mapa são exibidas apenas quando a escala atual é maior '1: 3500'. BTW, eu sou novo em GIS.
Brady
1
Existe (é claro) uma forte dependência de obter a distância correta de pixels. Portanto, não será a mesma "escala" no seu notebook e no projetor conectado.
21712 BradHards
4
Há um erro na resposta da nagytech, porque ele compara m por pixel a cm por pixel! No começo você tem que converter 0.028cm para metro! Então você tem 0,00028 metros e uma escala de x = 166,66 / 0,00028 = 595214!
marcel
9

Há uma boa informação no site de Peter Robins , que pode ajudá-lo facilmente com os openlayers.

Para encontrar a escala que uma resolução representa, você precisa saber o tamanho de um pixel; A OL não sabe ao certo, mas faz algumas suposições razoáveis. Se você olhar no Util.js e procurar getScaleFromResolution (), verá que ele usa 2 constantes, INCHES_PER_UNIT e DOTS_PER_INCH, e o cálculo é "resolução * OpenLayers.INCHES_PER_UNIT [units] * OpenLayers.DOTS_PER_INCH". Para graus, essa é a resolução * 4374754 * 72 (314.982.288); portanto, a escala máxima é 1: 442.943.843. Em metros, a escala máxima é 156543.0339 * 39.3701 * 72 (2.834.6472) ou 1: 443.744.273.

então a fórmula:

 map.getResolutions * OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH

espero que ajude você ...

Aragão
fonte
Em OpenLayers 2,14 map.getResolutions não funcionou para mim, mas recebendo as resoluções da camada de base fez: map.baseLayer.resolutions. Lembre-se, no entanto, isso pode resultar em mais valores do que os níveis de zoom ...
abettermap