Folleto + Proj4Leaflet + EPSG3995 + WMS

8

Estoy tratando de admitir una capa WMS con una proyección estereográfica polar norte (EPSG3995) en el folleto, pero no puedo hacer que funcione.

Usé Proj4Leaflet y he creado la proyección con las resoluciones dadas por GeoServer (GeoServer sirve la capa WMS, ver imagen unida).

Resoluciones EPSG3995

En el siguiente jsfiddle: https://jsfiddle.net/gaubert/Lyojcrzo/ He intentado implementarlo y, si haces zoom en el mapa del folleto, ¿verás que los mosaicos están fuera de lugar?

¿Qué falta para que funcione? ¿Necesito implementar una transformación o método de proyecto?

Zoobert
fuente

Respuestas:

5

Hay varios problemas aquí.


Primero, permítanme citar de http://leafletjs.com/examples/wms/wms.html (el énfasis es mío):

También tenga en cuenta que la ficha soportes muy pocos sistemas de coordenadas: CRS:3857, CRS:3395y CRS:4326(consulte la documentación de L.CRS). Si su servicio WMS no sirve imágenes en esos sistemas de coordenadas, es posible que necesite usar Proj4Leaflet para usar un sistema de coordenadas diferente en Leaflet. Aparte de eso, solo use el CRS correcto al inicializar su mapa, y cualquier capa WMS agregada lo usará :

var map = L.map('map', {
    crs: L.CRS.EPSG4326
});

var wmsLayer = L.tileLayer.wms('http://demo.opengeo.org/geoserver/ows?', {
    layers: 'nasa:bluemarble'
}).addTo(map);

El código en su violín hace lo contrario, especifica el CRS como una opción para la capa wms, en lugar de como una opción para el mapa:

wmsBKLayer = new L.tileLayer.wms('http://eumetview.eumetsat.int/geoserv/wms', {
    layers: 'bkg-raster:bkg-raster',
    crs: customCRS
}

var map = new L.map('map', {
   // No CRS option here!!
});

Especifique el CRS en las opciones del mapa , y debería estar bien.


Segundo, instanciación de objetos. El folleto utiliza camelCase con la primera letra mayúscula para las clases (por ejemplo, L.TileLayeres una clase) y camelCase que comienza con letras minúsculas para los métodos de fábrica (por ejemplo, L.tileLayeres un método de fábrica).

var foo = L.tileLayer(...);     // Preferred
var foo = new L.TileLayer(...); // OK, but not preferred
var foo = L.TileLayer(...);     // Nope, one cannot call a class
var foo = new L.tileLayer(...); // Nope nope nope nope, one cannot create an instance of a factory

Lea « /programming/8698726/constructor-function-vs-factory-functions » si le resulta confuso.


Tercero, citando https://kartena.github.io/Proj4Leaflet/ :

¿Está utilizando Leaflet 1.0 beta 1 o versiones de desarrollo de Leaflet? Entonces necesita usar la rama de desarrollo de Proj4Leaflet.

Esto significa que no hay una versión lanzada de proj4leaflet que funcione con Leaflet 1.

En su violín, está utilizando Leaflet 1.0.2 y proj4leaflet 0.7.2. Esos simplemente no funcionarán juntos.

Utilice una versión inferior de Leaflet o cree (e implemente y use) una versión más nueva de proj4leaflet. Tenga en cuenta que proj4leaflet podría necesitar un poco de ayuda con su mantenimiento, ya que @liedman ya no puede soportarlo.

Si tiene tiempo, le sugiero que se ponga en contacto con los mantenedores actuales, para ayudarlo con una nueva versión compatible con Leaflet 1.0.0.


Si uno aborda estos tres problemas, todo volverá a funcionar. Vea un ejemplo de trabajo en:

https://playground-leaflet.rhcloud.com/giwo/edit?html,output

IvanSanchez
fuente
Un millón de gracias por la rápida respuesta. Se corrigieron todos los problemas y funciona. Tengo una pregunta más si puedo, ¿por qué no veo el mapa completo sino solo una parte de Europa? ¿Es un problema de resolución?
zoobert
Ok, encontré mi camino en la documentación inexistente ;-). Necesitaba en la proyección definir también los límites y el origen. Una vez agregado, se veía mejor. De nuevo, gracias por tu ayuda.
zoobert
De nada. Si le falta la documentación, recuerde que tanto Leaflet como proj4leaflet estarán encantados de recibir solicitudes de extracción para mejorar los documentos.
IvanSanchez
¿No es posible agregar una capa wms que tenga crs diferentes a los crs del mapa?
senol ozgur