Gestión de mapas vectoriales cacheados

luis izquierdo
ARPS
Published in
5 min readJun 16, 2017

Actualmente, casi todos los servidores de mapas en Internet, tienen la información cartográfica cacheada en los servidores lista para ser consumida, lo que permite que esta información esté disponible en le acto, sin ningún tipo de demora. De esta manera existe un protocolo definido por el OGC denominado Tile Map Service Specification cuyo objetivo es definir el acceso a los servidores via REST para que estos puedan servir cartografía en formato Tile (es decir, cacheado en pequeñas porciones) para un número fijo de escalas. La explicación de este formato queda fuera del alcance de este artículo. En este link se puede encontrar una explicación de dicho formato. Lo que es importante destacar es que la información es ofrecida en formato raster, es decir mapas de bits que ofrecen escasa o nula interacción humana.

En esta serie exploraremos como cachear y gestionar de una manera ágil grandes volúmenes de información en formato vectorial, para esto haremos un caso de uso que estudie la evolución demográfica de España en los últimos 20 años, llegando a nivel municipal por grupos de edad quinquenales. Toda esta información (cartográfica y alfanumérica) ocupa más de 100 Mg con lo que tiene que ser previamente procesada y estructurada para ser consumida por un cliente ligero en HTML.

Los pasos que seguiremos serán los siguientes:

  1. Descarga de los ficheros demográficos del INE, Explicando el script que hemos tenido que hacer para la automatización de la descarga (aproximadamente 1.000 ficheros = 50 provincias * 20 años)
  2. Descarga de la cartografía: accediendo a los repositorios de ESRI para la descarga de ficheros shape que ofrece para su libre distribución. Posteriormente trataremos la cartografía para simplificarla y convertirla a geojson. Para esto seguiremos el increíble tutorial de Mike Bostock que explica como realizar este proceso con programas de código libre, basados en su mayoría en nodeJS.
  3. Diseño de un cliente en HTML que consuma los datos y la cartografía, de tal manera que nos permita viajar de una manera instantánea por los distintos municipios, provincias y ccaa del territorio español y nos permita hacer análisis visuales comprativos. Para esto utilizaremos el conjunto de librerías D3JS y CrossFilter

Empecemos …

Descarga de ficheros demográficos

El INE ofrece una información valiosísima a través de su página web, por medio de la Estadística del Padrón Continuo. En concreto si queremos acceder a los datos por municipios de la provincia de Cáceres a 1 de enero del 2007 no tenemos más que ir a esta dirección. Nos encontraremos una web similar a la siguiente:

INE, con0sulta Padrón Continuo para todos los municipios de Cáceres a 1 de enero de 2007

Fijémonos detenidamente en el patrón de la URL

#http://www.ine.es/jaxi/Tabla.htm?path=/t20/e245/p05/a2007/l0/&file=00010001.px&L=0

Dentro del parámetro path hay un componente a2007, este nos indica el año que queremos consultar. El parámetro 00010001 nos indica la provincia que queremos consultar. Si este último lo cambiamos por 00011001 obtendremos la consulta para Cadiz.

Con esta idea creamos un programa muy simple en python que genere un batch para gestionar todas las descargas; es decir los 19 años (que actualmente existen) de todas las provincias, lo que nos genera un batch de 990 wget, es decir de 990 peticiones de descarga al servidor, cada una de un año de una determinada provincia. En esta fase tendremos dos scripts. A contiuación los listo y pongo sus links al repositorio en github.

  • batchGenerator.py script en python que genera el batch download.sh y que contiene todos los wgets.
  • downloads.sh script generado (como hemos explicado) y que en linux se ejecuta con el comando sh ./download.sh (hay que colocarse en el mismo directorio donde se ubica el script). Importante, antes de ejecutarlo crear en la misma carpeta un directorio con el nombre files.

Resumiendo la parte de descarga de ficheros de población. Bastará con descargarse o copiar el contenido del fichero downlods.sh, en el mismo directorio donde hemos descargado el fichero crear un directorio con el nombre “files” y ejecutar este batch por medio del comando (en linux) “sh ./downloads.sh”, con esto se descargarán 990 ficheros de los datos de población de los últimos 19 años de todas la provincias españolas.

