Marcos Dione: deriving-centerlines-from-riverbanks-without

For a long time now I've been thinking on a problem: OSM data sometimes contains riverbanks that have no centerline. This means that someone mapped (part of) the coasts of a river (or stream!), but didn't care about adding a line that would mark its centerline.

But this should be computationally solvable, right? Well, it's not that easy. See, for given any riverbank polygon in OSM's database, you have 4 types of segments: those representing the right and left riverbanks (two types) and the flow-in and flow-out segments, which link the banks upstream and downstream. With a little bit of luck there will be only one flow-in and one flow-out segment, but there are no guarantees here.

One method could try and identify these segments, then draw a line starting in the middle of the flow-in segment, calculating the middle by traversing both banks at the same time, and finally connect to the middle for the flow-out segment. Identifying the segments by itself is hard, but it is also possible that the result is not optimal, leading to a jagged line. I didn't try anything on those lines, but I could try some examples by hand...

Enter topology, the section of maths that deals with this kind of problems. The skeleton of a polygon is a group of lines that are equidistant to the borders of the polygon. One of the properties this set of lines provides is direction, which can be exploited to find the banks and try to apply the previous algorithm. But a skeleton has a lot of 'branches' that might confuse the algo. Going a little further, there's the medial axis, which in most cases can be considered a simplified skeleton, without most of the skeleton branches.

Enter free software :) CGAL is a library that can compute a lot of topological properties. PostGIS is clever enough to leverage those algorithms and present, among others, the functions ST_StraightSkeleton() and ST_ApproximateMedialAxis(). With these two and the original polygon I plan to derive the centerline. But first an image that will help explaining it:

The green 'rectangle' is the original riverbank polygon. The thin black line is the skeleton for it; the medium red line is the medial. Notice how the medial and the center of the skeleton coincide. Then we have the 4 branches forming a V shape with its vertex at each end of the medial and its other two ends coincide with the ends of the flow in and flow out segments!

So the algorithm is simple: start with the medial; from its ends, find the branches in the skeleton that form that V; using the other two ends of those Vs, calculate the point right between them, and extend the medial to those points. This only calculates a centerline. The next step would be to give it a direction. For that I will need to see if there are any nearby lines that could be part of the river (that's what the centerline is for, to possibly extend existing rivers/centerlines), and use its direction to give it to the new centerline.

For the moment the algorithm only solves this simple case. A slightly more complex case is not that trivial, as skeletons and medials are returned as a MultiLineString with a line for each segment, so I will have to rebuild them into LineStrings before processing.

I put all the code online, of course :) Besides a preloaded PostgreSQL+PostGIS database with OSM data, you'll need python3-sqlalchemy, geoalchemy, python3-fiona and python3-shapely. The first two allows me to fetch the data from the db. Ah! by the way, you will need a couple of views:

CREATE VIEW planet_osm_riverbank_skel   AS SELECT osm_id, way, ST_StraightSkeleton (way)      AS skel   FROM planet_osm_polygon WHERE waterway = 'riverbank';
CREATE VIEW planet_osm_riverbank_medial AS SELECT osm_id, way, ST_ApproximateMedialAxis (way) AS medial FROM planet_osm_polygon WHERE waterway = 'riverbank';

Shapely allows me to manipulate the polygonal data, and fiona is used to save the results to a shapefile. This is the first time I ever use all of them (except SQLAlchemy), and it's nice that it's so easy to do all this in Python.


openstreetmap gis python

Facundo Batista: Traveller cheques cheques cheques!


Hace catorce años, unos meses antes de viajar a Italia (como parte de mi Master en Ingeniería de la Innovación) fui a un banco en la city porteña y compré 1100 euros en American Express Traveler Checks.

¿Para qué? Bueno, era la primera vez que iba a Europa (la primera vez que salía del país, si no contamos las vacaciones en Fray Bentos, Uruguay), y tenía que llevar bastante dinero para vivir las primeras semanas, y los travelers checks tienen la característica (teoricamente) de que si los perdés o te los roban, American Express te los puede volver a dar, no importa donde estés.

