2011-09-16 8 views
12

Quiero escribir una secuencia de comandos que analiza archivos XML de OpenStreetMap (OSM) y crea una base de datos de pueblos y ciudades de forma jerárquica. Quiero que el conjunto de datos resultante tenga una jerarquía que podría tener este aspecto en los EE.UU.:¿Cómo puedo extraer datos jerárquicos de ciudad/estado/país de archivos planetarios OSM XML?

USA -> California -> San Francisco County -> San Francisco 

y tal como esto en el Reino Unido:

United Kingdom -> England -> Middlesex -> London -> Soho 

La salida será un documento JSON que describe una jerarquía para todas las ciudades en el archivo OSM, con una estructura como la de los ejemplos anteriores.

Estoy usando Python y la biblioteca del analizador "imposm" y puedo cargar y analizar el archivo sin ningún problema; mi problema es la falta de comprensión de cómo se estructuran los datos de OSM: no sé cómo conocer la relación padre/hijo entre los nodos en los datos de OSM. Por ejemplo, si localizo el nodo para "Soho", ¿cómo puedo vincularlo a los nodos de "City of Westminster", "Greater London", "Middlesex" e "England"?

sé que algunos nodos tienen una etiqueta de "is_in" que podría dar algo de esta información, pero

  • A) esto es inconsistente y
  • B) parece ser un texto de forma libre campo, no un enlace a un nodo OSM (es decir, is_in: "City of Westminster" no me da ningún enlace al nodo de Westminster).

Háganme saber si tiene alguna sugerencia sobre cómo vincular estos nodos jerárquicamente.

Respuesta

14

Básicamente todo es "forma libre" en OSM. Existen convenciones sobre etiquetado, pero no hay garantía de que las personas se apeguen a ellas. Por lo tanto, deberá realizar una limpieza y un posprocesamiento de los datos para que todo sea coherente.

En cuanto a las relaciones entre padres e hijos, existen relaciones sin cableados en OSM distintos:

  • Un nodo es utilizado por una o más formas
  • Un nodo es un miembro de uno o más relaciones
  • una manera es un miembro de una o más relaciones
  • una relación es un miembro de una o más relaciones

OSM las relaciones se pueden usar para definir relaciones jerárquicas, pero la forma en que se definen es muy genérica. La semántica se basa en las convenciones (generalmente descritas en las páginas Wiki de OSM).

Si está buscando una relación "is_in", creo que tendrá que establecerlo mediante métodos geométricos. Realmente no se puede confiar solo en el etiquetado de OSM para esto, desafortunadamente.

+0

gracias por su respuesta, Igor. esa es información útil, y parece que no puedo confiar lo suficiente en la estructura de los datos de OSM para obtener los datos que necesito. Creo que es mejor que obtenga mis datos de algún lugar como geonames.org. – luke

+0

¿no puede buscar todos los nodos que tienen límites alrededor del punto de interés? p.ej. si tiene una calle, ¿debería encontrar un nodo como la ciudad, provincia, distrito y país porque sus límites rodean la posición de latitud y longitud de la calle? – Tom

Cuestiones relacionadas