MapProxy es una herramienta que aumenta el rendimiento de un WMS mediante un pre-dibujo y almacenamiento de imágenes de mapa, para dar una respuesta más rápida a las solicitudes de los clientes. Puede tomar múltiples orígenes de datos y podemos utilizarlo para acelerar los servicios proporcionados por QGIS Server.
En este artículo vamos a ver algunas de las principales características de MapProxy y cómo instalarlo desde OSGeo4W.
Índice
¿Qué es MapProxy?
MapProxy es un proxy de código abierto para datos geoespaciales. Almacena en caché, acelera y transforma los datos de los servicios de mapas existentes y sirve a cualquier cliente GIS web o de escritorio.
MapProxy actúa como un intermediario entre el servidor de mapas (QGIS Server) y el cliente. Hace que los servicios se sirvan más rápido.
MapProxy es un servidor de teselas (WMS-C, TMS, WMTS, KML SuperOverlays).
MapProxy lee datos de las siguientes fuentes:
- WMS (1.0.0–1.3.0).
- WMTS/TMS.
- Configuraciones de Mapserver y Mapnik.
- Cualquier fuente compatible con TileCache, Google Maps o BingServidores.
- ArcGIS REST y archivos de caché compactos.
MapProxy también puede:
- Reproyectar WMS y fuentes de teselas a otros SRS.
- Almacenar mosaicos idénticos solo una vez (por ejemplo, mosaicos de océano).
- Incrustar marca de agua en mosaicos.
MapProxy como servicio WMS
MapProxy no es solo una herramienta para servir caches de mapas, también puede funcionar como un servicio WMS. Es decir, admite respuestas WMS de datos almacenados en caché. Algunas características de este servicio WMS son:
- Combina mosaicos y escalas o reproyecta imágenes.
- Acelera WMS existente de 10 a 100 veces.
- Combina múltiples fuentes o recursos.
- Agrega transparencia a las capas opacas.
- Reproyecta sobre la marcha.
- Admite combinaciones de capas en caché y en cascada.
Actuando como un servidor WMS, MapProxy es capaz de responder a las solicitudes GetLegendGraphic y a solicitudes GetFeatureInfo en cascada con transformaciones XSL opcionales.
Caché de teselas
En la creación de teselas MapProxy emplea dos estrategias diferentes. Cuando se realiza alguna petición al mapa por primera vez, MapProxy genera las teselas demandadas y las almacena en caché. En las siguientes peticiones se sirven las teselas ya generadas o se crean y almacenan otras nuevas si se corresponden a otras zonas del mapa o nivel de zoom.
Pero además de esta forma MapProxy puede generar previamente la memoria caché de teselas para un mejor rendimiento; esto se denomina inicialización o pregeneración de teselas.
Instalar MapProxy con OSGeo4W
Como hemos visto, MapProxy es una herramienta muy eficaz para realizar el cacheado de los mapas. Lo podemos utilizar, por ejemplo, para trabajar en unión con QGIS Server. Vimos en un artículo anterior la forma de instalar QGIS Server desde OSGeo4W. También podemos instalar MapProxy utilizando OSGeo4W.
MapProxy utiliza Python, en consecuencia, necesitamos tenerlo instalado. Como hemos instalado QGIS Server desde OSGeo4w, en principio deberíamos tener todos los paquetes de Python que necesitamos para hacer funcionar a MapProxy.
Tenemos que abrir OSGeo4w Shell, como administrador. Haremos la instalación en 3 pasos, escribiendo las siguientes ordenes en la ventana de comandos que se nos abra:
Paso 1. Como hemos indicado antes, MapProxy utiliza Python. Para poder instalarlo necesitaremos Python3, por lo tanto lo primero es seleccionar ese entorno.
Indicamos el entorno de python3. Escribe en la ventana de comandos:
py3_env
Paso 2. Instalamos mapproxy mediante pip. Escribimos en la ventana de comandos:
pip install mapproxy
Paso 3. Instalamos pyproj. Escribimos el comando:
pip install pyproj
Si después de ejecutar estos dos últimos comandos no hemos obtenido ningún mensaje de error es que la instalación se ha completado con éxito.
Ahora podemos comprobar la versión instalada:
mapproxy-util --version
Herramienta mapproxy-util
MapProxy nos proporciona la herramienta de línea de comandos mapproxy-util. Si deseamos conocer la lista de subcomandos de mapproxy-util escribimos.
mapproxy-util
La lista de subcomandos es la siguiente:
- create: crea una configuración de ejemplo. En la configuración de MapProxy es donde definimos los servicios que vamos a tener con sus capas y características.
- serve-develop: este subcomando inicia un servidor independiente
- serve-multiapp-develop: similar al anterior pero inicia una instancia MultiMapProxy.
- scales: comando para conversiones entre escalas y resoluciones.
- wms-capabilities: comando para ver las capacidades de un servicio WMS.
- grids: muestra información sobre las cuadriculas configuradas.
- export: exporta teselas de un caché a otro.
- defrag-compact-cache: compacta los archivos de paquete existentes reescribiendo y reorganizando cada archivo de paquete.
- autoconfig: crea configuraciones MapProxy y MapProxy-seeding basadas en documentos de capacidades WMS existentes.
Configuración de MapProxy
Para trabajar con MapProxy tenemos que crear una configuración. Utilizamos para eso el subcomando create de mapproxy-util.
Los archivos de configuración de MapProxy están escritos en YAML.
YAML es un formato de serialización de datos legible por humanos inspirado en lenguajes como XML o C. Los datos en YAML se almacenan principalmente en forma de listas o de diccionarios. Los diccionarios son pares de clave: valor. Por lo tanto un archivo de configuración de MapProxy será un diccionario que contenga lo necesario para definir el servicio.
Por ejemplo un archivo YAML con una configuración básica para MapProxy tendría la siguiente forma:
services: demo: tms: use_grid_names: true # origin for /tiles service origin: 'nw' kml: use_grid_names: true wmts: wms: md: title: MapProxy WMS Proxy abstract: This is a minimal MapProxy example. layers: - name: osm title: Omniscale OSM WMS - osm.omniscale.net sources: [osm_cache] caches: osm_cache: grids: [webmercator] sources: [osm_wms] sources: osm_wms: type: wms req: url: https://maps.omniscale.net/v2/demo/style.default/service? layers: osm grids: webmercator: base: GLOBAL_WEBMERCATOR globals:
Con esta configuración se nos ofrece un cache de teselas de OpenStreetMap. Para ello utilizamos el recurso indicado en sources. Como podemos observar, en el apartado services, se indica una lista de los servicios que se pueden utilizar (TMS, KML, WMS…). El siguiente elemento del diccionario es layers, que contiene la lista de capas que tenemos. En grids se definen las cuadrículas que utiliza MapProxy para el almacenamiento en cache interno.
Vemos que el primer elemento del diccionario services es demo. MapProxy nos crea un servidor con una página de demostración al que podemos acceder mediante: http://localhost:8080/demo/
Esta página de demostración nos permite visualizar las capas publicadas en diferente formatos y sistemas de coordenadas utilizando OpenLayers:
Configuración de la pregeneración de teselas
La pregeneración de teselas es la operación por la cual se crean y almacenan las teselas de un mapa. De esta forma cuando el cliente solicite un servicio, el mapa se encuentra disponible. La configuración de la siembra o pregenerado de teselas se realiza mediante otro archivo YAML. Un ejemplo básico de configuración para la «siembra» de teselas es:
seeds: myseed1: caches: [osm_cache] # grids: [] # coverages: [] levels: to: 10 refresh_before: time: 2013-10-10T12:35:00 cleanups: myclean1: caches: [osm_cache] remove_before: days: 14 levels: from: 11 coverages:
Se pueden configurar todos los aspectos de la generación de teselas, como son los niveles (levels) para los que se crean, la fecha desde la que se actualizan o las condiciones de borrado.
Conclusión
Podemos afirmar que MapProxy es una excelente herramienta para el cacheado de teselas y en consecuencia para servir los mapas más rápido. Como hemos visto es fácil de instalar y permite combinarlo con muchas fuentes de datos, como QGIS Server o MapServer. Es altamente configurable. Además, está muy bien documentado, incluyendo tutoriales y ejemplos de configuraciones.
Tutor del curso online de Análisis GeoEspacial con Python y de los cursos online de webmapping. Echa un vistazo a todos nuestros cursos de SIG online.