DE:Datenexport mit OSMExport

From OpenStreetMap Wiki
Jump to: navigation, search

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