En este post vamos a aprender algunos conceptos de cómo trabaja openlayers con sistemas de coordenadas, lo que se puede y no se puede hacer, y como añadir librerías que nos ayuden a trabajar con sistemas de coordenadas.

En primer lugar para entender cómo trabaja OpenLayers en referencia a sistemas de coordenadas debemos de saber:

openlayers_monster

  • Todas las capas que queramos mostrar en el visor estarán condicionadas por el sistema de coordenadas de la capa base, es decir, se mostrarán en el sistema de coordenadas de ésta. Es el mismo concepto que cuando en ArcMap ponemos un sistema de coordenadas al contenedor de capas.
  • Para mostrar un mapa en un sistema de coordenadas concreto, debemos saber si el servicio wms al que le estamos pidiendo esa capa, lo soporta. Esto, si no somos nosotros los que publicamos el servicio, lo podemos saber mediante una petición GetCapabilities al servicio.

PNOA_epsg

Aquí podemos ver todos los sistemas de coordenadas en los que le podemos pedir al servicio del PNOA que nos devuelva la imagen WMS.

Como podemos ver en la imagen, es posible demandar al servicio de mapas que nos devuelva la imagen en el sistema EPSG:23030, que corresponde con el sistema de coordenadas ED50 / UTM zona 30N.

Si hacemos por tanto esta petición y ponemos como capa base el PNOA, todas las capas que superpongamos a esta deberán soportar peticiones a sus respectivos servicios wms en EPSG:23030.

Imaginemos que vamos a superponer capas del servicio WMS de catastro, lo primero que debemos de hacer es una petición GetCapabilities para saber si su servicio soporta peticiones en este sistema de coordenadas.

23030_Catastro

Ya tenemos el mapa definido para el EPSG:23030, hemos cargado como capa base el PNOA, que sabemos que se puede cargar en ese sistema de coordenadas, y como capa de superposición el catastro, que sabemos que también es servida en EPSG:23030. Por lo que todo debería funcionar correctamente.

pnoa_catastro_bytacora

Siempre podríamos mostrar nuestras capas del Catastro sobre el PNOA si antes nos cercioramos de que el sistema de coordenadas en el cual queremos mostrarlo es soportado por ambos servicios wms. La capa de superposición debe poderse servir en el sistema de la capa que funciona como base.

Si nos fijamos en otro parámetro que podemos definir en relación con los sistemas de coordenadas es el siguiente.

Estudiando el caso concreto que acabamos de definir, en el cual pedimos un mapa en unas coordenadas que ya soporta nuestro servicio wms y que todas las capas están en este sistema, el ratón debería de mostrar las coordenadas correctamente en ESPG:23030.

Coordenadas 23030 Bytacora

Las coordenadas de ese punto serían:

Entonces, si mostramos nuestro mapa en 23030 y queremos ver nuestras coordenadas de ratón e interactuar con ellas en 23030, de ésta manera ya lo tendríamos y funcionaría correctamente.

Pero ahora imagina que queremos cargar nuestro mapa en 23030, el cual es soportado por nuestros servicios wms sin problemas, pero queremos capturar nuestras coordenadas de ratón en EPSG:4326 (WGS84). Por lógica, sólo tendríamos que modificar el valor de displayProjection, que vimos antes, a EPSG:4326. Pero si hacemos esto y volvemos a cargar el mapa, nos damos cuenta de que nuestras coordenadas mostradas siguen siendo exactamente las mismas.

Coordenadas 23030 Bytacora

El problema radica en que OpenLayers por defecto sólo trabaja con dos sistemas de coordenadas entre los que puede hacer transformaciones de coordenadas de forma nativa.

  • EPSG:4326 Sistema de referencia WGS84.
  • EPSG:900913: Web Spherical.

Cuando nos referimos a transformaciones de coordenadas, nos referimos a transformaciones numéricas, es decir, openlayers no reproyecta una capa raster wms a otro sistema de coordenadas.

Para trabajar con otros sistemas de coordenadas diferentes a estos, como es nuestro caso, que trabajaremos con EPSG:23030 (UTM_ED50_N_Z30), debemos de cargar una librería denominada pro4js que nos permite hacer las operaciones matemáticas necesarias para hacer las transformaciones.

Esta librería sólo es necesaria si necesitas hacer transformaciones, ya que como hemos visto, si sólo cargas capas y muestras coordenadas, sin hacer operaciones con ellas, todo funciona de manera correcta.

Lo primero que debemos de hacer es descargar la librería Proj4js y colocarla en algún directorio accesible, por ejemplo en la carpeta lib de openlayers.

http://trac.osgeo.org/proj4js

A continuación, cargar la librería en nuestro documento haciendo referencia a la ubicación de la misma.

Y ahora definimos el nuevo sistema de coordenadas en el archivo principal, pero fuera de la función que carga el mapa al cargar el documento html, llamada “init” normalmente.

Ahora ya podremos cambiar el valor de la variable displayProjection a EPSG:4326, y si nos fijamos ahora en las coordenadas de nuestro punto, podemos ver que ya se muestra en las coordenadas correctas. Por lo tanto OpenLayers está realizando un cálculo de coordenadas al vuelo para mostrarte las coordenadas del ratón en el sistema que se lo hemos pedido.

Coordenadas 4236 Bytacora

La biblioteca Proj4js sólo es necesaria cuando se van a realizar transformaciones en capas vectoriales o a convertir coordenadas de un punto del mapa, ya sea para mostrarlo o para utilizarlo como variable en otros procesos, como puede ser establecer el centro del mapa.

Openlayers, por tanto, no es capaz de reproyectar una capa wms, ya que esta es servida en formato raster. Esto quiere decir que si por ejemplo quieres establecer como capa base GoogleMaps (EPSG:900913), todas las capas que quieras superponer a esta deberán poderse servir en ese sistema de coordenadas.

No puedes utilizar las capas de google como base de cualquier servicio WMS. La mejor solución para poder utilizar las capas de google de manera correcta sería servirlas desde tu servidor en EPSG:900913 o bien utilizar un map proxy que reproyectara la misma.

Un saludo y espero que te haya parecido interesante.