Taller de OpenStreetMap, Imposm y TileMill

OpenStreetMap, el mapa colaborativo

Introducción a OpenStreetMap

OpenStreetMap (en adelante OSM) es un proyecto colaborativo para crear mapas libres y editables. Se dice que OSM es a lo mapas, como la Wikipedia a las enciclopedias. Actualmente hay más de 1.500.000 usuarios registrados (estadísticas).

La mejor definición de OSM es que se trata de una Comunidad de usuarios que crea una Base de datos colaborativa con datos geográficos.

ejemplo de mapa osm

La página principal de OSM es http://www.openstreetmap.org/ donde puede verse el mapa que se genera con los datos aportados por los usuarios. La comunidad se organiza a través de una wiki cuya dirección es http://wiki.openstreetmap.org/

El proyecto es propiedad de la Fundación OpenStreetMap, cuyo objetivo es «fomentar el crecimiento, desarrollo y distribución de datos geoespaciales libres y a proveer datos geoespaciales a cualquiera para usar y compartir». Los datos tienen una licencia conocida como Open Database License 1.0 especialmente ideada para publicar bases de datos.

Historia de OSM

El proyecto nace de la mano de Steve Coast en 2004 que por discrepancias personales con la gestión cartográfica y los precios del organismo británico Ordnance Survey decide crear una base de datos cartográfica accesible a todos los públicos.

En 2006 el proyecto toma forma de fundación sin ánimo de lucro y en ese mismo año Yahoo autoriza a la fundación a utilizar su capa de imágenes aéreas de todo el mundo para que los usuarios puedan digitalizar información sobre ellas.

En 2007 la empresa Automotive Navigation Data (AND) dona sus datos de los Países Bajos y de las principales carreteras de la India y China a la fundación y además se incorpora la información de la base de datos TIGER (Censo de EEUU).

En 2008 la aparece la empresa CloudMade con el objetivo de explotar comercialmente la información del proyecto y que dona a la fundación 2,4 Millones; en ese mismo año la iniciativa pública canadiense GeoBase.ca dona sus datos de Canadá al proyecto.

En 2009 se libera la versión 0.6 de la API y se incrementan en casi 100.000 el número de usuarios duplicando los existentes en solo un años.

En 2010 tiene lugar en Girona la conferencia State of the Map, Bing Maps (Microsost) permite el uso de sus imágenes para digitalizar información y el Ordnance Survey decide liberar sus datos. Terremoto de Haití.

En 2011 se superan los 500.000 usuarios y los 1.000.000.000 nodos.

En 2012 Foursquare abandona el uso de Google Maps y pasa a usar datos de OSM renderizados por MapBox. Se cambia la licencia a ODbL. Apple hace un uso sin atribución de los datos de OSM para sus aplicaciones.

En 2013 se supera el millón de usuarios y tiene lugar el Tifón Yolanda

En 2014 se han superado los 1,5 millones de usuarios.

HOT

Humanitarian OpenStreetMap Team

Se organiza a partir del terremoto de Haití con el objetivo de proporcionar a los equipos de emergencias mejores mapas de la zona. Su función es servir de puente entre los Actores tradicionales de respuesta humanitaria y la comunidad de OpenStreetMap.

Su labor consiste en recopilar datos, aunque también se realizan trabajos de formación en zonas necesitadas. Aún así, la mayor parte del trabajo es remoto y llevado a cabo por voluntarios.

Actualmente trabajando en Haití, Indonesia, Somalia, Costa de Marfil...

Procedimiento de creación de mapas

Los mapas se realizan siguiendo 3 pasos:

  • Toma de datos
  • Subida de datos a los servidores de OSM:
    • Edición gráfica de los datos
    • Edición alfanumérica de los datos
  • Renderizado de los mapas

Toma de datos

Los datos se recopilan por observación directa, preferentemente empleando GPS, aunque pueden emplearse otros medios como fotografía aérea si los derechos de la imagen lo permite. Aún así el proyecto recomienda conocer y recorrer la zona personalmente para garantizar la máxima calidad del resultado.

Los orígenes más comunes de datos son:

  • Trazas GPS, resultado de recorrer la zona usando un dispositivo GPS que almacene dicha información.
    • También suelen usarse waypoints, fotos geolocalizadas y archivos de audio geolocalizados
  • Imágenes de Yahoo, Bing Maps, el PNOA en España, Landsat y en general cualquier imagen cuyos derechos de autor hayan sido expresamente cedidos, se hayan extinguido o estén en el dominio público.
  • Mapas e información de los usuarios. Siempre que se trate de información en el dominio público o cuyos derechos de autor hayan sido expresamente cedidos.
  • Información previa existente que requiera ser incluida en un mapa.

Subida de datos a los servidores de OpenStreetMap

Una vez recopilada la información, esta debe ser incorporada a la base de datos de OSM. Para ello existen diversos medios, aunque principalmente se emplean clientes web como iD:

editor iD

y el cliente de escritorio JOSM:

editor josm

En cualquier caso lo más frecuente es convertir los datos GPS tomados al formato estándar GPX y subirlos posteriormente al repositorio de trazas GPS de OSM de forma que cualquier usuario pueda acceder a dicha información.

Edición gráfica de los datos

Empleando alguna de las aplicaciones que lo permiten; como iD, Potlach2, JOSM o Merkaartor por ejemplo; se descarga del servidor la porción de información que se quiere editar, para que esta se ajuste a los estándares acordados en el proyecto.

OpenStreetMap solo reconoce 2 tipos de datos gráficos:

  • Nodos: Son elementos puntuales
  • Vías: Conexiones lineales entre nodos.
    • Vías abiertas: Vías que tienen entre 2 y 2000 nodos
    • Vías cerradas: Vías que empiezan y acaban en el mismo nodo y definen una forma poligonal.
      • Áreas: Zonas contenidas dentro de Vías cerradas
Edición alfanumérica de los datos

OpenStreetMap reconoce 2 tipos de datos alfanuméricos:

  • Relación: Lista ordenada de nodos con un rol, como por ejemplo una restricción de giro.
  • Etiqueta: Par clave/valor que permite definir atributos.

El modelo de datos alfanuméricos de OSM se basa en el uso de etiquetas tags consensuadas por los usuarios a través de la wiki del proyecto.

Las etiquetas se definen por un par clave/valor. Actualmente hay casi 1000 claves “oficialmente” reconocidas y varios centenares propuestos.

Esta información adicional alfanumérica permite clasificar los datos para que el proceso de renderizado los muestre correctamente representados.

Renderizado de los mapas

El proyecto OSM tiene varios motores de renderizado tanto en 2D como en 3D que permiten obtener una imagen de la información de la base de datos.

Los principales motores de renderizado son:

  • Osmarender En realidad se trata más bien de un conjunto de reglas XLST que genera SVG.
mapa renderizado con osmarender
  • Mapnik Toma los datos y los carga en un PostGIS para posteriormente renderizar tiles de 256x256. Es el motor de render más utilizado actualmente.
mapa renderizado con mapnik

Obteniendo los datos de OpenStreetMap

Daremos un rápido vistazo a la API de OSM y al formato XML de OSM.

La API de OSM

La API de OSM es el único medio de modificar datos de la base de datos. Todas las aplicaciones que quieran obtener datos y subir datos a la base de datos de OSM lo tienen que hacer usando dicha API.

La versión actual de la API es la v0.6 y su uso es obligatorio desde 2009.

La API es una API RESTful de edición, esto quiere decir que utiliza directamente el HTTP para manipular la información y que recibe los mensajes y resultados en formato XML.

Toas las consultas se realizan de forma anónima, pero las actualizaciones se realizan usando OAuth (son necesarios un usuario y una contraseña válidos)

La API da soporte de versionado directamente, de forma que todas las actualizaciones quedan registradas con un número de versión de forma que permite detectar errores y conflictos de manera eficiente.

Las descargas están limitadas a cuadrados de 15’ de arco y además existe una limitación de ancho de banda, de forma que si se excede la primera limitación el sistema responde un mensaje de error y si se excede la segunda se bloquearán los accesos de manera temporal.

La API no está enfocada a consulta, sino a edición, para consultar la base de datos es más eficiente emplear otros métodos que básicamente consisten en obtener uno de los archivos Planet, convertirlo a una base de datos local y consultar sobre ésta.

Actualización de datos

Ejemplos de actualización de datos:

PUT /api/0.6/changeset/create
PUT /api/0.6/changeset/#id/close
PUT /api/0.6/[N|W|R]/create
DELETE /api/0.6/[N|W|R]/#id

Ejemplo de respuesta:

<osm>
  <changeset>
    <tag k="created_by" v="JOSM 1.61"/>
    <tag k="comment" v="Just adding some streetnames"/>
    ...
  </changeset>
  ...
</osm>
Otras consultas

Ejemplos de consultas:

GET /api/0.6/[N|W|R]/#id/relations
GET /api/0.6/node/#id/ways
GET /api/0.6/[W|R]/#id/full

