OSRM: un motor de itinerario con los datos de OpenStreetMap

28 de Enero de 2013

Este artículo es una adaptación y traducción del tutorial original en francés de Geotribu: Créer votre moteur d'itinéraires Open Source avec OSRM. Lo hemos redactado con Julien Moura quién me propuso la idea y hizo la mayoría del trabajo. Gracias a Arnaud por prestarnos su servidor!

Introducción global

En el gran mundo del web mapping, el cálculo optimizado de itinerarios es uno de los grandes desafíos. No se trata solamente de ir del punto A hacia el punto B, sino de proponer varias opciones, itinerarios alternativos, tomar en cuenta las diferentes modalidades de transporte (carro, tren, bicicleta, bote, peatonal, etc.), incluir etapas, respetar los sentidos de las vías, etc. El advenimiento de los equipos móviles (smartphones, pads) refuerza la importancia de estos servicios, cuya calidad depende de la calidad de los datos utilizados, como lo ilustra bien el “buzz” que hubo acerca del fracaso de la aplicación Plans de Apple.

En Lima, Google Maps (lo mejor del mercado) no es perfecto. Así que tuvimos la idea de armar un motor de itinerarios, libre y gratis, específico para Lima y Callao disponible aqui.

En este artículo, detallamos el método, paso a paso, usado para armar el motor.

Open Source Routing Machine y OpenStreetMap

Como siempre en estos temas, Google Maps fue uno de los pioneros a proponer un servicio eficiente de gran escala. Pero, como siempre también, sus datos y su servicio son relacionados a una política comercial y propietaria. Igualmente para los otros competidores: Bing Maps, Yahoo Maps, etc.

Queríamos un sistema libre, independiente y gratis, así que hemos elegido OSRM (Open Source Routing Machine), que es basado sobre los datos de OpenStreetMap (OSM). No es la única solución que existe para calcular itinerarios, pero es muy sencillo de instalar y sobre todo es muy potente según una prueba comparativa realizada por Pascal Neis:

Comparasión

Fuente: Neis One

Creado por Dennis Luxen del Instituto Tecnológico de Karlsruhe, OSRM es programado mayormente en C++ y compatible con la mayoría de los sistemas operativos (Linux, FreeBSD, Windows, Mac).

Un calculador de itinerario no es algo mágico que te encuentra la mejor ruta así de la nada. Esta basado sobre datos viales y de la calidad de estos datos va a depender la calidad del resultado (velocidad para obtener una respuesta y una buena ubicación). Como siempre en los datos espaciales, dos puntos son importantes, la geometría y los atributos. La geometría es lo más obvio de entender porque es visual y se comprende perfectamente que sí una calle no esta presente en nuestra base de datos, nuestro algoritmo no podrá darnos una ruta que pasa por ella. En cuanto a los atributos su rol es diferente pero su importancia es igual. En efecto, una base de datos que contiene informaciones (es decir campos) sobre el sentido del tráfico, la velocidad máxima autorizada o el número de carriles ofrecerá mucho más potencial que una que contiene únicamente la geometría y el nombre de las vías.

La ventaja de los datos abiertos va adelante de la cuestión del precio (aunque no es despreciable cuando se sabe el costo importante de una base de datos vial propietaria). El modelo OSM funciona perfectamente (hay que ver la cantidad y calidad de datos en Europa y EE.UU), la mejor prueba de eso es lanzamiento de Map Maker de parte de Google que permite a los usuarios editar (agregar, suprimir, modificar) los datos de Google Maps. La (grande) diferencia es que estos datos creados por el usuario son propiedad de Google y no de el.

Para esta demostración, usamos el sistema operativo Ubuntu 12.04.

Primer paso: descargar y preparar lo necesario del programa

Vamos siguiendo lo que esta indicando en el wiki oficial. Necesitamos los archivos del motor y también queremos la interfaz avanzada (en Javascript con Leaflet) por qué siempre una herramienta ergonómica es más agradable de usar.

Para conseguir OSRM y su interfaz, hay dos métodos posibles:

cd carpeta/donde/se/quiere/instalar/osrm

sudo git clone https://github.com/DennisOSRM/Project-OSRM.git -- recursive
 

Descargar y instalar las librerías indispensables para la compilación, las pruebas y el funcionamiento global:

