Como instalar y usar Osm2pgsql en Windows

26 de Noviembre de 2013

Hoy día necesitaba convertir datos de OpenStreetMap en una base de datos Postgresql para luego poder crear unos mapas con Mapnik. Existen varios programas que permiten hacer este trabajo pero al final decidí usar Osm2pgsql. Como las explicaciones de instalación y de uso en Windows son medio confusas, comparto aca mis pasos, capaz puede ayudar alguien.

Mi configuración es la siguiente: Postgresql 9.3 + Postgis 2.1 en Windows 8 64 bits.

Instalación

Como indicado en el tutorial, descargue este zip y lo descomprimí en mi disco C. Esta carpeta contiene 2 carpetas, una para los sistemas 32 bits y la otra para los 64 bits. Usé la segunda. No lo hice pero obviamente se puede también agregar la ruta de la carpeta en su path.
Para verificar que todo este bien, imprimimos la ayuda:

C:osm2pgsqld>osm2pgsql.exe -h

Si todo sale bien, vemos algo así (puse solamente las primeras lineas):

osm2pgsql SVN version af61cae663 (64bit id space)

release notes: 'Windows version built by Dominik Perpeet (http://www.customdebug.com/osm2pgsql/index.html)'
Usage:
        osm2pgsql.exe [options] planet.osm
        osm2pgsql.exe [options] planet.osm.{gz,bz2}
        osm2pgsql.exe [options] file1.osm file2.osm file3.osm

This will import the data from the OSM file(s) into a PostgreSQL database
suitable for use by the Mapnik renderer

Options:
   -a|--append          Add the OSM file into the database without removing
                        existing data.
...
...
...

Conseguir los datos OSM

Capaz el mejor recurso parar obtener datos OSM es el sitio GeoFabrik (una empresa alemana especialista en el procesamiento de datos OSM). Ponen a nuestra disposición de manera gratuita los datos actualizados (todos los días creo) por regiones geográficas en su sección de descarga. En mi caso voy a usar el archivo osm.bz2 de todo el Peru.

Un sitio que descubrí hace poco y que también parece bueno es Metro Extracts que permite bajar datos OSM de varias ciudades importantes del mundo en diferentes formatos (incluido shapefile). Pero la frecuencia de actualización no es tan alta como la de GeoFrabrik, la última actualización es del 01/07/2013.

Uso

Ya que tenemos los datos podemos empezar las cosas serias!

En Postgresql creo una base de datos espacial que llamo "peru_osm".

A esa base de datos le agrego la extensión hstore (un tipo de datos similar a los dicionarios en Python). Por ejemplo en PgAdmin3 hago:

CREATE EXTENSION hstore;

En mi consola, pongo la contraseña de mi usuario Postgresql (postgres en mi caso) en una variable de entorno:

C:osm2pgsqld>set pgpassword=contraseña

Hemos terminado la configuración de la base de datos. Ahora nos falta descargar el archivo default.style desde el proyecto Osm2pgsql en Github. Es este archivo que indica las conversiones que hay que hacer (tal objeto OSM se convierte en tal tabla en la base de datos, se crea tal atributo de tal tipo, etc...). Pongo este archivo en la misma carpeta que osm2pgsql.exe, es decir C:osm2pgsqld.

Y finalmente puedo usar osm2pgsql, asumiendo que mi base de datos Postgresql esta en la misma máquina (localhost) y usa el puerto 5432 y que mi archivo .osm.bz2 esta en la misma carpeta que osm2pgsql.exe:

C:osm2pgsqld>osm2pgsql.exe -c -d peru_osm -U postgres -H localhost -P 5432 --hstore -S default.style peru-latest.osm.bz2

Lo que me da la salida siguiente:

osm2pgsql SVN version af61cae663 (64bit id space)

release notes: 'Windows version built by Dominik Perpeet (http://www.customdebug.com/osm2pgsql/index.html)'
Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE:  la table planet_osm_point n'existe pas, poursuite du traitement
NOTICE:  la table planet_osm_point_tmp n'existe pas, poursuite du traitement
Setting up table: planet_osm_line
NOTICE:  la table planet_osm_line n'existe pas, poursuite du traitement
NOTICE:  la table planet_osm_line_tmp n'existe pas, poursuite du traitement
Setting up table: planet_osm_polygon
NOTICE:  la table planet_osm_polygon n'existe pas, poursuite du traitement
NOTICE:  la table planet_osm_polygon_tmp n'existe pas, poursuite du traitement
Setting up table: planet_osm_roads
NOTICE:  la table planet_osm_roads n'existe pas, poursuite du traitement
NOTICE:  la table planet_osm_roads_tmp n'existe pas, poursuite du traitement
Allocating memory for sparse node cache
Node-cache: cache=800MB, maxblocks=102401*zd, allocation method=8192
Mid: Ram, scale=100

Reading in file: champagne-ardenne-latest.osm.bz2
Processing: Node(4703k 130.7k/s) Way(623k 16.85k/s) Relation(9313 300.42/s)  parse time: 104s

Node stats: total(4703978), max(2549555700) in 36s
Way stats: total(623389), max(248043236) in 37s
Relation stats: total(9313), max(3336522) in 31s
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads

Writing way (623k)
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads

Writing relation (9310)
node cache: stored: 4703978(100.00%), storage efficiency: 50.00% (dense blocks:
0, sparse nodes: 4703978), hit rate: 100.00%
Sorting data and creating indexes for planet_osm_point
Analyzing planet_osm_point finished
Copying planet_osm_point to cluster by geometry finished
Creating indexes on  planet_osm_point finished
All indexes on  planet_osm_point created  in 2s
Completed planet_osm_point
Sorting data and creating indexes for planet_osm_line
Analyzing planet_osm_line finished
Copying planet_osm_line to cluster by geometry finished
Creating indexes on  planet_osm_line finished
All indexes on  planet_osm_line created  in 11s
Completed planet_osm_line
Sorting data and creating indexes for planet_osm_polygon
Analyzing planet_osm_polygon finished
Copying planet_osm_polygon to cluster by geometry finished
Creating indexes on  planet_osm_polygon finished
All indexes on  planet_osm_polygon created  in 27s
Completed planet_osm_polygon
Sorting data and creating indexes for planet_osm_roads
Analyzing planet_osm_roads finished
Copying planet_osm_roads to cluster by geometry finished
Creating indexes on  planet_osm_roads finished
All indexes on  planet_osm_roads created  in 5s
Completed planet_osm_roads

Osm2pgsql took 229s overall

Hecho! Tengo mis datos OSM importados en mi base de datos Postgresql. Estan almacenados en 4 tablas (planet_osm_line, planet_osm_point, planet_osm_polygon y planet_osm_roads) y puedo consultarlos facilmente desde QGIS.

[EDIT]: No lo habia visto pero podemos obtener los datos en latitud/longitud (EPSG:4326) en vez del EPSG:900913 (por defecto). Se debe usar el parametro -l (L miniscula).

Recursos útiles:
https://wiki.openstreetmap.org/wiki/Osm2pgsql
http://forum.openstreetmap.org/viewtopic.php?id=22931
https://github.com/openstreetmap/osm2pgsql



Twittear