¿Cómo calcular la escala del nivel de zoom actual con parámetros como extensión, resolución?

8

Tengo los siguientes 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;

¿Quién me inspira a calcular la escala del nivel de zoom actual?

Brady
fuente

Respuestas:

14

La escala del mapa se define como una relación de displayed units / measured units. Su caso específico es un poco más difícil dado que tenemos que atravesar dos escalas y dos unidades diferentes para llegar a las unidades del mundo real.

Suponiendo que la escala horizontal es equivalente a la escala vertical, primero miramos la resolución horizontal de píxeles . Con esto intentamos encontrar las unidades de píxeles mostradas:

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)

En segundo lugar, convertir la escala de píxeles para encontrar la distancia de la pantalla por píxel:

      = real distance / pixel distance

      = 2.54cm (1 inch) / 90 pixels

      = 0.028 ~0.03

Reuniéndolo todo:

   0.028 cm per pixel = 166.66 metres / x

   x * 0.028 = 166.66

   x = 166.66 / 0.028

   x = 5952.1

Por lo tanto, su escala de mapa es aproximadamente 1: 6000.

nagytech
fuente
Muy apreciado por su descripción extremadamente detallada. Lo calcularé siguiendo tu camino. Gracias.
Brady
No hay problema. Si está calculando la escala repetidamente, es posible que desee condensar la ecuación. Solo lo he colocado en capas por simplicidad.
nagytech
Jaja, si! En realidad, quiero saber cuál es el nivel de zoom para el valor de escala '1: 3500'. Porque algunas capas en mi mapa se muestran solo cuando la escala actual es mayor '1: 3500'. Por cierto, soy nuevo en SIG.
Brady
1
Existe (por supuesto) una fuerte dependencia de obtener la distancia de píxel correcta. Por lo tanto, no será la misma "escala" en su computadora portátil y el proyector adjunto.
BradHards
44
¡Hay un error en la respuesta de nagytech, porque compara m por píxel con cm por píxel! ¡Al principio tienes que convertir 0.028cm a metro! ¡Entonces tienes 0,00028 metros y una escala de x = 166,66 / 0,00028 = 595214!
Marcel
9

Hay una buena información en el sitio web de Peter Robins que puede ayudarlo fácilmente con las capas abiertas.

Para encontrar la escala que representa una resolución, debes saber qué tan grande es un píxel; OL no lo sabe con certeza, pero hace algunas suposiciones razonables. Si observa Util.js y busca getScaleFromResolution (), encontrará que usa 2 constantes, INCHES_PER_UNIT y DOTS_PER_INCH, y el cálculo es "resolución * OpenLayers.INCHES_PER_UNIT [unidades] * OpenLayers.DOTS_PER_INCH". Para grados, esta es la resolución * 4374754 * 72 (314,982,288), por lo que la escala máxima es 1: 442,943,843. En metros, la escala máxima es 156543.0339 * 39.3701 * 72 (2,834.6472) o 1: 443,744,273.

entonces la fórmula:

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

Espero que te ayude...

Aragón
fuente
En OpenLayers 2.14 map.getResolutions no funcionó para mí, pero conseguir que las resoluciones de la capa de base hicieron: map.baseLayer.resolutions. Tenga en cuenta, sin embargo, esto puede dar lugar a más valores que los que hay niveles de zoom ...
abettermap