sudo apt-get install build-essential git scons pkg-config libprotoc-dev libprotobuf7 protobuf-compiler libprotobuf-dev libosmpbf-dev libpng-dev libbz2-dev libstxxl-dev libstxxl-doc libstxxl1 libxml2-dev libzip-dev libboost-thread-dev libboost-system-dev libboost-regex-dev libboost-filesystem-dev lua5.1 liblua5.1-0-dev libluabind-dev rubygems osmosis

Después se trata de compilar OSRM. No se asusten, es super simple:

cd carpeta/donde/se/ha/instalado/osrm

sudo scons

Segundo paso: descargar y armar los datos

Descargar los datos de OSM sobre Lima y Callao:

  1. ir a la página http://extract.bbbike.org (hay otras posibilidades pero esta nos parece sencilla),
  2. seleccionar la zona deseada,
  3. ingresar su correo electrónico
  4. escoger el formato .PBF

Dependiendo del tamaño de la zona seleccionada, puede demorar entre 10 y 30 minutos. Después se recibe un correo con un enlace web para descargar su archivo. En nuestro caso, llegó en 15 minutos y hemos descargado el archivo llamado “planet_-77.486,-12.609_-76.135,-11.346.osm.pbf” de 2 800 Ko.

Una vez descargado, le aconsejamos mover el archivo dentro de la carpeta de OSRM, por ejemplo creando una subcarpeta “datos” y renombrar el archivo en “LimaCallao_2012-11-08.osrm.pbf”.

Ahora les tocan extraer y alistar los datos del archivo descargado:

cd carpeta/donde/se/ha/instado/osrm/

./osrm-extract datos/LimaCallao_2012-11-08.osm.pbf

OSRM Extract

3 nuevos archivos son creados automáticamente:

Como indicado al final del terminal, ahora nos toca crear la jerarquía de la red vial: diferentes tipos o anchos de vías = diferentes velocidades, prioridades, etc. No entramos en los detalles y hacemos con la configuración por defecto:

cd carpeta/donde/se/ha/instado/osrm/

./osrm-prepare datos/LimaCallao_2012-11-08.osrm atos/LimaCallao_2012-11-08.osrm.restrictions

Dependiendo del tamaño del archivo descargado, este tratamiento puede demorar (8 minutos en nuestro caso). Bueno, era ya el tiempo de la pausa! ;)

Volviendo del cafecito, 5 nuevos archivos aparecieron:

Penúltimo paso: configuración del servidor

Configurar el archivo server.ini para que el servidor y el motor se puedan iniciar con nuestros archivos:

  1. abrir el archivo server.ini con un editor de texto (Gedit, Geany, SublimeText, etc.)
  2. editar las rutas para que correspondan a nuestros archivos *.osrm. Así que en nuestro ejemplo, reemplazar /opt/osm/berlin.osrm por ./datos/LimaCallao_2012-11-08.osrm excepto la última linea que ponemos en comentario

Antes

Despues

Último pasito: iniciar el motor

cd carpeta/donde/se/ha/instado/osrm/

./osrm-routed

Deberian ver en su consola algo parecido al siguiente:

OSRM routed

Ahora su motor de itinerario se puede ver en el URL:

carpeta/donde/se/ha/instalado/osrm/Docs/WebContent/main.html

Ir más lejos: personalizar su servidor

Si quieren sacarle todo el jugo a OSRM, pueden consultar su wiki que detalla las diferentes posibilidades de uso. Por ejemplo:

Conclusión

Los resultados obtenidos no son perfectos. Por ejemplo la indicación del tiempo de viaje es muy subestimada (alrededor de 15 minutos entre el centro de Lima y Chorrillos!). Pero como lo hemos mencionado anteriormente, no es culpa del algoritmo si no de los datos. En efecto, como la mayoría de los datos viales de OSM en Lima no tienen información sobre la velocidad máxima autorizada, los resultados de OSRM son absurdos.

Lo interesante es que esa herramienta permite ver los puntos débiles de los datos OSM (velocidad, sentido del tráfico, …). Además, en la parte inferior izquierda, hay iconos que te permiten acceder a la sesión de edición de los datos OSM. Entonces si quieres mejor resultados de itinerarios, create una cuenta de usuario en OpenStreetMap y ven a mapear!

Twittear