OpenLayers: use escalas en lugar de resoluciones

8

Aventurándose en el OpenLayerscódigo fuente, parece que todo lo relacionado con los niveles de zoom se hace usando resoluciones. Es justo, ya que esto se relaciona directamente con el espacio de la pantalla.

Sin embargo, me gustaría utilizar escalas en su lugar y definir más explícitamente las escalas permitidas.
- ¿Es posible?

Hasta ahora he creado un conjunto de escalas que transformo en resoluciones:

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,
    ...
});

Mi problema es que se respetan la primera y la última escala, pero entre la resolución actual convertida en escala no se encuentra entre las que especifiqué.
- ¿Qué me he perdido?

Chau
fuente

Respuestas:

18

Para usar escalas en su mapa:

  • Establezca solo la opción 'escalas'. No establezca maxResolution, minResolution, maxScale, minScale, numZoomLevels ni ninguna otra propiedad relacionada con la escala. Ajústelo a una matriz de denominadores de escala (o escalas).
  • Configure una unidad: tenga en cuenta que para metros, debe ser 'm', para grados, 'grados', etc.
  • Puede establecer un maxExtent. No establezca un minExtent.

Una vez que haga esto, las escalas deben usarse en su mapa. (Tenga en cuenta que se ordenarán desde la mayoría alejada - denominador de escala más alta - hasta la mayoría alejada - denominador de escala más pequeña).

En su caso, esto debería verse exactamente como:

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

Luego agrega tu capa.

Tenga en cuenta que las opciones de resolución basadas en capas 'controlarán' el mapa; normalmente solo debe especificar estas cosas en el mapa o las capas, no ambas.

Tenga en cuenta que la capa base controla las escalas generales del mapa; las superposiciones estarán completamente controladas por capas base.

Tenga en cuenta que OpenLayers utiliza una suposición de DPI de 72. Para controlar esta configuración de DPI, puede establecer OpenLayers.DOTS_PER_INCH antes de crear su mapa. Un valor típico (utilizado por la especificación SLD) será diferente, por lo que si esta suposición es importante para usted, debe cambiar este parámetro de configuración para que coincida con su servidor.

Christopher Schmidt
fuente
1
@ Christopher : Muchas gracias. Eso era exactamente lo que estaba buscando y está funcionando como un encanto :) Aunque extraño encontrar el scalesparámetro en la fuente o en los 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);

Las unidades deben establecerse: unidades: "grados"

Cadena: las unidades en las que se muestra la capa.

Esto afecta el cálculo de la resolución de escala.

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

Mapperz
fuente