En su momento, en Italia, cambié 800 euros, y como luego empecé a recibir el dinero de la Universidad (viáticos), me quedaron 300 sin cambiar. Volví a casa, guardé eso para un futuro donde los necesitara. Pero cuando volví a viajar a Europa ya tenía una tarjeta de crédito que funcionaba fuera de Argentina, así que no me llevé los cosos esos, sino que quedaron ahí.

Hace unos años decidí sacármelos de encima, pero no los quería cambiar en Argentina, porque no me iban a dar euros, así que esperé a volver a viajar a Europa. Y llegó Europython, y acá estoy en Bilbao, así que decidí irlos a cambiar al banco.

Catorce años después de comprarlos.

Así que almorcé rápido, me cargué la mochila, y caminé unas 10 cuadras hasta el centro de la ciudad. Fuí a un Banco Santander, hablé con una persona, puso cara de no saber qué eran los Traveler Checks, y me dijo que hablara con la cajera. Fui con la cajera y me dijo que ahí no los cambiaban, que vaya a la casa central (que quedaba ahí a la vuelta).

Caminé dos cuadras, entré, averigüé, me dijeron que hable con el Jefe de Cajas, el que me dijo que el Banco Santander ya no cambiaba "de eso".

En la esquina había un BBVA, así que entré y pregunté. Me dijo (con bastante seguridad) que Traveler Checks sólo cambiaban en la casa central (Gran Via 12, enfrente del Corte Inglés). Caminé unas 7 cuadras hasta ahí, entré, pregunté, me mandaron a las cajas.

La cajera puso cara de "queloqué?", le preguntó al de al lado, que llamó a uno de un escritorio, que dijo "sí, esto me parece que lo aceptamos". Se sentó en la computadora de la señora, y empezó a (por lo que veía y suponía yo) navegar ventanas que él nunca había visto en el sistema interno que usan.

En un momento me pidió el pasaporte, le sacó fotocopia, luego lo escaneó, luego firmé los traveler checks y les puse la fecha. En ese momento (unos diez minutos luego de haber empezado el trámite) yo pensé "listo, ya está, esto es la confirmación de que los aceptan, porque ya no puedo llevarlos a otro lado ni nada".

El tipo siguió cargando datos, hasta que en un momento le dió "servicio no disponible". Lo consultó con uno, con otro, volvió a intentarlo, lo mismo. Llamó a Soporte (que por lo visto puede entrar y ver la misma ventana que él estaba usando, al mismo tiempo que él la estaba usando), le contestó veinte preguntas, y volvió a hacer TODO de nuevo.

Cortó, esperó, lo llamaron, volvió a probar algo. Me enteré que la chica de soporte había llamado a Soporte nivel 2. Esperamos. Lo volvieron a llamar. Hizo otra cosa, le pasaron un valor hardcodeado, ahí pudo avanzar y tuvo un "código de autorización". Iupi!

Pero siguió una ventana más, y "servicio no disponible". Volvió a intentar todo, lo mismo. A esta altura el banco había cerrado hace 10 minutos, toda la gente se estaba yendo, los otros cajeros cerrando las cajas, etc.

Lo volvieron a llamar, era Soporte nivel 3. Volvieron a intentar cosas, nada. Vino otra chica (a esta altura quedábamos solamente cuatro en todo el banco). Volvió a probar algo, le dió error y un número de American Express. Llamó (acá me enteré mucho porque puso el móvil en speaker), le pidieron todos los datos (míos, de los cheques, etc), hasta que le dijeron que los cheques estaban autorizados (con el código que ya sabíamos), así que efectivamente era un problema del sistema del banco.

Esperamos diez minutos más, el flaco llamó a soporte de nuevo, le dijeron que estaba en Soporte nivel 4 (!!!), que lo iban a llamar.

Siguieron probando cosas, hasta que el flaco se cansó, agarró y me dió 300 euros (teoricamente yo tenía que pagar una comisión, pero nadie sabía cuanto), y me fui.

Dos horas y media después de entrar al banco :/

Joaquin Tita: Install compass in Mac Os El Capitan