Ejemplo de respuesta:

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="OpenStreetMap server">
  <gpx_file id="836619" name="track.gpx" lat="52.0194" lon="8.51807"
            user="Hartmut Holzgraefe" visibility="public" pending="false"
            timestamp="2010-10-09T09:24:19Z">
    <description>PHP upload test</description>
    <tag>test</tag>
    <tag>php</tag>
  </gpx_file>
</osm>

OSM XML Data: el formato OpenStreetMap

El formato de intercambio estándar de la API es un XML compuesto por combinaciones de los cuatro elementos principales.

Nodos (Node)

Los Nodos tienen, entre otras informaciones, las siguientes características:

  • id: el identificador
  • lat y lon: la posición geográfica en EPSG4326
  • visible: boolean que determina la visibilidad
  • user: usuario que creó la versión del nodo
  • timestamp: marca de tiempo de creación
  • version: incremental para cada objeto.
_images/node.png

Además el Nodo puede contener información asociada al estilo OSM a traves de pares key/value

<node id="25496583" lat="51.5173639" lon="-0.140043" version="1" changeset="203496" user="80n" uid="1238" visible="true" timestamp="2007-01-28T11:40:26Z">
    <tag k="highway" v="traffic_signals"/>
</node>
Vías (Way)

Las Vías son listas ordenadas de nodos que tienen información como:

  • id: el identificador
  • visible: boolean que determina la visibilidad
  • user: usuario que creó el nodo
  • timestamp: marca de tiempo de creación
  • version: incremental para cada objeto.
_images/way.png

Debe tener una lista de nodos agrupados cada uno con su etiqueta XML nd con la referencia id de los nodos que agrupa. Además la Vía puede contener información asociada al estilo OSM a traves de pares key/value

<way id="5090250" visible="true" timestamp="2009-01-19T19:07:25Z" version="8" changeset="816806" user="Blumpsy" uid="64226">
    <nd ref="822403"/>
    <nd ref="21533912"/>
    <nd ref="821601"/>
    <nd ref="21533910"/>
    <nd ref="135791608"/>
    <nd ref="333725784"/>
    <nd ref="333725781"/>
    <nd ref="333725774"/>
    <nd ref="333725776"/>
    <nd ref="823771"/>
    <tag k="highway" v="unclassified"/>
    <tag k="name" v="Clipstone Street"/>
    <tag k="oneway" v="yes"/>
</way>
Relaciones (Relation)

Las Relaciones son listas ordenadas de objetos, son objetos en si mismas y sirven para definir relaciones entre cualquier tipo de objeto. También tienen información como:

  • id: el identificador
  • visible: boolean que determina la visibilidad
  • user: usuario que creó el nodo
  • timestamp: marca de tiempo de creación
_images/relation.png

Y además en una etiqueta XML member definir atributos type, id y role que permiten configurar la relación y unas etiquetas tag para describir el tipo de relación.

<relation id="77" visible="true" timestamp="2006-03-14T10:07:23+00:00" user="fred">
  <member type="way" id="343" role="from" />
  <member type="node" id="911" role="via" />
  <member type="way" id="227" role="to" />
  <tag k="type" v="restriction"/>
  <tag k="type" v="no_left_turn"/>
</relation>
Etiqueta (Tag)

Pese a ser una primitiva reconocida por la API de OSM en realidad está integrada dentro de las otras primitivas y nos permite definir los atributos de las mismas.

web de map features

Taller de JOSM

JOSM es el acrónimo de Java OpenStreetMap Editor, se trata de una aplicación multiplataforma desarrollada por Immanuel Scholz y Frederik Ramm. Es el editor preferido por la comunidad OSM, ya que tiene muchas funcionalidades implementadas y permite editar gran cantidad de datos, aunque su curva de aprendizaje puede resultar un poco pronunciada al inicio.

splash de josm

Una sesión de edición en JOSM suele incluir los siguientes pasos:

  1. Carga de datos GPS o el uso de imágenes satélite u ortofotografías
  2. Digitalización de información
  3. Etiquetado de la información
  4. Validación y subida de datos al servidor de OSM

Importante

Durante la explicación del funcionamiento de JOSM el alumno puede trabajar con cualquier zona y experimentar en zonas sin datos para habituarse a la mecánica de trabajo de JOSM. Una vez revisado el funcionamiento de JOSM se propondrá un ejercicio práctico.

Instalación y arranque

La instalación de JOSM es muy sencilla, si tenemos una versión reciente de Java probablemente sea tan fácil como ejecutar el enlace josm.jnlp de la web de JOSM. Este método utiliza una característica llamada Java Web Start, y tiene la ventaja de que comprueba al inicio si existe una versión más reciente de JOSM y se actualiza automáticamente.

Si este método no funciona puedes descargarte de la misma web la versión actual del enlace josm-tested.jar y hacer doble clic en el archivo descargado.

Nota

Puedes consultar más documentación sobre la instalación y ejecución de JOSM en la sección Running de las notas de instalación de JOSM.

Crear un script de actualización y arranque en Linux

Si se utiliza un sistema Linux u OSX y no se dispone de soporte para Java Web Start se puede crear un script como el siguiente para automatizar la descarga de la versión más reciente de JOSM antes de ejecutarlo. Esto resulta interesante porque JOSM se actualiza con mucha frecuencia.

El script sería el siguiente:

#!/bin/bash

cd /tmp
wget -N http://josm.openstreetmap.de/josm-tested.jar
java -jar josm-tested.jar

A este script bastaría con darle permisos de ejecución y ubicarlo en algún lugar accesible. Al ejecutarlo comprobará si la versión de JOSM es la más reciente y de no ser así la descargará. Después lanzará automáticamente el programa.

splash de josm

Cargar datos de referencia

Carga de datos GNSS

JOSM permite cargar información obtenida a través de un receptor GNSS usando para ello el formato de intercambio estandar GPX.

Carga de gpx

Importante

Se recomienda encarecidamente no subir esta información directamente sin depurar o sin tratar, es preferible siempre usarla como base para digitalizar sobre ella y añadir los atributos correspondientes.

Cargar servicios de imágenes

Además de utilizar los datos recogidos en campo con GPS, notas, etc. se pueden también usar imágenes en distintos formatos para usarlas como cartografía de referencia y poder digitalizar sobre ellas.

En especial tienen significativa importancia dentro de JOSM la posibilidad de cargar imágenes base provenientes de diversos proveedores a través de Internet cuya información ya viene integrada en el propio JOSM o incluso se pueden agregar nuevos como por ejemplo orígenes de datos WMS o TMS. En España está autorizado el uso del PNOA y del Catastro para digitalizar sobre las ortofotos siempre que se identifiquen el origen y la resolución temporal con las etiquetas source y sourcedate.

Carga de gpx

Se puede acceder a la configuración de los proveedores a través del menú Editar ‣ Preferencias ‣ WMS/TMS. Primero se busca el proveedor a partir del código de país y una vez seleccionado se puede hacer clic en el botón Activar y confirmar el diálogo.

Carga de gpx

Tras los cambios aparentemente nada habrá cambiado, pero ahora hay una nueva entrada en el menú Imágenes y al pulsarla se cargará una capa, debajo de la capa de datos actual, con la ortofotografía de la zona. Es una capa que se puede activar o desactivar Botón ver/ocultar , o cambiar la transparencia Botón transparencia.

Carga de gpx

Descarga de datos

JOSM trabaja por defecto con archivos de formato XML de OSM (archivos .osm). Para obtener un archivo de la zona con la que se quiere trabajar hay que pulsar el botón de Descarga de datos del servidor o desde el menú Archivo ‣ Descargar desde OSM. Al pulsar el botón se muestra una interfaz donde se puede seleccionar la porción de datos que quiere obtenerse.

Nota

En este mapa se usan la rueda y los dos botones del ratón: el izquierdo para seleccionar la zona y la rueda y el derecho para desplazarse por el mapa.

splash de josm

El servidor limita las peticiones que cubran gran extensión para no colapsar el servicio, pero si se requiere gran cantidad de datos se pueden realizar diversas peticiones que acabarán almacenándose en un solo fichero.

Una vez seleccionada la zona y aceptada la petición por el servidor, JOSM creará una capa que aparecerá en el panel superior del lado derecho.

splash de josm

Filtrando la información

Los filtros son una característica de JOSM que permite ocultar temporalmente elementos cargados en pantalla para tener una mejor visibilidad del área de trabajo descartando aquellos elementos que no nos interesen.

Antes de aplicar un filtro:

Antes de aplicar el filtro

Tras aplicar el filtro:

Después de aplicar el filtro

Para definir nuevos filtros se utiliza el panel Filtrar que suele encontrarse en la parte inferior del panel del lado derecho.

Primitivas

Filtros en JOSM

