2 votos

Openlayers 5 scaleline ha dado resultados erróneos

Estoy utilizando Openlayers 5 (módulos de NPM) y estoy teniendo un problema con una línea de escala en mi mapa.

// from https://epsg.io/2264.js
proj4.defs('EPSG:2264', '+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs');

register(proj4)

opts = {
  extent: extent,
  center: [
    (extent[0] + extent[2]) / 2,
    (extent[1] + extent[3]) / 2
  ],
  maxResolution: 1777.77777777778,
  minZoom: 2,
  maxZoom: 22,
  zoomFactor: 2,
  zoom: 2.5
}

// ---------------
// I get different results in scaleline depending
// upon which of these projection lines is used

opts.projection = 'EPSG:2264';
//opts.projection = new Projection({code: 'EPSG:2264'});

// -------------

let view = new View(opts);
let map = new Map({
  view: view,
  layers: []
});
map.addControl(new ScaleLine({
    units: 'us'
}));

Obtengo diferentes resultados de la línea de escala dependiendo de la línea de proyección de arriba que comente.

Cuando el mapa aparece por primera vez, el uso de la primera línea de proyección de arriba da una línea de escala de 2 millas. Si se utiliza la segunda, se obtiene una línea de escala de 5 millas. Se trata de la misma longitud de la línea de escala y de la extensión del mapa, pero con una etiqueta de distancia diferente en la línea de escala. La segunda parece ser la correcta.

¿No deberían dar los mismos resultados?

¿Estoy haciendo algo mal o debería presentar un problema?

1voto

Bob Johnson Puntos 26

Puede ser un error, si compruebas este ejemplo de OpenLayers https://openlayers.org/en/latest/examples/scaleline-indiana-east.html que se abre a 20 millas es un muy largo 20 millas en el suelo. Parece que hay un problema cuando las unidades de proyección están en pies, he comprobado las proyecciones en metros y no había ningún problema.

He encontrado dos soluciones

  1. Utilice su primer método, pero añada una función getPointResolution a la proyección devuelta por proj4 y asuma (a diferencia de web mercator) que la resolución no varía a través de la proyección:

import {get as getProjection} from 'ol/proj.js';

getProjection('EPSG:2264').setGetPointResolution(function(r) { return r; });

  1. Utiliza tu segundo método, pero para que funcione en todos los casos (por ejemplo, la reproyección) necesita más opciones:

opts.projection = new Projection({ code: 'EPSG:2264', units: 'us-ft', getPointResolution: function(r) { return r; } });

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X