So,
$ sudo gem install compass is not working?

Do you have ruby installed?
If not install it using brew:

$ sudo brew install ruby 

First try updating your gem version:

$ sudo gem update --system

Then try again installing compass:

$ sudo gem install compass

Oh... now you get a:

Fetching: compass-1.0.3.gem (100%)
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/compass

Run the following:

$ sudo gem install -n /usr/local/bin compass

Done.

Facundo Batista: Europython 2016, Bilbao


Aeropuertos

Estuve cinco horas en el aeropuerto de Río de Janeiro. La comida más elaborada que encontré en las dos terminales fueron sánguches de Subway y panchos. No, gracias.

El aeropuerto de Lisboa, por otro lado, era inmenso y tenía mil locales de comida. Eso sí, ni un cartel de "Bienvenido a Portugal" o similar, que busqué para mandarle foto a los peques...

El único aeropuerto con wifi libre era Aeroparque, en Argentina. El de Río y Lisboa tenían redes que podías usar si tenías contratos con empresas de ahí. En el de Bilbao también pude conseguir internet, luego de registrarme en una página que le fallaba el certificado SSL :/; pero bueno, me sirvió para avisarle a Moni que había llegado bien.


Bilbao

Luego de llegar a donde me hospedé, me pegué un baño y salí a pegar una vuelta (eran las siete y media de la tarde, así que tenía todavía más de dos horas de luz). Algo que me llamó la atención es que la gente, en los barcitos, agarran su cerveza o vino y salen a tomarlo a la calle (el clima estaba hermoso), así que veías un montón de gente super empilchada, con sus copas de tinto o blanco, sentados en los muchos banquitos que hay por todos lados...

Yo me metí un un bar que pintaba lindo, me tomé un par de cervezas con un par de pinchos, y luego arranqué la vuelta. No me fui a dormir demasiado tarde (antes de las doce y media), y habiendo dormido un poco en los dos vuelos cortos, y casi cinco horas en el vuelo largo, no esperaba dormir tanto: me levanté a la una y pico de la tarde!! Parece que el truco de no poner despertador, un oscuro casi absoluto, y no estar pendiente de niños, le aportaron mucho a lo cansadísimo que había llegado al fin de semana...

Parte del Guggenheim a la izquierda, el Puppy a la derecha

Así que me levanté, desayuné y salí a pasear. Me tomé el metro y me fuí para el casco viejo, hice un par de recorridos, saqué un par de fotos, y un par de horas después encaré para uno de los edificios de la conferencia donde se hacía el Django Girls, a saludar conocidos.

Al rato me fui para el edificio principal de la conferencia, donde desde media tarde ya uno se podía registrar, así hacía el trámite el domingo, y de paso encontraba bien el edificio, sabía por donde entrar, etc.

Ahí me encontré con gente que no conocía personalmente pero sí de redes sociales virtuales, estuvimos charlando un rato y después con Juan Luis Cano, Yamila Moreno y otra gente fuimos caminando hasta un funicular, con el que subimos una montaña para mirar la ciudad de arriba.

Desde lo alto

Después nos fuimos a cenar con otra gente a un restaurant bastante piola, comimos rico. Y ya se hicieron las doce, así que volví a donde me hospedé, revisé un rato la charla del lunes, y a dormir!


Primer día de conferencia

Es el día que más charlas tenía marcada. Hubo una plenaria apenas interesante sobre la base de "podés ganar plata haciendo lo que quieras, no tengas miedo de probar", y luego me fuí a una charla de Efficient Django, de la cual me anoté algunos puntos a investigar. Después fui a una charla que mostraba como realmente funciona mezclar AsyncIO y Cython, logrando código asincrónico rapidísimo, y después me tocó a mí.

Yo dí It's not magic: descriptors exposed, la que preparamos con Joac y dimos en la PyCon de Mendoza, pero en inglés. Es una charla difícil, pero creo que la gente se va con info nueva. Hubieron varias preguntas, y luego se me acercaron en los pasillos para seguir charlando del tema, y también me saludaron un par de veces para decirme que la charla les había gustado, así que estoy contento con como salió.