La sintaxis de los filtros es bastante sencilla y al Añadir uno nuevo se nos muestra una pequeña guía con ejemplos. Los filtros que se muestran en la figura Filtros en JOSM realizan lo siguiente:

  • Filtrar todos los nodos que no tengan etiqueta
  • Filtrar todos los nodos que tengan la etiqueta name sea cual sea el valor de esta
  • Filtrar todos los nodos que tengan la etiqueta amenity (otra forma de filtrar sin que importe el valor de la etiqueta)
  • Filtrar todas las vías que no estén cerradas (usando el check para invertir la búsqueda)

Digitalizando

Para probar la digitalización crearemos una nueva capa en la que poder trabajar sin modificar los datos que se han descargado, para crear la capa usaremos el menú File ‣ New Layer o el atajo de teclado Ctrl + N.

Nota

Al crear la nueva capa, la capa de datos anterior deja de ser la capa de datos activa y aparecerá como líneas de color negro. Es conveniente desactivar la capa para poder ver la ortofotografía, para ello seleccionaremos la capa y pulsaremos en botón de cambiar la visibilidad Botón ver/ocultar.

Ocultar la capa con la información ya registrada

Nota

También es recomendable desactivar los filtros pulsando en la casilla E.

Para digitalizar un punto, haremos zoom sobre una zona con árboles, el zoom se controla con la barra que hay arriba a la izquierda, pero también con la rueda del ratón. A continuación pulsamos sobre el botón agregar Icono agregar o pulsamos la tecla A para entrar en el modo de edición.

Nodos

Digitalizamos los árboles poniendo un punto, haciendo un solo clic, sobre cada copa de la ortofotografía. JOSM está pensado para añadir elementos lineales por lo que por defecto espera tener que añadir líneas, para añadir tan solo puntos deberemos pulsar la tecla Esc después de hacer clic sobre cada árbol.

Digitalizar copas de los árboles poniendo un nodo en cada uno.

Nota

JOSM tiene muchos atajos. Si mantienes pulsada la tecla Shift no es necesario pulsar la tecla Esc, JOSM insertará nodos individuales.

De momento en realidad estamos simplemente poniendo los Nodos. Para que OSM los reconozca como árboles deberíamos añadir también las Etiquetas, como veremos más adelante.

Vías

Para digitalizar una vía, buscaremos un nivel de zoom que nos permita ver la vía en su totalidad por lo menos una parte muy significativa de ella. Puede que tengamos que desplazarnos por la imagen, pero como estamos en modo edición si hacemos clic con el botón izquierdo añadiríamos un nuevo nodo. Para desplazarnos sin salir del modo edición podemos conseguirlo haciendo clic en el botón derecho del ratón y movernos por el mapa sin soltarlo.

Para digitalizar la vía vamos marcando nodos de manera consecutiva intentando seguir el eje de esta y respetar la forma siguiéndola sobre la ortofotografía. Es interesante que además pongamos un nodo en cada intersección que tenga la vía, lo que facilitará digitalizar las vías que conectan con ésta más adelante.

Digitalizar la vía teniendo en cuenta su forma y las posibles intersecciones.

Un par de atajos de teclado útiles a la hora de digitalizar vías:

  • Pulsar la tecla Alt mientras digitalizas vías, te permite hacer que el próximo nodo, aunque esté conectado al nodo anterior, forme una vía nueva.
  • Cuando tenemos una vía seleccionada (también funciona con vías cerradas) tener la tecla Shipt + Ctrl pulsada te permite rotar el elemento seleccionado.
  • Si pulsamos Ctrl + Alt podremos cambiar la escala del elemento seleccionada.
  • Por último, si mientras digitalizamos hacemos clic con el ratón en el ángulo de la barra inferior (el cuarto elemento) activaremos el modo de ayuda de dibujado de geometrías que nos asiste con ángulos establecidos e intersecciones.

Áreas

Las áreas no son más que una vía que empieza y acaba en el mismo punto y tiene una etiqueta que la identifica.

En este ejemplo, digitalizaremos el área de aparcamiento que hay en la zona en la que estamos trabajando, teniendo en cuenta que deberemos cerrar la vía pulsando al final sobre el primer nodo que digitalicemos.

Digitalizar el parking acabando en el mismo nodo en el que se comenzó.

Los edificios son seguramente el caso más típico de áreas a digitalizar.

Digitalizar el edificio acabando en el mismo nodo en el que se comenzó.
El plugin building tools

Al activar este plugin se nos muestra un nuevo modo en la barra de herramientas. Este modo permite dibujar edificios de forma muy eficiente al evitar dibujar todos los nodos del mismo. Está pensado para dibujar edificios que tienen una forma rectangular.

Si una vez dibujado el primer edificio lo seleccionamos, los siguientes edificios se crean orientados en la misma dirección, teniendo únicamente que marcar las esquinas opuestas del mismo.

La herramienta Crear áreas

Existen diversas herramientas que permiten manipular las geometrías, una de las más interesantes (especialmente combinada con la anterior) es la de Crear áreas. Esta herramienta permite mover una sección de un área hacia fuera o dentro en paralelo a la dirección existente. En la figura Dibujar un edificio ortogonal se muestra el proceso.

  1. Dibujar un edificio con el modo Edificio (en este caso sobre la terraza)
  2. Dibujar los puntos de corte de la zona de la fachada a desplazar
  3. Mediante la herrameinta Crear áreas llevar meter la fachada hacia dentro
  4. Mover el edificio a su ubicación en la parte inferior
Dibujar un edificio ortogonal

Dibujar un edificio ortogonal

Añadiendo etiquetas

Nota

Para el siguiente paso es preferible desactivar la capa del PNOA seleccionándola y pulsando el botón correspondiente Botón ver/ocultar.

Seleccionaremos el primer árbol que hemos digitalizado para lo que hay que entrar en modo selección pulsando el botón selección Icono seleccionar o la tecla S y hacemos clic sobre uno de los nodos que representan a los árboles, puede que tengamos que hacer un poco de zoom.

Una vez seleccionado, pulsamos el botón Add de la ventana Properties/Memberships para poder añadir las Etiquetas correspondientes.

Pulsar el botón Add para añadir la etiqueta

¿Qué etiquetas se emplean para indicar que es un árbol?

Lo mejor SIEMPRE es consultar la wiki de OSM donde tienen un listado de elementos comunes en los mapas Map Features en español y cómo emplearlos. En este caso buscaremos la entrada de árbol en la página y vemos que se corresponde con el par clave/valor natural/tree.

Entrada para árbol singular en la página de Map Features de OSM

Pero además si pulsamos sobre la palabra tree nos lleva a la entrada específica de la wiki en la que explican las características a tener en cuenta y generalmente se detallan las claves a las que también suelen estar asociadas las entidades a cartografiar e incluso ejemplos.

En definitiva, los árboles suelen etiquetarse usando las siguientes claves:

  • natural con el valor tree
  • name
  • type
  • height
  • name:botanical

Pueden asignarse etiquetas a grupos de elementos, para lo que primero hay que seleccionarlos manteniendo pulsada la tecla Mayúsculas mientras se va haciendo clic; para posteriormente aplicar la etiqueta, según el procedimiento ya visto.

También pueden copiarse etiquetas entre elementos, seleccionamos el elemento que tiene las etiquetas y lo copiamos con Ctrl + C y después seleccionamos el elemento destino y pulsamos Ctrl + Shift + V y le asignará automáticamente las etiquetas del primer elemento.

Ahora hay que proceder igual con los demás elementos de nuestro dibujo, tales como carreteras, parkings, edificios, etc...

Nota

El plugin building tools ya inserta la etiqueta de edificio por nosotros.

Consultaremos los elementos en su página correspondiente y añadiremos las etiquetas que creamos sean necesarias para describir la realidad. El resultado tras aplicar las etiquetas podría ser parecido a este:

Tras aplicar las etiquetas en el ejercicio

Añadir etiquetas predefinidas

Añadir las etiquetas una a una es muy costoso. En lugar de hacerlo de esta forma, JOSM ofrece todo un conjunto de diálogos predefinidos para los tipos de datos más comunes. Para ello una vez añadida o seleccionada la geometría (vía o nodo) podemos usar la entrada de menú Predefinidos y navegar por los diferentes tipos de datos. Por ejemplo para dar de alta una rotonda podemos navegar a Predefinidos ‣ Viales ‣ Calles/Carreteras ‣ Rotonda.

Menú de presets

Si ya sabemos cómo se identificia un elemento en el menú, resulta muy cómodo usar el buscador que se lanza con la tecla F3. Por lo tanto, basta con empezar a escribir Rotonda para que el buscador encuentre nuestra etiqueta.

F3 para buscar elementos

De cualquiera de estas dos formas, al final llegaremos a un diálogo que ofrece una interfaz para añadir las etiquetas más comunes referidas al tipo seleccionado, usando listas para elegir las opciones más habituales, botones de tipo check para indicar características que solo toman un valor e incluso disponemos de un enlace a la documentación ampliada en el wiki del proyecto y un botón que nos permite «anclar» el elemento a la barra de herramientas en caso de que vayamos a usar mucho este tipo de elemento.

Dialogo para rotonda

Especificar las fuentes