Cada fichero tendrá un nombre de tipo pp-yyyy.csv, donde pp es el ćodigo de la provincia y yyyy el el año del dato. De esta manera, y a título de ejemplo el fichero 01–1998, tendrá los datos de población de Álava para el año 1998 estructurados en 3 bloques. El primero con los datos de población de varones y mujeres, el segundo con solo datos de los varones y el tercero con los de las mujeres. Total un fichero con 167 registros, de los cuales pongo el primer municipio (Alegría-Dulantzi) para cada uno de los tres bloques.

01.- Alava
Población por sexo, municipios y edad (grupos quinquenales)
Unidades: personas
,Total,0-4,05-09,10-14,15-19,20-24,25-29,30-34,35-39,40-44,45-49,50-54,55-59,60-64,65-69,70-74,75-79,80-84,85 y más,
Ambos sexos,
Total,284595.0,10665.0,11808.0,14685.0,20081.0,24379.0,24069.0,24440.0,23285.0,21149.0,20396.0,19283.0,14277.0,14911.0,13580.0,10515.0,7605.0,5123.0,4347.0,
001 Alegría-Dulantzi,1259.0,56.0,68.0,69.0,82.0,117.0,112.0,120.0,110.0,89.0,88.0,87.0,62.0,55.0,35.0,32.0,38.0,24.0,17.0,
...Varones,
Total,141350.0,5508.0,6042.0,7521.0,10249.0,12499.0,12246.0,12260.0,11503.0,10527.0,10364.0,9913.0,7470.0,7607.0,6665.0,4751.0,3101.0,1789.0,1336.0,
001 Alegría-Dulantzi,656.0,27.0,36.0,33.0,42.0,74.0,59.0,61.0,56.0,51.0,52.0,44.0,36.0,29.0,23.0,14.0,9.0,8.0,5.0,
...Mujeres,
Total,143245.0,5157.0,5766.0,7164.0,9832.0,11880.0,11823.0,12180.0,11782.0,10622.0,10032.0,9370.0,6807.0,7304.0,6915.0,5764.0,4504.0,3334.0,3011.0,
001 Alegría-Dulantzi,603.0,29.0,32.0,36.0,40.0,44.0,54.0,60.0,55.0,38.0,36.0,43.0,26.0,26.0,12.0,18.0,29.0,16.0,12.0,

Descarga y procesamiento de la cartografía

Como ya hemos comentado previamente, lo primero que haremos será descargarnos la cartografía de los repositorios gratuitos de ESRI.

Se exponen los links de donde nos bajamos cada una de las entidades administrativas.

Una vez descargados, comenzamos con el proceso de conversión a geojson y simplificación vectorial de geometrías. Para esto, echamos mano del excelente artículo de Mike Bostock y de las librerías que él mismo ha creado. Comencemos con el proceso.

Muchos de los procesos, están basados en nodejs. El proyecto vinculado a este blog es, de hecho, un proyecto en nodejs. Con fines didácticos explicaré el proceso que he seguido para convertir el proyecto en uno de tipo nodejs.

npm init      # iniciamos el proyecto con npm (valores por defecto)
npm install -g shapefile # librería del artículo de bostock

Convertimos el fichero de municipios, en formato shape a geojson. (cambiar la ruta de acceso según configuración local).

shp2json /media/luis/data/kassandra/carto/municpios/Municipios_ETRS89_30N/Municipios_ETRS89_30N.shp -o /media/luis/data/kassandra/carto/municpios/Municipios_ETRS89_30N/Municipios_ETRS89_30N_A.json

lo primero que llama la atención es el volumen de los dos ficheros. El fichero shape ocupa 7.9 MG, el fichero json ocupa más del doble, 19.5 MG, estas son cifras que no se deben manejar en una aplicación RIA. Hay que seguir una estrategia de simplificación vectorial y carga selectiva,

to be continued …

--

--

luis izquierdo
ARPS
Editor for

Desarrollando software para el mando y control de flotas de drones