A la tarde estuvo más tranquilo. Una charla que me gustó bastante fue la The Report of Twisted's Death, dada por Amber Brown, una Twisted core developer (y también release manager) que contó en qué estaban, los planes con respecto a asyncio, qué pasaba con Tornado, etc.

An open space in the conference

También me enganché con unos acertijos que te daban en una empresa, algo estilo el pythonchallenge, donde resolver un problema te da la info para encontrar el próximo, y así. La realidad es que era medio buggy, en el segundo acertijo al flaco le marqué dos bugs, y en el último caso le dije que no se podía resolver, y lo hostigué hasta que me pasó la solución y le mostré como no había forma de llegar, :). Así que me gané el premio (una boludez, un hub usb), más que nada por mostrarles a ellos dónde tenían el problema :p.

Como frutilla del postre de la tarde, nos regalaron a todos los asistentes una micro:bit!!! Si no la conocen, una micro:bit es una pequeñísimo hardware que corre Python, que la BBC le regaló a todos los estudiantes de 7 años en el Reino Unido para que jueguen y aprendan. Ahora tengo que ver qué cosas se puede hacer para ponernos con Felipe :D (aunque creo que es un poco más para el año que viene...).

Luego vinieron las lightning talks, y ya se terminó el día!

Manuel Kaufmann (Humitos): PyCon España: ¡allá vamos!

¡De no creer! Los sueños se cumplen, los milagros existen, la gente te quiere más de lo que creés, "lo creés, lo obtenés", vos confiá...

A fines de Septiembre me voy a España. Sí, a España. Y encima voy a ser Keynote Speaker de la PyCon 2016 en Almería. Obviamente que todavía no lo puedo creer y que ya empecé a pensar/preparar la charla porque estoy muy nervioso.

Este año se cumplieron 10 años desde que conocí Python en el PyDay Santa Fe 2006 que organizaron mis compañeros de la Universidad de esa época (entre ellos Juanjo Conti y Mariano Galán -dos personas con las que hoy trabajo todos los días) y donde hubo charlas de Facundo Batista y Lucio Torre. Mis pastores desde ese día.

Durante los días siguientes a ese evento pensaba: "quiero ser como estos tipos" y obviamente, nunca llegué y ni llegaré a ser como ellos; pero sí logré ser como soy yo.

Hace casi 3 años soñé un proyecto de enseñanza, educación, descentralización del conocimiento, difusión, amistad de programadores (ni idea lo que soñaba, estaba delirando)... Un proyecto tirado de los pelos, en el que nadie creía cuando decía "voy a hacer..." pero que cuando empecé y pasaba semanas durmiendo dentro del auto, la gente decía "lo está haciendo, este tipo esta loco, pero qué groso" y comenzó a apoyarme emocionalmente, con dinero, con un espacio en su hogar, con comida y con un sin fin de etcéteras. Conocí una infinidad de gente. Muchísima gente demasiado buena y confiada. Aprendí a creer en la gente desconocida nuevamente, a entregarle todo sin un comprobante. También conocí gente mala, dañina, con malas intenciones que casi me arruina todo. Organizamos decenas de eventos por año y le mostramos "la magia de la programación" a gente que nunca lo imaginó. Estuve muy enfermo, tuve accidentes de tránsito y casi pierdo la vida en más de una oportunidad en la ruta. "No siempre la culpa es del otro", he cometido infracciones de forma inconsciente y por ser un pelotudo también.

3 años... de esto y mucho más voy a hablar en esta Keynote de PyCon España 2016 en Almería. A la cual, por cierto, estoy super cagado de ir.

¡Gracias a los organizadores por confiar en mí!

Manuel Kaufmann (Humitos): PyCon España: ¡allá vamos!

¡De no creer! Los sueños se cumplen, los milagros existen, la gente te quiere más de lo que creés, "lo creés, lo obtenés", vos confiá...

A fines de Septiembre me voy a España. Sí, a España. Y encima voy a ser Keynote Speaker de la PyCon 2016 en Almería. Obviamente que todavía no lo puedo creer y que ya empecé a pensar/preparar la charla porque estoy muy nervioso.