Es muy importante identificar los orígenes de datos de la información, ya que es una de las formas de medir la calidad de los datos que almacena OSM.

En España, si se digitalizan datos sobre la ortofotografía del PNOA hay que añadir a TODOS los elementos digitalizados el par clave valor source/PNOA y a ser posible la clave source:date cuyo valor corresponde con la fecha en la que se realizó el vuelo

Otros posibles orígenes de datos válidos para usar en España se pueden encontrar listados en la página web Spain Datasources de la wiki de OpenStreetMap.

Consejos generales sobre digitalización y etiquetado

Acude SIEMPRE a la documentación y los expertos
En caso de duda es mejor consultar la wiki primero y si no se encuentra la respuesta acudir a las lista de correo en español de OpenStreetMap
Don’t map for the render
O lo que es lo mismo, en general y excepto en muy contadas excepciones, no hay que dibujar y etiquetar las cosas «para que queden bonito en el mapa», se debe dibujar y etiquetar la realidad o la mejor representación de ella que se pueda conseguir.
No reinventar la rueda
Hay mucho planeta cartografiado en OpenStreetMap, posiblemente alguien ya haya solucionado el problema de representación de la realidad que se te presenta, muchas veces se aprende más intentando ver cómo han resuelto otros problemas similares, busca sitios donde ocurran los mismos fenómenos que quieras representar y mira como lo han hecho otros.

Plugins de JOSM

JOSM es un software en constante evolución. Una de sus características más interesantes es la capacidad para ampliar su funcionalidad utilizando extensiones (conocidos como plugins). Se puede acceder a la lista de plugins desde el diágolo de preferencias en Editar ‣ Preferencias o pulsando F12. En este diálogo accedemos a la lista de plugins desde la cuarta sección. La primera vez habrá que descargar la lista de extensiones disponibles.

Algunos plugins interesantes son:

  • building tools: añade herramientas para crear edificios de forma muy eficiente
  • imagery offset db: ofrece una base de datos de correcciones de imágenes que están desplazadas de su ubicación correcta
  • notes: añade la capa de notas de la web de OSM
  • utils plugin 2: añade una gran cantidad de nuevas herramientas tanto para la selección como para la creación de entidades.

Guardando el archivo

Puede ser interesante guardar la capa que estamos editando para usarla con otras herramientas que veremos en el curso. Para guardar la capa que estamos editando pulsaremos con el botón derecho del ratón sobre el nombre de la capa y seleccionaremos la opción Save as... lo que nos permitirá guardar la información en formato .osm que es el formato XML de OpenStreetMap.

Subir al servidor

Por último, si la cartografía fuese de interés para el proyecto, es posible subir los cambios seleccionando la opción de menú Archivo ‣ Subir cambios. Para poder subir los cambios previamente habrá que introducir las credenciales del usuario del proyecto en el diálogo de preferencias.

Para subir los cambios hay además que indicar un texto que describa el trabajo realizado y es también muy conveniente indicar en el diálogo el origen de los datos que se han usado como referencia.

Dialogo para rotonda

Ejercicio

Como ejercicio se propone que cada alumno del curso elija alguna de las zonas propuestas y haga una sesión de edición que mejore la cartografía de la zona. Las zonas seleccionadas son pequeños municipios de la Comunidad Valenciana que están pobremente cartografiados por lo que cualquier contribución realizada por el alumno será de ayuda. Por supuesto, el alumno es libre de elegir cualquier otra zona de OSM siempre que le permita practicar con la creación de nuevas geometrías, añadir etiquetas, etc.

Se recomiendan las siguientes tareas:

  • Dar de alta calles y edificios públicos relevantes (colegios, equipamientos, etc.)
  • Dar de alta zonas de uso del suelo: residencial, industrial, parques
  • Dar de alta puntos de interés: farmacias, bancos,...
  • Revisar nombres y sentidos de las vías

Nota

Aunque se darán unos datos de partida nuevos para las siguientes secciones del curso, los datos editados podrían usarse como extensión si el alumno así lo desea.

Importando datos a PostGIS

Qué es Imposm

Se trata de una serie de scripts Python que permiten importar datos de OpenStreetMap a una base de datos Postgres. Los archivos a importar deben estar en el formato XML o PBF de OSM y la base de datos debe tener activada la extensión espacial PostGIS.

Su espiritu es optimizar la creación de bases de datos geográficas enfocadas a renderizar o a montar servicios WMS.

Los desarrolladores principales son Omniscale, que es la empresa de Dominik Helle y Oliver Tonnhofer, que también están detrás del proyecto MapProxy.

Funciona en Linux y Mac OS X y es código libre bajo licencia Apache Software License 2.0.

Características

Esquemas de base de datos personalizados
Crea tablas separadas para cada tipo de dato. Permite crear estilos ndependientes de manera sencilla y mejora el rendimiento de renderización.
Soporte para Multiples CPUs
Está pensado para usar procesos paralelos de manera que distribuye la carga de trabajo entre los CPUs y núcleos del equipo.
Normaliza valores
Por ejemplo, todos los posibles valores boleanos 1, on, true y yes se convierten en TRUE.
Soporte para localización de cadenas de texto
Busqueda personalizable de valores localizados
Filtro por etiqueta o por valor
La importación es selectiva y configurable
Cache eficiente de nodos
Para almacenar las calles y las relaciones es necesario almacenar todos los nodos. Imposm usa la base de datos basada en archivo Tokyo Cabinet que almacena pares clave valor para hacer una cache de estos datos. Así se reduce de manera significativa el uso de la memoria.
Tablas generalizadas
Se pueden crear automáticamente tablas con menor resolución espacial, lo que permite por ejemplo preparar rápidamente renders de grandes redes a bajas resoluciones
Vistas de uniones
Permite crear vistas que combinen distintas tablas. Por ejemplo podemos disponer de la cartografía de carreteras separada en tablas para autopistas, carreteras principales y calles, pero también una vista que integre todas estas tablas.

Limitaciones

No permite el uso de actualizaciones diferenciales

Solo permite el uso de bases de datos PostGIS, aunque podría implementarse con facilidad su uso con otras como SpatialLite, Oracle, etc.

Aunque es bastante eficiente con el uso de la memoria, las importaciones de datos masivas pueden llevar bastante tiempo: un archivo de 1 GB (comprimido, equivalente a Alemania) en un sistema con 2 GB RAM o Europa entera (~5 GB) en un sistema de 8 GB no darían problemas, pero un planet requerirá de unos 16 GB de RAM o más (tarda unas 20h con 8GB).

Ejercicio

A continuación se detalla una práctica guiada en la que se verán los detalles básicos del manejo de la aplicación Imposm.

Se espera del lector que vaya ejecutando las instrucciones que se detallan a continuación y en caso de duda pregunte al facilitador.

Importante

El entorno de trabajo que se supone para esta práctica es OSGeo Live 7.0.

Para trabajar lo primero que vamos a hacer es crear la carpeta en la que trabajaremos. Abrimos una terminal y cambiamos al directorio tecleando

$ cd ~

Creamos un nuevo directorio y accedemos al mismo

$ mkdir tallerimposm
$ cd tallerimposm

Instalación

Lo primero es instalar algunas dependencias del sistema (es probable que ya tengamos instaladas algunas de ellas):

$ sudo apt-get install build-essential python-dev protobuf-compiler \
                    libprotobuf-dev libtokyocabinet-dev python-psycopg2 \
                    libgeos-c1 libgdal1-dev libspatialindex-dev \
                    python-virtualenv tree

El siguiente paso depende de si nuestra máquina tiene acceso a Internet por el puerto 443 y por tanto podemos instalar paquetes con pip o no. En el segundo caso se ofrece un entorno virtual ya funcional para descarga.

Si podemos instalar paquetes en el entorno virtual

Crear el entorno virtual e instalar los paquetes necesarios ejecutando:

$ virtualenv venv
$ source venv/bin/activate
(venv)$ pip install imposm rtree

Si no podemos instalar paquetes en el entorno virtual

Descargamos un entorno virtual ya preparado y nos aseguramos de descomprimirlo en la carpeta /home/user/tallerimposm. Una vez descargado lo activamos con:

$ cd /home/user/tallerimposm
$ source venv/bin/activate

Importante

Para que el taller funcione debe descomprimirse en la carpeta que se ha indicado, no funciona en ninguna otra ubicación sin hacer bastantes cambios en su configuración interna (y esto tampoco es aconsejable en cualquier caso).

Comprobar la versión de imposm

Para comprobar la versión de imposm ejecutamos:

(venv)$ imposm --version

Y deberíamos obtener:

Enabling Shapely speedups.
imposm 2.5.0

Obtener el juego de datos

Para este ejercicio vamos a usar una exportación de OpenStreetMap de la ciudad de Nottingham. Este juego de datos está ya en OSGeo Live 7 por lo que no tenemos que descargarlo.

El fichero que usaremos está es /usr/local/share/data/osm/Nottingham.osm.bz2 y dispone de unos 4000 puntos de interés y unas 84000 vías.

