DE:Datenexport mit OSMExport
- Inhalt
- Diese Seite beschreibt die Nutzung der Ruby-Bibliothek Osmexport zum Erzeugen von Shapefile aus OSM-Daten.
- Gründe für die Überlebtheit
- Die Bibliothek wird seit ca. 2009 nicht mehr weiterentwickelt. Das Wachstum des Datenbestands seit dieser Zeit stellt die Sinnhaftigkeit der Nutzung einer Skriptsprache in Frage. Zudem ist unklar, ob die Bibliothek überhaupt das Dateiformat nach der Umstellung auf die OSM-API-Version 0.9 (April 2009) unterstützt.
- Archivierungszeitpunkt
- 2009
Osmexport ist eine Ruby-Bibliothek und ein Programm zum Exportieren von OSM-Daten in verschiedene andere Formate. Das Tool liest eine OSM-XML-Datei und eine Datei mit Regeln, konvertiert die Daten nach den angegebenen Regeln und schreibt sie in eine oder mehrere Ausgabedateien. Die Regeln sind deshalb nötig, weil die verschiedenen Datenformate sehr verschiedene Strukturen haben und eine direkte Abbildung zwischen den Formaten nicht möglich ist. Sie müssen also für die jeweilige Anwendung entscheiden, welche Daten Sie brauchen und die Regeln entsprechend anpassen.
Installation
Osmexport installieren Sie am einfachsten mit dem Tool Rubygems (weitere Infos unter http://wiki.openstreetmap.org/wiki/Shape_file_export_mit_osmlib):
gem install osmlib-export
Danach haben Sie das Programm osmexport
im Pfad. (Unter Debian wird die Datei nach /var/lib/gems/RUBY-VERSION/bin
installiert; dieses Verzeichnis müssen Sie entweder in Ihren Pfad aufnehmen oder einen Symlink einrichten, zum Beispiel von /usr/local/bin/osmexport
.)
Der Aufruf von Osmexport sieht wie folgt aus:
osmexport regel.oxr data.osm Ausgabedatei
Hier wird die Regel-Datei regel.oxr
gelesen, die OSM-Daten kommen aus der Datei data.osm und die Ausgabe geht in die Ausgabedatei. In welches Format konvertiert wird, ergibt sich aus der Regel-Datei. Ist das Ausgabeformat Shapefile oder CSV, wird keine Ausgabedatei, sondern stattdessen ein Verzeichnis angegeben, in dem dann die verschiedenen Ausgabedateien angelegt werden.
Die Regeldatei
Für jeden Export wird eine Regeldatei benötigt, die festlegt, in welches Format exportiert werden soll und wie genau das zu geschehen hat. Regeldateien enthalten Ruby-Code, sind aber so einfach gehalten, dass man sie auch ohne Ruby-Kenntnisse schreiben kann. Der Profi kann trotzdem auf alle Fähigkeiten von Ruby zurückgreifen, wenn das nötig sein sollte.
Eine Regeldatei besteht immer aus mehreren Teilen. Im Setup-Teil werden globale Einstellungen vorgenommen und insbesondere auch festgelegt, welche Ausgabedateien es geben soll und welche Attribute in diesen vorkommen. Danach gibt es für Nodes, Ways und Relations jeweils einen Teil. Diese Bereiche werden für jeden Node beziehungsweise jeden Way und jede Relation abgearbeitet; hier wird genauer festgelegt, welche Daten wie zu konvertieren sind.
Grob sieht die Regeldatei so aus:
setup :AUSGABEFORMAT do .... end nodes do .... end ways do .... end relations do .... end
Das Ausgabeformat wird durch einen Doppelpunkt eingeführt: :KML, :Shp, :CSV und so weiter. Die Teile nodes, ways und relations sind jeweils optional; wenn man nur an Nodes interessiert ist, kann man die anderen Teile weglassen. Welche Angaben in den verschiedenen Teilen möglich sind, hängt vom Ausgabeformat ab. Beispiele dazu finden Sie weiter unten und im examples-Verzeichnis der Osmexport-Distribution.
Konvertierung in Shapefiles
Shapefile ist ein im GIS-Bereich sehr weit verbreitetes Datenformat zur Speicherung von geographischen Daten (Punkten, Linien oder Flächen) mit zugehörigen Attributen. Auch wenn das ganze sich Shapefile nennt, handelt es sich doch immer um mehrere Dateien, die sich in ihrer Endung unterscheiden, aber zusammen genutzt werden:
datei.shp
- Die Datei mit der Endung .shp enthält die eigentlichen Geometriedaten, also die Punkte, Linien oder Flächen mit ihren Koordinaten.1 Eine .shp-Datei kann dabei jeweils nur Daten genau eines dieser Datentypen enthalten.
datei.shx
- Die Datei mit der Endung .shx enthält den Index, der angibt, wo im .shp-File der Eintrag zu einer bestimmten ID zu finden ist.
datei.dbf
- Die Datei mit der Endung .dbf enthält die Attribute zu den Geometriedaten im dBASE-Format. Attribute können verschiedene Typen haben, zum Beispiel Strings (dBASE-Format „C“), Zahlen („N“) und Boolesche Werte („L“).
datei.prj
- Manchmal ist auch eine Datei mit der Endung .prj vorhanden, die Informationen zur Projektion der Geometriedaten enthält.
Darüber hinaus kann es noch weitere Dateien mit anderen Endungen geben, die aber seltener vorkommen und daher hier nicht dokumentiert sind. Weitere Informationen über Shapefiles gibt es unter http://en.wikipedia.org/wiki/Shapefile.
Shapefiles haben immer nur einen Layer. Will man zum Beispiel sowohl Straßen als auch Bahnstrecken in seinen Daten haben, muss man entweder die Unterscheidung in den Attributen unterbringen oder mehrere Shapefiles benutzen. Um dies zu erleichtern, kann Osmexport in einem Durchgang mehrere Shapefiles schreiben.
Nehmen wir als Beispiel an, dass Sie eine Shape-Datei erzeugen wollen, die alle Hotels mit ihren Namen enthält. Definieren Sie dazu ein Ausgabeziel mit dem symbolischen Namen :hotels. Unter diesem Namen wird das Ziel später in den Regeln referenziert. Das Ziel ist eine Shape-Datei mit dem Namen OSM-Hotels (und .shp, .shx und .dbf als Suffix). Die Datei wird Punkte enthalten (point) die jeweils ein bis zu 100 Zeichen langes name-Attribut haben.
setup :Shp do point :hotels do name 'OSM-Hotels' string :name, 100 end end
Bei jedem Node muss dann geprüft werden, ob das Tag tourism=hotel gesetzt ist. In diesem Fall soll der :hotels-Datei ein Eintrag mit dem passenden name-Attribut hinzugefügt werden:
nodes do if tourism == 'hotel' :hotels << { :name => name } end end
Dies ist nur ein sehr einfaches Beispiel; natürlich sind auch wesentlich komplexere Regeln möglich.
Konvertierung nach KML
KML (Keyhole Markup Language) ist ein XML-Format für Geodaten, das zuerst von Google Earth verwendet wurde, aber inzwischen auch in vielen anderen Produkten benutzt wird.
Anders als bei Shapefiles erzeugt Osmexport immer nur eine KML-Datei, die aber mehrere „Verzeichnisse“ (Folder) enthalten kann. Im Setup-Teil müssen diese Folder definiert werden. Jedem Folder sind Stile wie Linienbreite oder -farbe oder ein Icon zugeordnet. Jedes Geodaten-Element wird dann in einen Folder eingeordnet und übernimmt dessen Stilelemente. Hier definieren wir einen Folder :roads, der graue Linien der Breite 4 aufnehmen wird:
setup :KML do name 'OpenStreetMap' folder :roads do style do line( :color => '#f0f0f0f0', :width => 4 ) end end end
Für jeden Way mit einem highway-Tag fügen wir dann einen Eintrag in den :roads-Folder ein:
ways do if highway :roads << { :id => id, :name => name } end end
Konvertierung nach CSV
Will man ein einfaches Format, das in einem Texteditor oder einer Tabellenkalkulation weiterverarbeitet werden kann, bietet sich CSV (Comma Separated Values) an. Jeder Datensatz nimmt eine Zeile ein, die einzelnen Felder im Datensatz werden durch Kommata oder andere Trennzeichen voneinander abgegrenzt. Für komplexere Anwendungen ist es nicht mächtig genug, aber für kleinere Dinge durchaus praktisch.
Wollen wir beispielsweise eine Datei mit allen Points of Interest, die ein amenity-Tag verwenden (Schulen, Briefkästen, Telefonzellen und so weiter, siehe Seite ) im Format
Längengrad,Breitengrad,Typ
erzeugen, dann geht das mit der folgenden einfachen Regel-Datei:
setup :CSV do file :pois do fields :lon, :lat, :type end end nodes do if amenity :pois << { :lon => lon, :lat => lat, :type => amenity } end end