Este año se cumplieron 10 años desde que conocí Python en el PyDay Santa Fe 2006 que organizaron mis compañeros de la Universidad de esa época (entre ellos Juanjo Conti y Mariano Galán -dos personas con las que hoy trabajo todos los días) y donde hubo charlas de Facundo Batista y Lucio Torre. Mis pastores desde ese día.

Durante los días siguientes a ese evento pensaba: "quiero ser como estos tipos" y obviamente, nunca llegué y ni llegaré a ser como ellos; pero sí logré ser como soy yo.

Hace casi 3 años soñé un proyecto de enseñanza, educación, descentralización del conocimiento, difusión, amistad de programadores (ni idea lo que soñaba, estaba delirando)... Un proyecto tirado de los pelos, en el que nadie creía cuando decía "voy a hacer..." pero que cuando empecé y pasaba semanas durmiendo dentro del auto, la gente decía "lo está haciendo, este tipo esta loco, pero qué groso" y comenzó a apoyarme emocionalmente, con dinero, con un espacio en su hogar, con comida y con un sin fin de etcéteras. Conocí una infinidad de gente. Muchísima gente demasiado buena y confiada. Aprendí a creer en la gente desconocida nuevamente, a entregarle todo sin un comprobante. También conocí gente mala, dañina, con malas intenciones que casi me arruina todo. Organizamos decenas de eventos por año y le mostramos "la magia de la programación" a gente que nunca lo imaginó. Estuve muy enfermo, tuve accidentes de tránsito y casi pierdo la vida en más de una oportunidad en la ruta. "No siempre la culpa es del otro", he cometido infracciones de forma inconsciente y por ser un pelotudo también.

3 años... de esto y mucho más voy a hablar en esta Keynote de PyCon España 2016 en Almería. A la cual, por cierto, estoy super cagado de ir.

¡Gracias a los organizadores por confiar en mí!

Manuel Kaufmann (Humitos): Herramientas de estilo en Python

Hoy se cumplen oficialmente tres meses que hace que trabajo en Mozio. El principio fue complicado porque me tuve que adaptar luego de más de un año de no programar profesionalmente a tiempo completo. Entre todas las actividades de adaptación, la lectura, el estudio a día completo, volver a hablar/chatear en inglés y un sin fin de cosas más; tuve que configurar mi editor de texto: Emacs.

Una de las cosas que me gustó de Mozio es que tienen una wiki con toda la guía de estilo de código de cada lenguaje en el que se programa. Entonces, obviamente, había una para Python. Luego de leerla y comenzar a seguirla (obviamente sigue PEP8, pero también tiene algunas particularidades) me di cuenta que "yo no me tengo que preocupar por eso, yo tengo que codear y lindo". Pero claro, "lindo" es relativo, está muy ligado a los gustos personales y para eso se creó la wiki: para ponerse de acuerdo.

Entonces, había decisiones sobre diferentes cosas de PEP8 y PEP257 en las que los developer de Mozio tomaron una decisión. Ahí es donde se empieza a complicar la cosa ya que necesitás recordar cuáles fueron esas decisiones que incluso pueden ir en contra de tus gustos.

Me puse a investigar cómo seguir todas estas reglas y llegué a una convinación de:

  • isort: ordena los imports
  • autopep8: fuerza al código a cumplir con PEP8
  • docformatter: aplica las reglas de PEP257 sobre los docstrings
  • unify: coherencia entre comillas dobles y simples

¿Qué hice? Como estaba configurando violentamente mi Emacs, busqué un plugin para cada uno de ellos y para el que no estaba, docformatter, me lo creé yo mismo copiando en 99% el código de autopep8.

Ahora, cada vez que guardo un archivo en Emacs se me corren todos estos pequeños programas por detrás y se me formatea todo automáticamente para cumplir con las reglas específicas de Mozio.

Por otro lado, la convención que se tomó para los docstring (en uno de los casos) por los desarrolladores no es la que la PEP257 recomienda y por lo tanto docformatter no cubría ese caso. ¿Qué hice? Lo implementé en este Pull Request y el autor, que por cierto trabaja en la NASA, lo mergió a los pocos minutos.