Preparando la base de datos

El primer paso para la carga de datos es la creación de la base de datos. OSGeo Live 7.0 dispone de Posgres 9.1 con PostGIS 2.0. En esta combinación y con la configuración de OSGeo Live es muy sencillo crear una base de datos geográfica a la que nuestro usuario del sistema tendrá acceso. Para crear la base de datos nott-osm basta con ejecutar los siguientes comandos:

(venv)$ createdb -E UTF8 nott-osm
(venv)$ psql -d nott-osm -c "create extension postgis;"

Si por alguna razón queremos borrar la base de datos basta con ejecutar:

(venv)$ dropdb nott-osm

Primera importación

Podemos proceder a la primera importación de datos que realizaremos haciendo los tres pasos por separado:

  • Lectura
  • Escritura
  • Optimización

Lectura

Se realiza empleando el comando:

$ imposm --read /usr/local/share/data/osm/Nottingham.osm.bz2

Como la cantidad de datos no es muy grande, solo tardará unos segundos. Una vez acaba podemos comprobar que ha creado los archivos de cache listando los archivos del directorio:

$ ls

imposm_coords.cache  imposm_nodes.cache  imposm_relations.cache  imposm_ways.cache  venv

Imposm ha generado los archivos .cache que son archivos binarios con los datos preparados para ser incluidos en la base de datos.

Escritura

Se realiza empleando el comando:

(venv)$ imposm --database nott-osm --host localhost --user user --write

Solicitará la constraseña del usuario user y cargará los datos que hay en los archivos .cache.

Podemos investigar qué ha hecho Imposm lanzando la aplicación pgAdmin III que está instalada en la máquina virtual en el menú Development. Podemos comprobar que ha creado 24 tablas nuevas, todas con el sufijo new_

Tablas cargadas por Imposm

El esquema de tablas y qué etiquetas ha importado son los estándar ya que aún no hemos cambiado los mappings. En concreto podremos encontrar:

  • Amenities
  • Places
  • Transport_points
  • Administrative polygons
  • Buildings
  • Landusages
  • Aeroways
  • Waterareas
  • Roads (en realidad repartidas en varias tablas en función de la categoría)
  • Railways
  • Waterways

También vienen unas tablas con geometrías de las vías de transporte generalizadas en función de dos tolerancias y unas vistas que agrupan todas las carreteras.

Optimización

El último paso de la carga de datos sería la optimización de los datos que se realiza empleando el comando:

(venv)$ imposm --database nott-osm --host localhost --user user --optimize

Todo en un paso

En realidad los tres pasos anteriores se podrían ejecutar en un solo comando:

$ imposm --database nott-osm --host localhost --user user  \
    --read --write --optimize /usr/local/share/data/osm/Nottingham.osm.bz2

Flujo de trabajo

Nota

Manten pgAdmin abierto y refresca con F5 para ver cómo van actualizándose las tablas.

Pasar a producción

El flujo de trabajo recomendado permite el despliegue de las tablas conservando hasta 3 versiones a la vez del mismo juego de datos. El despliegue se inicia al ejecutar el comando:

$ imposm --database nott-osm --host localhost --user user --deploy-production-tables

La importación de datos se hace sobre tablas a las que se le añade el prefijo osm_new_ en el nombre. Podremos comprobar con pgAdmin III como se ha cambiado el nombre de todas las tablas perdiendo el prefijo new_. Si ya hubiéramos hecho otro despliegue las actuales tablas osm_ se renombrarán automáticamente a osm_old_. Cada vez que se hace un despliegue se borrarán primero las osm_old_.

Flujo de despliegue de Imposm

Si volvemos a cargar la cache y a pasar a producción las tablas con:

$ imposm --database nott-osm --host localhost --user user \
   --write --optimize --deploy-production-tables

veremos como las tablas que no tengan prefijo pasarán a tener el prefijo old_.

Revertir el despliegue y borrar tablas temporales

Para revertir el despliegue se puede ejecutar el comando:

$ imposm -d osm --recover-production-tables

Finalmente para borrar definitivamente las tablas marcadas con old_ y las marcadas con new_ se emplea el comando:

$ imposm --database nott-osm --host localhost --user user --remove-backup-tables
Flujo Imposm II

Modificando el mapping

El esquema de base de datos por defecto que utiliza Imposm viene de los elementos y etiquetas más comunes de OSM. Este esquema permite trasladar los datos empleando el paquete imposm.mapping y las estructuras definidas en el archivo:

/usr/local/lib/python2.7/dist-packages/imposm/defaultmapping.py

Tablas

Hay definidas tres clases de Python para las geometrías base: Points, LineStrings y Polygons y todas las tablas tienen que ser instancias de una de ellas. Las tres clases usan los mismos argumentos:

name
Nombre de la tabla (sin prefijos).
mapping
El mapping de los pares clave/valor básicos que se meterán en la tabla.
fields
El mapping de campos adicionales que también son pares clave/valor de OSM y que se convertirán en columnas de la tabla.
field_filter
Filtros que permitan discriminar los datos que se introducen.

mapping

El argumento Mapping debe ser un diccionario (un diccionario de Python) en la que las claves de OSM (p.e. highway, leisure, amenity, etc.) son las claves del diccionario y los valores de OSM (p.e. motorway, trunk, primary, etc.) los valores de las claves del diccionario.

Para una tabla de paradas de autobús, de tranvía y de ferrocarril el mapping debería ser parecido a este:

mapping = {
    'highway': (
        'bus_stop',
    ),
    'railway': (
        'station',
        'halt',
        'tram_stop',
    )
}

fields

El argumento fields debe ser una lista (o una tupla) con el nombre de la columna y su tipo de dato. Se emplea para añadir información adicional a la tabla. Imposm tiene clases para los tipos de datos más comunes que son las responsables de hacer sustituciones como 1, yes y true a TRUE en caso de datos booleanos por lo que se recomienda su uso:

fields = (
    ('tunnel', Bool()),
    ('bridge', Bool()),
    ('oneway', Direction()),
    ('ref', String()),
    ('z_order', WayZOrder()),
)

En el ejemplo la línea ('tunnel', Bool()) convertirá los valores de la clave tunnel a valores booleanos.

Ejemplo

 towers = Points(
   name = 'towers',
   mapping = {
     'man_made': (
       'tower',
       'water_tower',
     )
   }
   fields = (
     ('height', Integer()),
   )
)

Ampliando el esquema por defecto

El esquema que carga Imposm por defecto es generalmente insuficiente ya que se suele emplear un abanico de datos mucho más amplio.

Por ejemplo, en nuestro caso no se está incluyendo en la base de datos ningún registro de los siguientes tipos y subtipos:

  • Amenity
    • restaurant
    • pub
    • cafe
    • place of worship
    • parking
  • Natural
  • Tourism
  • Barrier

Por lo que debemos modificar el archivo de mapping para que los incluya. El archivo mapping se encuentra en la siguiente localización:

/usr/local/lib/python2.7/dist-packages/imposm/defaultmapping.py

lo copiamos y editamos empleando los siguientes comandos:

(venv)$ cd ~/tallerimposm
(venv)$ cp venv/lib/python2.7/site-packages/imposm/defaultmapping.py mappingtaller.py
(venv)$ medit mappingtaller.py

Buscamos la cadena amenities = Points usando el comando buscar de medit pulsando en la lupa de la barra de herramientas.

Tablas cargadas por Imposm

Como podemos ver, Imposm por defecto tiene determinados tipos de Amenity cuando son puntos pero no tiene ninguno de los indicados en la lista referida un par de párrafos más arriba.

Vamos a añadir al argumento mapping los elementos que le faltan (no importa el orden) respetando la sintaxis de tuplas de Python de forma que quede de la siguiente manera:

amenities = Points(
    name='amenities',
    mapping = {
        'amenity': (
            'university',
            'school',
            'library',
            'fuel',
            'hospital',
            'fire_station',
            'police',
            'townhall',
            'restaurant',
            'pub',
            'cafe',
            'place_of_worship',
            'parking',
        ),
})

El caso de los árboles (natural/tree) es distinto ya que por defecto Imposm no incluye un mapping para la clave Natural, por lo que la crearemos desde cero, justo debajo del objeto amenities vamos a crear un nuevo objeto para poder importarlos.

arboles = Points(
    name = 'arboles',
    mapping = {
        'natural': (
            'tree',
        ),
    },
)

Guardamos el archivo con y salimos de medit.

Ejecutamos el comando para escribir y optimizar los datos en la base de datos:

(venv)$ imposm --database nott-osm --host localhost --user user \
  --read /usr/local/share/data/osm/Nottingham.osm.bz2 \
  --write --optimize --deploy-production-tables \
  --overwrite-cache --remove-backup-tables -m mappingtaller.py

En este caso es necesario volver a leer los datos y generar los archivos de cache, ya que hemos modificado la estructura de los datos. Con la opción --overwrite-cache se sobrescribirán directamente los archivos necesarios.

