Generar cartografía offline para aplicaciones móviles.

Generar cartografía offline para aplicaciones móviles.

Generar cartografía offline para aplicaciones móviles.

Trabajo en campoA la hora de diseñar y desarrollar una aplicación SIG de movilidad en el ámbito del trabajo en campo, sea del tipo que sea, es indispensable hoy en día disponer de los datos y poder trabajar independientemente de si existe disponibilidad de conexión a Internet o no, sea del tipo que sea.

Estamos acostumbrados a trabajar con aplicaciones diariamente en la ciudad y la conectividad es algo natural para nosotros, pero si salimos fuera de las grandes ciudades, sobre todo en sitios alejados de grandes centros urbanos, se hace imprescindible el uso de bases de datos locales en los dispositivos móviles para poder consultar y actualizar datos en caso de que la conexión sea mala o nula.

Una de las bases de datos más utilizada hoy en día por ser multiplataforma es SQLite, y en ella podemos almacenar todo tipo de información con muy poca limitación, actualmente 2 TB de información. Teniendo en cuenta que los dispositivos móviles actuales no alcanzan esa cifra de almacenamiento, este sistema de base de datos nos sobra en cuanto a esas características.

En este artículo en concreto vamos a hablar de un formato de almacenamiento de datos para guardar teselas de mapas en un único fichero basado en SQLite. Este formato se conoce como “MBTiles” y puede ser leído facilmente mediante librerías javacript como Openlayers o Leaflet.
tilesEn el formato MBTiles, basicamente lo que se hace, es mediante una estructura de tablas alfanuméricas y campos BLOB (Binary Large Objects), donde se guardan las imágenes troceadas, guardar de una manera muy optimizada en la relación entre coordenadas X,Y y Z las distintas posiciones de una zona que queramos publicar, y de este modo, sabiendo en qué zoom estamos (eje Z) y las coordenadas, podemos extraer las imágenes de un encuadre dadas las X e Y máximas y mínimas.

Otra de las cualidades del formato MBTiles es que a la hora de crear estos cuadros de imágenes, detecta teselas idénticas en su composición y lo que hace con ellas es en lugar de guardarlas de nuevo, apuntar de manera lógica a la primera tesela que se creó, reduciendo de una manera considerable el tamaño de la base de datos.

OPTIMIZACIÓN – GENERAR CARTOGRAFÍA

Un ejemplo de este tipo de optimización se daría al intentar generar cartografía de una zona costera, o como en la imagen de la izquierda. Cuando llegamos a un nivel de zoom muy grande, y nos acercamos a la zona de rio, al generar una tesela, (totalmente azul), las siguientes teselas de esa zona no se generarían, sino que se enlazaría con esa primera teselas azul original. No tendría sentido capturar decenas de imágenes de 256×256 píxeles totalmente idénticas.

Esto es gestionado de manera muy eficiente por estas librerías Javascript mencionadas anteriormente, de modo que lo que al final se muestra en pantalla son mapas, cargados por cuadrantes (teselas) de manera rápida y fluida.

MapproxyExisten varias formas de generar este tipo de información, pero hoy vamos a abordar una de ellas: MapProxy.

MapProxy es un servidor de teselas que puede leer desde diferentes orígenes de datos, como WMS, TMS, Mapserver, Google Maps… etc y cachea esta información, de modo que cuando se realizan peticiones de un área, este tipo de servidor las ha procesado con anterioridad y las sirve de una manera muy rápida.

Este software de servidor se configura mediante ficheros escritos en formato YAML y con scripts en Python y podemos usarlo para entre otras cosas ofrecer cartografía en diferentes sistemas de coordenadas, hacer composiciones desde distintos orígenes de datos y servirlo como uno solo, generar servicios de Teselas desde WMS, etc…

Realmente MapProxy puede realizar muchas tareas, pero la que nos interesa hoy es la generación de cartografía en formato MBTiles.

Para ello podemos utilizar (una vez configuradas las capas) su utilidad mapproxy-util para exportar en distintos formatos, entre ellos, el que queremos: MBTiles.

La configuración de estos ficheros YAML será objeto de otro artículo, pero una vez diseñadas las capas (o haciendo llamadas a capas ya creadas desde servicios como WMS), podemos, llamando al fichero de configuración que tengamos diseñador poder crear estos ficheros MBTiles facilmente.

Un ejemplo de llamada para su generación en el servidor sería:
mapproxy-util export -f avantgeo.yaml –source avantgeo_cache –dest avantgeo.mbtiles –type mbtile –levels 1..6 –grid “srs=’EPSG:4326′ bbox=[5,50,10,60] tile_size=[256,256]”
Este ejemplo exportaría la configuración de mapas que tuviéramos en el fichero avantgeo.yaml, utilizando para ello la rejilla definida, utilizando el sistema de referencia EPSG:4326, la caja con las coordenadas definida en el ejemplo y un tamaño de tesela de 256 x 256, utilizando como origen la configuración de capa “avantgeo_cache” dentro de nuestro fichero yaml, creando únicamente los niveles del 1 al 6, y generando finalmente el fichero avantgeo.mbtile.

Esto sería un ejemplo básico de creación de fichero MBTiles desde MapProxy. Más adelante veremos como crear y configurar un fichero yaml y poco a poco todas las piezas irán encajando.