Nota

En la configuración de mi Emacs encontrás los archivos de configuración y parámetros que le paso a cada comando para realizar lo que yo necesito de forma adecuada.

Manuel Kaufmann (Humitos): Herramientas de estilo en Python

Hoy se cumplen oficialmente tres meses que hace que trabajo en Mozio. El principio fue complicado porque me tuve que adaptar luego de más de un año de no programar profesionalmente a tiempo completo. Entre todas las actividades de adaptación, la lectura, el estudio a día completo, volver a hablar/chatear en inglés y un sin fin de cosas más; tuve que configurar mi editor de texto: Emacs.

Una de las cosas que me gustó de Mozio es que tienen una wiki con toda la guía de estilo de código de cada lenguaje en el que se programa. Entonces, obviamente, había una para Python. Luego de leerla y comenzar a seguirla (obviamente sigue PEP8, pero también tiene algunas particularidades) me di cuenta que "yo no me tengo que preocupar por eso, yo tengo que codear y lindo". Pero claro, "lindo" es relativo, está muy ligado a los gustos personales y para eso se creó la wiki: para ponerse de acuerdo.

Entonces, había decisiones sobre diferentes cosas de PEP8 y PEP257 en las que los developer de Mozio tomaron una decisión. Ahí es donde se empieza a complicar la cosa ya que necesitás recordar cuáles fueron esas decisiones que incluso pueden ir en contra de tus gustos.

Me puse a investigar cómo seguir todas estas reglas y llegué a una convinación de:

  • isort: ordena los imports
  • autopep8: fuerza al código a cumplir con PEP8
  • docformatter: aplica las reglas de PEP257 sobre los docstrings
  • unify: coherencia entre comillas dobles y simples

¿Qué hice? Como estaba configurando violentamente mi Emacs, busqué un plugin para cada uno de ellos y para el que no estaba, docformatter, me lo creé yo mismo copiando en 99% el código de autopep8.

Ahora, cada vez que guardo un archivo en Emacs se me corren todos estos pequeños programas por detrás y se me formatea todo automáticamente para cumplir con las reglas específicas de Mozio.

Por otro lado, la convención que se tomó para los docstring (en uno de los casos) por los desarrolladores no es la que la PEP257 recomienda y por lo tanto docformatter no cubría ese caso. ¿Qué hice? Lo implementé en este Pull Request y el autor, que por cierto trabaja en la NASA, lo mergió a los pocos minutos.

Nota

En la configuración de mi Emacs encontrás los archivos de configuración y parámetros que le paso a cada comando para realizar lo que yo necesito de forma adecuada.

Facundo Batista: Europython, otra vez


La semana que viene se hace la mayor conferencia de Python de Europa, la Europython. Esta vez es en Bilbao.

Es larga. El domingo hay un día de tutoriales y cursos para principiantes. La conferencia en sí es de lunes a viernes. Y sábado y domingo de la otra semana hay sprints. Pueden ver el schedule online.

alt

Lo que más me entusiasma de esta edición de la conferencia es que voy a ir, :). No es la primera vez que voy, sin embargo; vuelvo luego de once (sí, 11) años de ausencia!!

No sé si me sorprende más eso o que mi blog ya es tan viejo que tengo registro de eso que pasó hace tanto: en estos cuatro posts.

Ahora que lo pienso, hace *años* que tampoco voy a una PyCon US (la default, digamos)...

La frutilla del postre es que esta vez voy a presentar dos charlas, en dos idiomas. En castellano va mi repetidísima "Entendiendo Unicode" (el público se renueva, me dicen algunos; dejá de robar, me dicen otros). Y en inglés la versión anglosajona de la charla que preparamos con joac para la PyCon pasada: "No es magia: Descriptores al desnudo".

Ya les iré reportando como va todo :)

Marcos Dione: importing-single-osm-changesets-to-a-non-updatable-rendering-database