Con pgAdmin podemos comprobar como se han importado 1059 árboles y si echamos un vistazo a la tabla osm_amenities veremos que se han importado puntos con las etiquetas que hemos elegido.

Amenities por tipo

Ejercicio

Como ejercicio del taller se propone crear el mapping, escribir los datos en la base de datos y desplegar las tablas para las claves de OSM siguientes:

tourism (71 puntos nuevos):
information, hotel, artwork y attraction
barrier (1688 puntos nuevos):
gate, bollard, entrance, cycle_barrier, lift_gate, stile y fence

TileMill, el estudio cartográfico

TileMill es un herramienta que permite un acercamiento al diseño cartográfico a través de un lenguaje que es familiar a los desarrolladores web. Se trata de un producto de escritorio (aunque se puede ejecutar para acceder vía web). El objetivo de TileMill es diseñar cartografía de la forma más sencilla y atractiva posible generando como productos finales diferentes visualizaciones, tal y como se verá más adelante.

TilMill es software libre, está desarrollado por Mapbox y el código fuente está disponible en su repositorio en GitHub.

Iniciando TileMill

Nota

Este taller está diseñado para ejecutarse en OSGeo Live 7.0

Arrancamos TileMill seleccionando la opción del menú Geospatial ‣ Spatial Tools ‣ TileMill

Secciones

La interfaz de TileMill dispone de las siguientes secciones:

Editor:
Es el espacio de trabajo del estudio, donde se cargan datos y se a estilo a la cartografía.
Projects:
Espacio para administrar los proyectos que tenemos cargados en TileMill. Solo podemos tener cargado un proyecto cada vez en el editor.
Manual:
Documentación integrada con diversos apartados sobre cómo funciona TileMill.
Plugins:
Sección para activar funcionalidad adicional de TileMill.
Settings:
Configuración de TileMill.

Creando el proyecto

TileMill carga por defecto la pestaña de Projects y en ella tenemos el botón + New Project que pulsaremos definir nuestro proyecto.

Nuevo proyecto con TileMill

Nos muestra la ventana de información del proyecto en la que deberemos introducir los datos básicos que lo identifiquen.

Información del nuevo proyecto
Filename
cfp2014
Name
Curso TileMill CFP 2014
Description
Mapa de Nottingham
File format
PNG 24
Default data
Dejar marcado

Y pulsamos el botón Add

Al abrir el proyecto, pulsando sobre el en la pestaña Projects vemos que se han cargado una capa de países por defecto y que tiene un nivel de visualización bastante alto.

Añadiendo datos

El primer paso siempre es añadir datos y el primer paso para añadirlos es tener claros sus metadatos, siempre hay que poner especial atención a:

  • Formato
  • Tamaño
  • Sistema de referencia

La confusión en cualquiera de los tres campos puede llevarnos a que la cartografía no se pueda cargar o no quede alineada correctamente.

TileMill no puede reproyectar los datos que usa como origen de información de los mapas que componen, por lo que siempre se le deben proporcionar en uno de los SRS soportados que son EPSG:900913 (EPSG:3857) y WGS84 (EPSG:4326) aunque existe la posibilidad de forzar la reproyección introduciendo los valores adecuados para proj4 que suelen poder conseguirse en http://epsg.io.

Formatos vectoriales admitidos

CSV
Se trata de archivos de hoja de cálculo con variables separadas por comas y que tienen la información geográfica en columnas que se llaman «lat» o «latitude» o incluso «geo_longitude», TileMill reconoce automáticamente el nombre de esas columnas.
ESRI Shapefile
Uno de los formatos vectoriales más populares antiguamente. Si el archivo .prj no está presente TileMill intentará averiguar el SRS de la información contenida.
KML
Este formato soportado, tiene algunas limitaciones para ser usado en TileMill ya que no reconoce algunas de las funcionalidades avanzadas de los KMLs (estilos embebidos, imágenes, modelos 3D). Tampoco reconoce el formato KMZ.
GeoJSON
Es uno de los formatos más populares actualmente, es un formato basado solamente en texto con una estructura flexible.

Formatos raster admitidos

GeoTIFF
Es uno de los formatos más conocidos para almacenar imágenes aéreas, satélite y modelos de elevación del terreno. Para manipular la información raster TileMill emplea GDAL que es una potentisima biblioteca de acceso a datos raster.

Bases de datos admitidas

SQLite
Es el sistema de bases de datos basadas en un solo archivo más popular del Software Libre. Estas bases de datos se pueden generar empleando un software de escritorio como QGis.
PostGIS
Literalmente el elefante en la habitación. El mayor proyecto de base de datos relacional geográfica del Software Libre.

Introducción al lenguaje CartoCSS

CartoCSS es el lenguaje que utiliza TileMill para aplicar estilos a las primitivas cartográficas. Está basado en Cascadenik que es un pre-procesador de estilos más antiguo. CartoCSS utiliza la biblioteca de renderizado de cartografía Mapnik, otro excelente componente de software libre.

Mapnik se configura directamente mediante ficheros XML, pero poca gente entiende XML así que hace un tiempo que aparecieron estas herramientas que generan su XML a partir de un lenguaje más sencillo y expresivo, en definitiva para hacer «la vida más fácil» a los usuarios de Mapnik.

TileMill usa Mapnik por debajo y CartoCSS es el lenguaje con el que le comunica cómo deben quedar las cosas.

Pintando puntos

#osm_puntos {
  marker-width: 6;
  marker-fill: #EE0000;
  marker-line-color: #55060f;
}

Existen dos tipos de puntos Point y Marker entre los dos suman 30 propiedades.

ejemplo con algunos puntos dibujados

Pintando lineas

#osm_lineas {
  line-width:1;
  line-color:#168;
}

Existen 19 propiedades distintas para las ĺíneas.

ejemplo con algunas líneas dibujadas

Pintando áreas

#osm_buildings {
    line-color: darken(#ccc,40%);
    line-width: 2;
    polygon-opacity: 1;
    polygon-fill: #ccc;
}

Existen 5 propiedades distintas para las áreas.

ejemplo con áreas dibujadas

Pintando con clase

También se pueden usar clases y condiciones para filtrar las propiedades por atributos o por el nivel de zoom en el que nos encontremos. Finalmente los selectores se pueden anidar para compartir propiedades. Más información en la documentación sobre selectores.

En el ejemplo siguiente se seleccionan todos los puntos de la capa osm_puntos que tengan algún dato en el campo tourism (pidiendo que sea distinto a la cadena de texto vacía) y se aplicará solo a partir del nivel de zoom 14. En ese selector se establecen unas propiedades generales de tamaño y color del borde y a continuación se anidan selectores por cada una de las clases a renderizar estableciendo solo la propiedad que va a cambiar, es decir, el color del símbolo.

#osm_puntos[tourism!=""][zoom>13]{
    /** propiedades generales **/
    marker-width: 8;
    marker-line-color: #000;

    /** temático por tipo de turismo **/
    [tourism="artwork"]{
      marker-fill: #a6cee3;
    }
    [tourism="attraction"]{
      marker-fill: #1f78b4;
    }
    [tourism="gallery"]{
      marker-fill: #b2df8a;
    }
    [tourism="hostel"]{
      marker-fill: #33a02c;
    }
    [tourism="museum"]{
      marker-fill: #e31a1c;
    }
}
ejemplo con clases

Y alguna cosilla más

El uso de @ te permite definir variables

/** colores para agua y bosque**/
@water : #c0d8ff;
@forest: #cea;

/** estilos para usos del suelo
    de para agua y bosque **/
#landusage{
    /* características generales */
    line-color: #000;
    line-width: 2;
    polygon-opacity: 1;

    [type="water"]{
      polygon-fill: @water;
    }
    [type="wood"]{
      polygon-fill: @forest;
    }
}

Y existen funciones para operar sobre los colores para aclararlos, oscurecerlos, etc. (referencia de color) :

@border-water: darken(@water,50%);

En algo como esto:

@water  : #c0d8ff;
@forest : #cea;

/** los bordes más oscuros **/
@border-water  : darken(@water,50%);
@border-forest : darken(@forest,50%);

#landusage{
    /* características generales */
    line-width      : 2;
    polygon-opacity : 1;

    [type="water"]{
      polygon-fill : @water;
      line-color   : @border-water;
    }
    [type="wood"]{
      polygon-fill : @forest;
      line-color   : @border-forest;
    }
}

Taller

En las siguientes secciones se espera que el alumno repita las acciones propuestas para cargar los distintos tipos de datos soportados por TileMill y aplicando estilos similares a los indicados.

Añadiendo una capa de puntos

Procederemos ahora a añadir nuestra primera capa de puntos, para lo que desplegaremos el menú de capas pulsando en el botón Menú de capas y seleccionamos + Add layer

En la ventana que aparece seleccionaremos la opción de PostGIS y rellenamos los campos como se indica.

