Archivo de la etiqueta: mapproxy

Instalando MapProxy en windows, paso a paso


La semana pasada tuve el placer de formar parte de los formadores de los voluntarios de EUROSHA, un grupo de 25 jóvenes destinados a levantar cartografía en diversos países de África, como parte de las actividades del HOT. Uno de los problemas a los que se enfrentan estos voluntarios es una conexión a internet no muy fiable.

Es perfectamente posible editar datos de OSM offline (guardando los datos a fichero, editando, y resolviendo conflictos de versiones a posteriori), pero lo que no se puede hacer es consultar cartografía de fondo para comparar. Había que hacer algo al respecto. Y la solución fue instalar MapProxy, que permite tomar imágenes ráster de varias fuentes y servirlas como WMS, en local. En un portátil con linux (y python, python-pil y python-pip), instalarlo y probar la configuración por defecto fue una cuestión de minutos.

Ahora bien, los ordenadores que el HOT va a desplegar en África van con windows, principalmente por no disponer del tiempo suficiente para hacer una instalación completa con las herramientas adecuadas para la situación. Improvisemos pues, e instalemos MapProxy tal y como sugiere el manual

We advise you to install MapProxy into a virtual Python environment.

Bueno, pues no hagáis esto. Al instalar python desde cero, lo más probable es que os encontréis con problemas a la hora de instalar las librerías necesarias, en concreto PIL (Python Imaging Library). La manera sencilla de instalar Python para hacer funcionar MapProxy encima es OSGeo4W. Así que descargamos el instalador, elegimos una instalación avanzada, y nos aseguramos de que al menos los paquetes para python y python-pil se van a instalar:

El siguiente paso es descargarse distribute-setup.py y ejecutarlo dentro de una shell de OSGeo4W como administrador:

En esa misma consola, ejecutamos un easy_install mapproxy, y justo después un easy_install pyproj:

En este punto, los ejecutables de MapProxy ya están instalados. Lo podemos comprobar ejecutando mapproxy-util:

Ahora bien, MapProxy es inútil sin un fichero de configuración que le diga qué servicios tiene que cachear. Así que hacemos copia-pega de una configuración de MapProxy para OpenStreetMap, guardamos el fichero resultante como (por ejemplo) C:\OSGeo4W\mapproxy.yaml, y lanzamos mapproxy-util:

¡Et voilà! Nuestro MapProxy está funcionando y respondiendo a peticiones desde localhost:8080, cacheando tiles de OSM para convertirlas en un servicio WMS:

El resto de opciones se pueden consultar en el manual de MapProxy, pero hay unas cuantas cosas a tener en cuenta:

  • MapProxy siempre debe ejecutarse dentro del entorno de OSGeo4W.
  • … lo que quiere decir que si queremos que se ejecute automáticamente, se puede hacer un .bat haciendo copia-pega de C:\OSGeo4W\osgeo4w.bat, y modificando el comando que se lanza en la última línea de ese script.
  • La utilidad para inicializar o refrescar la caché, mapproxy-seed.exe, ha de ejecutarse también dentro del entorno de OSGeo4W.
  • Los datos cacheados se almacenan en el directorio que se especifique en el fichero de configuración, y es relativo a la ruta donde se lanza mapproxy.

Probando MapProxy


Durante bastante tiempo hemos tenido a TileCache como «el producto» (libre por supuesto) a usar cuando queríamos montar un servidor de teselas que acelerara nuestros clientes web, usando TMS o WMS-C como protocolos de acceso. Desde hace un tiempo GeoWebCache ha ido tomando forma, lo que empezó como una beca para un Google Summer of Code se ha ido convirtiendo en un producto funcional. Pero desde hace tiempo ha llegado un nuevo chico al barrio, se llama MapProxy y tiene algunas características bastante interesantes.

MapProxy tecnológicamente hablando es un desarrollo escrito en Python, que permite desplegarse en lo que se llama un “entorno virtual” que permite aislar tu entorno de desarrollo del resto de tu sistema. Igualmente trae un sencillo servidor web para desarrollo y para usarlo en producción debemos acudir a FastCGI o bien a WSGI, un estándar Python para desplegar aplicaciones web. El despliegue por tanto es más o menos similar al de TileCache.

MapProxy no sólo se expone como un servidor TMS o WMS-C, también y esta es su mayor diferencia, se expone como un servidor WMS normal. Es decir, a partir de los orígenes que definamos y que se irán almacenando cacheados en disco, además de como servicios de teselas MapProxy también podrá atender a peticiones que caigan fuera de los límites de dicha cuadrícula. Para ello compondrá y reproyectará si fuera necesario la imagen al tamaño y sistema de referencia requerido.

Esto abre escenarios muy interesantes, por ejemplo usar nuestras caches con clientes pesados como gvSIG y no sólo tirando de servicios WMS existentes sino también de otros que únicamente fueran servidos mediante TMS. Es decir, por decirlo de forma sencilla, podemos montar un WMS de OpenStreetMap. Claro que un origen como OSM no se verá muy bien en las zonas intermedias entre resoluciones de la caché porque las etiquetas y elementos lineales se distorsionarán bastante. Pongo un pequeño ejemplo a una escala bastante grande, de cómo se vería OSM en gvSIG.

Más usos: cachear OSM u otros orígenes muy frecuentados en nuestra organización (como por ejemplo el PNOA), permitiendo a nuestros técnicos no sólo consumir estos datos desde clientes ligeros de visores corporativos sino también desde clientes pesados claro. Podríamos limitar esas caches tanto en su extensión geográfica, como en su duración temporal así como en su espacio ocupado en disco porque  MapProxy también añade bastante «azúcar» en la parte de la generación y mantenimiento de sus caches, pero esto lo dejaré para otro día.

Desgraciadamente MapProxy aún no soporta el estándar WMTS aunque diría que esto se resolverá en poco tiempo y hace otras cosas interesantes como redirigir las peticiones getFeatureInfo y getLegendGraphic a las capas originales, cosa que TileCache (si no me equivoco) tampoco hace.

Instalar MapProxy en una distribución GNU/Linux moderna es bastante sencillo, la documentación es muy buena (usan mi querido sphinx) y su lista de correo es bastante activa como para ir salvando cualquier escollo que vayamos encontrando.

En este enlace a pastebin dejo una configuración básica bastante autoexplicativa en la que se sirven dos capas, la de OSM de la figura anterior y también el WMS-C del PNOA. Me hubiera gustado conectar al PNOA mediante el protocolo TMS pero no ha habido manera, al final he usado una capa WMS, teniendo que eliminar los metatiles porque MapProxy los usa por defecto en capas WMS. En cualquier caso el ejemplo funciona a la perfección.

A continuación dejo un pantallazo de gvSIG mostrando en dos vistas el PNOA en vivo y el cacheado, se puede ver que no hay diferencia apreciable entre ambos. Lo que se ve por cierto es el Gulliver de Valencia, un parque rompepantalones muy popular.

Como conclusión a este ¿primer? artículo sobre MapProxy simplemente recomendar su evaluación si se tiene que desplegar un servidor de teselas nuevos y el entorno tecnológico es el adecuado. Servir WMS a partir de caches añade una funcionalidad que en determinados escenarios puede ser más que interesante.