A few weeks ago an interesting PR for osm-carto landed in the project's GitHub page. It adds rendering for several natural relief features, adding ridges, valleys, aretes, dales, coulouirs and others to cliffs, peaks and mountain passes, which were already being rendered. I decided to try it in Elevation (offline for the moment).

I sync'ed the style first with the latest release, applied the patch and... not much. My current database is quite old (re-importing takes ages and I don't have space for updates), so I don't have much features like that in the region I'm interested in. In fact, I went checking and the closest mountain range around here was not in the database, so I added it.

By the way, the range is mostly concurrent with a part of an administrative boundary, but SomeoneElse and SK53 suggested to make a new line. Even when other features are nearby (there's a path close to the crest and it's also more or less the limit between a forest and a bare rock section), which already makes the region a little bit crowded with lines, it makes sense: boundaries, paths, forest borders and ridges change at different time scales, so having them as separate lines makes an update to any of those independent of the rest.

Now I wanted to export this feature and import it in my rendering database, so I can actually see the new part of the style. This is not an straightforward process, only because when I imported my data I used osm2pgsql --drop, which removes the much needed intermediate tables for when one wants to update with osm2pgsql --append. Here's a roundabout way to go.

First you download the full feature (thanks RichardF!). In this case:

http://www.openstreetmap.org/api/0.6/way/430573542/full

This not only exports the line (which is a sequence of references to nodes) with its tags, but the nodes too (which are the ones storing the coords). The next step is to convert it to something more malleable, for instance, GeoJSON. For that I used ogr2ogr like this:

ogr2ogr -f GeoJSON 430573542.GeoJSON 430573542.xml lines

The last parameter is needed because, quoting Even Rouault (a.k.a. José GDAL): «you will always get "points", "lines", "multilinestrings", "multipolygons" and "other_relations" layers when reading a osm file, even if some are empty», and the GeoJSON driver refuses to create layers for you:

ERROR 1: Layer lines not found, and <span class="createlink">CreateLayer</span> not supported by driver.

But guess what, that not the easiest way :) At least we learned something. In fact postgis already has a tool called shp2pgsql that imports ESRIShapeFiles, and ogr2ogr produces by default this kind of file. It creates a .shp file for each layer as discussed before, but again, we're only interested in the line one. So:

ogr2ogr 430573542 430573542.xml lines
shp2pgsql -a -s 900913 -S 430573542/lines.shp > 430573542.sql

We can't use this SQL file directly, as it has a couple of problems. First, you can't tell shp2pgsql the names of the table where you want to insert the data or the geometry column. Second, it only recognizes some attributes (see below), and the rest it tries to add them as hstore tags. So we have to manually edit the file to go from:

INSERT INTO "lines" ("osm_id","name","highway","waterway","aerialway","barrier","man_made","z_order","other_tags",geom)
    VALUES ('430573542','Montagne Sainte-Victoire',NULL,NULL,NULL,NULL,NULL,'0','"natural"=>"ridge"','010500002031BF0D[...]');

into:

INSERT INTO "planet_osm_line" ("osm_id","name","z_order","natural",way)
    VALUES ('430573542','Montagne Sainte-Victoire','0','ridge','010500002031BF0D[...]');

See? s/lines/planet_osm_line/, s/other_tags/"natural"/ (with double quotes, because natural is a keyword in SQL, as in natural join), s/geom/way/ and s/'"natural"=>"ridge"'/'ridge'/ (in single quotes, so it's a string; double quotes are for columns). And I also removed the superfluous values and the ANALIZE line, as I don't care that much. Easy peasy.

A comment on the options for shp2pgsql. -s 900913 declares the SRID of the database. I got that when I tried without and:

ERROR:  Geometry SRID (0) does not match column SRID (900913)

-S is needed because shp2pgsql by default generated MultiLineStrings, but that table in particular has a LineString way column. This is how I figure it out:

ERROR:  Geometry type (MultiLineString) does not match column type (LineString)

Incredibly, after this data massacre, it loads in the db:

$ psql gis < 430573542.sql
SET
SET
BEGIN
INSERT 0 1
COMMIT

Enjoy!


openstreetmap gdal postgis