Añadiendo una capa PostGIS
ID
osm_puntos
Class
puntos
Connection
dbname=nott-osm host=localhost port=5432 user=user password=user
Table or subquery
osm_places
Unique key field
osm_id
Geometry field
geometry
SRS
Seleccionamos 900913

Y pulsamos Save & Style para que añada los datos con un estilo por defecto.

Veremos como inmediatamente aparece un punto en la zona de Inglaterra.

Añadiendo una capa PostGIS
Corrigiendo la visualización por defecto

En realidad nuestra zona de trabajo es bastante más pequeña que la que muestra por defecto TileMill, por lo que modificaremos las preferencias para que muestre por defecto una zona más ajustada a nuestro juego de datos. Para ello pulsaremos en el botón de configuración del proyecto Menú de capas y lo configuramos de la siguiente forma:

Zoom
Desplazar las barras para que los niveles de zoom estén entre 12 y 20
Center
-1.1476,52.9531,12
Bounds
-1.2488, 52.9083, -1.0771, 53.0076
Menú de capas

Añadiendo elementos lineales

Para representar las calles utilizaremos una de las ayudas que proporciona ImpOSM; como ya hemos dicho, por defecto separa las vías en varias tablas, pero también crea una vista de PostGIS que aglutina toda la información relativa a estas.

Añadiremos una nueva capa de PostGIS que lea la información de la tabla osm_roads

Para obtener todos los distintos tipos de vía podemos usar emplearemos pgAdmin III donde podemos lanzar la consulta:

SELECT type as tipo, count(type) as total
FROM osm_roads
GROUP BY type
ORDER BY total DESC, tipo;
Tipos de vía incluídos

Añadiremos una entrada para cada tipo de vía.

  • residential
  • footway
  • service
  • cycleway
  • tertiary
  • unclassified
  • primary
  • steps

Para representarlo usaremos el código como el siguiente:

#osm_lineas {
    line-width:1;
    line-color:#cce;
    [type = 'footway'], [type = 'cycleway'] {
          line-color:#f2f974;
    }
    [type = 'residential'],     [type = 'service']  {
          line-color:#aaa;
    }
    [type = 'steps'] {
          line-color:#7cc7fd;
    }
    [type = 'unclassified'] {
          line-color:#ff9f3b;
    }
    [type = 'primary'] {
          line-width:2;
          line-color:darken(#ff9f3b, 30%);
    }
    [type = 'tertiary'] {
          line-width:1.5;
          line-color:darken(#8beb18, 10%);
    }
}

Añadiendo los edificios

Añadiremos ahora los edificios, que están en la tabla osm_buildings.

#osm_edificios {
  line-color:#a71b62;
  line-width:0.5;
  polygon-opacity:1;
  polygon-fill:#d86ebb;
}

Importante

El orden de renderizado de las capas es el orden en el que aparecen en el gestor de capas Menú de capas, para cambiar el orden basta pulsar en el indicador del tipo de capa (puntos, líneas y áreas) que hay junto al nombre y arrastrar hacia arriba o hacia abajo la capa.

Añadiendo etiquetas

Por último, añadiremos los nombres de las calles, para lo cual primero tenemos que definir una variable, preferentemente al principio de todas las definiciones, que tenga el nombre de la fuente y las posibles fuentes sustitutas si la fuente no está instalada en el sistema.

@futura_med: "Futura Medium","Function Pro Medium","Ubuntu Regular","Trebuchet MS Regular","DejaVu Sans Book";

TileMill incorpora un gestor de fuentes que nos permite ver qué fuentes hay instaladas en el sistema al que se accede empleando el botón de fuentes botón del gestor de fuentes, las fuentes instaladas aparecen en negrita y el gestor nos permite copiar y pegar literalmente el nombre de la fuente.

Aunque la capa de calles ya tiene el campo name que es el que vamos a utilizar, es siempre muy recomendable volver a añadir la capa y usarla exclusivamente para las etiquetas. En este caso rellenaremos los campos con los siguientes datos:

ID
calles_nombres
Class
nombres
Connection
dbname=nott-osm host=localhost port=5432 user=user password=user
Table or subquery
(SELECT * FROM osm_roads WHERE name IS NOT NULL) AS foo
Unique key field
osm_id
Geometry field
geometry
SRS
Seleccionamos 900913

En esta ocasión en vez de la tabla, hemos usado una subconsulta, de forma que solo carguemos en memoria las entidades que tengan algún valor en el campo name. A las subconsultas hay que añadirles un alias para que TileMill las reconozca.

TileMill habrá asignado a la capa un estilo por defecto para capas de líneas, aunque nosotros lo vamos a modificar para que represente textos:

#calles_nombres {
    text-name: "[name]";
    text-face-name: @futura_med;
    text-placement: line;
}

Estos son los elementos mínimos para que una etiqueta aparezca en TileMill, aunque si vamos a la ayuda del programa Botón de ayuda y vemos la sección text veremos que las etiquetas tienen 30 opciones de configuración distintas.

Ayuda de texto desplegada

Más sobre el lenguaje CartoCSS

Usando iconos como marcadores

Para usar los iconos deben referenciarse con una ruta relativa a la carpeta del proyecto

Por ejemplo para pintar puntos de interés

.amenity.place[zoom=15] {
  [type='police']{
    point-file: url(../res/comi-9px.png);
  }
  [type='fuel'] {
    point-file: url(../res/petrol-9px.png);
  }
  [type='townhall'],
  [type='university'] {
    point-file: url(../res/poi-9px.png);
  }
}
ejemplo con iconos

Pintando cajas de carretera

.highway[TYPE='motorway'] {
  .line[zoom>=7]  {
    line-color:spin(darken(@motorway,36),-10);
    line-cap:round;
    line-join:round;
  }
  .fill[zoom>=10] {
    line-color:@motorway;
    line-cap:round;
    line-join:round;
  }
}

.highway[zoom=13] {
  .line[TYPE='motorway']      { line-width: 2.0 + 2; }
  .fill[TYPE='motorway']      { line-width: 2.0; }
}
ejemplo con carreteras

Extra: OSM-Bright

Mapbox ha liberado un proyecto en TileMill para presentar datos de OSM con un estilo atractivo y bien documentado. Para poder usar este proyecto debemos descargar algunos datos base (línea de costa y límites administrativos) y luego ejecutar un script configurando algunos parámetros en un fichero.

En este caso usaremos como fuente de datos de nuevo el fichero de extracción de OSM de Nottingham, creando una nueva base de datos e importando el fichero usando imposm y un fichero de mapping de etiquetas proporcionado por OSM-Bright.

En primer lugar nos esplazamos a la carpeta de trabajo y activamos un entorno virtual con imposm 2.5.0 instalado:

$ cd /home/user/tallerimposm
$ source venv/bin/activate
(venv)$ imposm --version
Enabling Shapely speedups.
imposm 2.5.0

A continuación descargamos OSM-Bright y lo descomprimimos obteniendo una carpeta osm-bright-master a la que nos desplazaremos:

(venv)$ wget -O osmbright.zip "https://github.com/mapbox/osm-bright/archive/master.zip"
(venv)$ unzip osmbright.zip
...
(venv)$ cd osm-bright-master

En esta carpeta descargaremos tres ficheros con cartografía (puede tardar un rato, uno de ellos es bastante pesado):

(venv)$ wget http://tilemill-data.s3.amazonaws.com/osm/coastline-good.zip
(venv)$ wget http://tilemill-data.s3.amazonaws.com/osm/shoreline_300.zip
(venv)$ wget http://mapbox-geodata.s3.amazonaws.com/natural-earth-1.3.0/physical/10m-land.zip

Creamos la base de datos nott-osm-2 y activamos la extensión de PostGIS:

(venv)$ createdb -E UTF8 nott-osm-2
(venv)$ psql -d nott-osm-2 -c "create extension postgis"

Y ya estamos listos para cargar la base de datos usando imposm y el fichero e mapping que hay en la carpeta imposm-mapping.py:

(venv)$ imposm --user user -d nott-osm-2 -m imposm-mapping.py \
    --read --write --optimize --deploy-production-tables \
    /usr/local/share/data/osm/Nottingham.osm.bz2

El siguiente paso es configurar el fichero de OSM-Bright, para ello copiamos el archivo de ejemplo configure.py.sample y lo editamos con medit:

(venv)$ cp configure.py.sample configure.py
(venv)$ medit configure.py

En este fichero deberemos establecer:

  • imposm como el importador que hemos usado
  • Si queremos, un nombre para el proyecto
  • Los parámetros de conexión a la base de datos
  • Las coordenadas de la zona de interés, que para la zona de Nottingham son -139015.78, 6966053.88,-119902.22, 6984403.83
Configuración de OSM Bright

Con el fichero correctamente configurado estamos listos para crear el proyecto de TileMill. Simplemente en la misma carpeta ejecutamos el script make.py:

(venv)$ python make.py
installing to /home/user/Documents/MapBox/project/OSMBrightNottingham

