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) |
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