A continuación podemos abrir TileMill y deberíamos de tener un nuevo proyecto. Al abrir este proyecto probablemente tarde unos segundos en responder ya que tiene que traer de la base de datos un buen número de elementos. Tras unos instantes podremos navegar por la cartografía. Si activamos el plugin tilemill-lots podremos además ver cómo cambia la simbología en los diferentes niveles de zoom.

La zona de trabajo usando OSM Bright y varios niveles de zoom.

La configuración de este proyecto es amplia y compleja, pero activando y desactivando capas y usando el mencionado plugin podemos ir repasando cómo se han ido filtrando los diferentes tipos, y cómo los diseñadores han ido jugando con los niveles de zoom para definir la simbología desde las escalas más pequeñas hasta las de mayor detalle.

Exportando los mapas

TileMill genera diferentes productos cartográficos a partir del diseño realizado. Es decir, una vez estamos satisfechos con la simbología, podemos exportar el mapa en diferentes formatos y que responden a diferentes necesidades.

Menú de exportación de TileMill
  • Carga en Mapbox: subir las teselas al servicio de este proveedor para poder insertarlo fácilmente en nuestras aplicaciones web.
  • PNG: generar una única imagen, lista para insertar en cualquier informe, página web o cualquier otro documento.
  • PDF: genear una única imagen dentro de un documento en formato PDF.
  • MBTiles: renderizar las teselas en un fichero en formato MBTiles. Este fichero luego puede utilizarse en cualquier aplicación que soporte este formato.
  • SVG: la salida en este formato mantiene el formato vectorial y puede ser utilizado por ejemplo para impresiones de alta calidad al permitir su escalado sin perder detalle.
  • XML de Mapnik: esta salida no devuelve una imagen sino un fichero para la librería Mapnik que podemos luego utilizar con otras herramientas. En este fichero se encuentra definido todo lo necesario para acceder a los datos y darles la simbología seleccionada.

Montando un TMS

Como hemos visto, TileMill genera un fichero en formato MBTiles para poder llevar nuestra renderización de un sitio a otro fácilmente. En ocasiones por otro lado, resulta conveniente exportar las teselas almacenadas en la base de datos de este formato a una estructura de carpetas siguiendo el estándar TMS, ya que de esta forma puede resultar accesible por ejemplo por un cliente web como OpenLayers.

Para extraer las imágenes de este tipo de ficheros podemos usar la herramienta mbutil, desarrollada por Mapbox y que ofrece un ejecutable para la línea de comandos que exporta el fichero fácilmente.

Para instalarla teniendo un entorno virtual activado basta con ejecutar:

(venv)$ pip install mbutil

Para generar un TMS ejecutamos:

(venv)$ mb-util --scheme=tms exportado.mbtiles directorio/

Otras alimañas

Extensiones

TileMill es un software que dispone de extensiones conocidas como plugins. Esta funcionalidad se introdujo a partir de la versión 0.9 aprovechando que NodeJS, el software sobre el que está construído., facilitó el mecanismo para gestionarlos.

Las funcionalidades principales de TileMill se agrupan en cuatro extensiones básicas que no se pueden desactivar (marcadas como Core) y 7 extensiones opcionales disponibles que añaden funcionaliades diversas como poder ver el mapa en varios niveles de zoom a la vez, poder utilizar mapas de Mapbox como mapa base o poder ordenar las columnas en la vista de tabla.

ejemplo de mapa interactivo

Mapas interactivos

TileMill admite cierta interactividad que se puede configurar para cada mapa. Esta interactividad solo es útil si se va a subir el mapa al servicio de alojamiento de teselas de Mapbox, ya que en los productos generados revisados (imágenes, MBTiles, etc.) no se puede acceder a esta funcionaliad. El proyecto Geography Class está cargado por defecto en la instalación de TileMill y es un ejemplo excelente de interacción en el mapa.

ejemplo de mapa interactivo

Las dos características más interesantes a configurar son:

  • Leyenda: aparecerá sobre el mapa en la esquina inferior derecha. Se trata de un documento HTML estático que deberemos editar directamente en TileMill.
  • Tooltip: se configura una plantilla en HTML en la que se puede hacer referencia a los valores del objeto sobre el que el ratón se posiciona. El tooltip solo puede acceder a los campos de una única capa.

Estas opciones se establecen haciendo clic sobre el icono con forma de mano en la parte inferior izquierda de la interfaz de TileMill.

ejemplo de mapa interactivo

Ejercicio

Empleando la cartografía existente en la base de datos nott-osm se requiere realizar un diseño cartográfico que destaque los siguientes elementos:

ejemplo de resolución del ejercicio

Vías

Se destacará la red viaria de forma que exista una clasificación de carreteras que permita identificar visualmente los siguientes tipos:

  • motorway y motorway_link
  • trunk y trunk_link
  • primary y primary_link
  • secondary y secondary_link
  • tertiary
  • residential
  • pedestrian, path y cycleway
  • rail
  • resto
Tabla
osm_roads

Edificios

Se destacará el entramado urbano que permita diferenciar los siguientes tipos:

  • city_hall, conservatory y museum
  • college, library y university
  • flat, flats, house y residential
  • industrial, light_industry_units
  • retail, shop, shopping_mall y shops
  • resto
Tabla
osm_buildings

Áreas

Se destacarán con un color distinto debajo de la capa de edificios las siguientes áreas urbanas:

  • commercial, retail
  • hospital
  • industrial
  • nature_reserve, park, wood
  • residential
  • university

En caso de existir una correspondencia entre un tipo de edificios y un área, el área deberá ser un 20% más oscura que el edificio pero emplear el mismo tono, además los polígonos de área deberán tener una opacidad del 10%.

¿Qué tabla hay que emplear? Abre la aplicación Geospatial ‣ Databases ‣ pgAdminIII y explora la base de datos nott-osm para averiguar dónde está la información.

Lugares de interés

Para la simbología de lugares de interés emplearemos la biblioteca de símbolos Maki desarrollada también por la empresa Mapbox y el código que hemos visto en la sección Usando iconos como marcadores. Se representarán las comisarías de policía Icono de comisaría y los hospitales Icono de hospital cada uno con su símbolo puntual distintivo.

La biblioteca de iconos Maki ha sido especialmente diseñada para ser empleada con TileMill y proporciona los iconos tanto en formato raster (.png) como en formato vectorial (.svg). En la página web está el enlace para descargar la biblioteca en ambos formatos en un archivo .zip. También se puede encontrar el enlace a un tutorial sobre las posibilidadesde empleo en TileMill.

Para usar las imágenes de Policía y Hospital:

  1. Crearemos una carpeta imgs dentro del directorio del proyecto que podemos encontrar en /home/user/Documents/MapBox/project/cfp2014.
  2. Descomprimimos el archivo .zip, que es una copia del repositorio de GitHub, y navegamos hasta la carpeta renders.
  3. Copiaremos las imágenes police*.png y hospital*.png en el directorio imgs que hemos creado anteriormente.

Importante

¿Qué tabla hay que emplear? Abre la aplicación Geospatial ‣ Databases ‣ pgAdminIII y explora la base de datos nott-osm para averiguar dónde está la información.

Este taller pretende ser una breve introducción a un flujo de trabajo que permite tener mapas funcionales y estéticos. A lo largo del taller vamos a ver una serie de herramientas FOSS4G que permiten crear estos mapas de una manera sencilla y con un lenguaje de diseño cartográfico especialmente próximo a los desarrolladores web.

El taller tiene tres partes en las que veremos:

  • Por qué la base de datos del proyecto OpenStreetMap (OSM) es tan relevante y cómo obtengo sus datos y cómo se trabaja con JOSM.
  • La herramienta ImpOSM que convierte el XML de OSM en una base de datos geográfica.
  • Cómo hacer buenos mapas para la web con Mapnik y su lenguaje Carto.

Nota

La url del taller es http://bit.ly/cfp2014-jitw

¿Qué es Geoinquietos Valencia?

La idea detrás de Geoinquietos Valencia es la misma que la que hay detrás de los otros grupos de Geoinquietos (Barcelona, Cantabria, Zona norte y Madrid) se trata de compartir la pasión que tenemos por todo lo geo y mantenernos al tanto de noticias y novedades. ¿Cómo? Pues muy fácil, asistiendo a las reuniones que tienen lugar aproximadamente cada mes.

La estructura de estas reuniones no puede ser más sencilla... nos reunimos en un sitio con suficiente espacio y a ser posible conexión a Internet y a ser muy posible proyector, para tratar los temas que se hayan propuesto con anterioridad usando una wiki como espacio de colaboración ágil. Todo el mundo está invitado a añadir contenidos para enriquecer la página.

Estos temas a tratar también pueden estar aderezados con alguna pequeña charla de uno de los asistentes en la que puede explicar en que consiste su trabajo, su hobby, algo que le haya resultado curioso, pero todo relacionado con el mundillo geo.

Facilitadores

Autores

Licencia

Excepto donde quede reflejado de otra manera, la presente documentación se halla bajo licencia Creative Commons Reconocimiento Compartir Igual

CC BY SA