OSM-Daten filtern und exportieren

manchmal hätte man gerne bestimmte Details der OSM-Daten als Auszug zur Reiseplanung oder für ein Navigationsgerät, diese Anleitung soll dabei weiterhelfen.

Vorbereitungen

Ich gehe einfach mal davon aus das man die Daten öfters benötigt weshalb ich das so aufbaue das man es automatisiert ablaufen lassen kann. Aber bevor es richtig los geht benötigen wir dazu noch ein paar kleine Hilfsprogramme die ich in dem Verzeichnis 'C:\Beispiel\' speichere:

  1. osmconvert um PBF-Dateien zu konvertieren.
  2. osmfilter um die konvertierten Daten nach unseren Wünschen zu filtern.
  3. und dann noch Wget zum automatisierten downloaden der OSM-Daten. Den Download zur Windows-Version findet man unter https://eternallybored.org/misc/wget/, eine Anleitung findet man unter https://wiki.ubuntuusers.de/wget/
  4. als letztes benötigen wir noch eine PBF mit den OSM-Daten, diese können bei geofabrik.de heruntergeladen werden. Für das Beispiel werden wir nachher automatisiert eine PBF herunterladen.

Alle Programme gibt es für Windows und Linux und müssen unter Windows nicht installiert werden

Erstellen der Batchdatei

Eine Batchdatei ist nichts weiter als eine Stapelverarbeitungsdatei im Textformat, kann also mit jeden Texteditor erstellt und bearbeitet werden. Ich nutze den Notepad++ und seit kurzem noch den atom.

Als erstes legen wir im Texteditor eine neue Datei an und speichern diese, ich gebe ihr den Namen "Ausschneiden.cmd".

Es ist darauf zu achten das die Datei auch wirklich die Dateiendung 'cmd' erhält und nicht 'txt'.

Download der PBF

Für das herunterladen ist das Programm Wget.exe zuständig.
Dazu muss ein Befehl nach folgenden Muster in die Batchdatei eingetragen werden:

C:\Beispiel\wget.exe -N "URL" -P "Speicherort"
  • Die Option -N sorgt dafür das die Datei nur heruntergeladen wird wenn die Datei auf dem Server neuer ist, als eine bereits im Speicherordner vorhandene.
  • Als URL tragen wir den Link der Datei ein, die wir herunterladen wollen und zwar in Anführungszeichen.
  • Der Option -P folgt der lokale Pfad zu dem Ordner in dem die Datei gespeichert werden soll.

Ich nehme für das Beispiel die Datei für Andorra da sie unter 2MB groß ist und so die einzelnen Schritte sehr schnell abgearbeitet werden.
Für die aktuellste Version der Datei, muss die Zeile im Beispiel also so aussehen:

C:\Beispiel\wget.exe -N "http://download.geofabrik.de/europe/andorra-latest.osm.pbf" -P "C:\Beispiel\"

Konvertieren der PBF

Leider kann das Programm 'osmfilter' mit .pbf Dateien nicht umgehen weshalb wir die PBF konvertieren müssen.
'osmfilter' kann das .osm-Format und das .o5m-Format verarbeiten, aus Platzgründen sowie Geschwindigkeitsgründen nehmen wir das Format .o5m.

Die .o5m wird etwa doppelt so groß wie die .pbf!

Der Befahl zum konvertieren lautet:

C:\Beispiel\osmconvert64 C:\Beispiel\andorra-latest.osm.pbf --out-o5m > C:\Beispiel\andorra-latest.osm.o5m
  • Die Option --out-o5m sorgt für einen Export im Format .o5m

Wenn man möchte kann man sich das Datendatum der PBF in eine Textdatei schreiben lassen um auch später nachschauen zu können wie alt die Daten sind.
Die Befehlzeile dafür lautet:

C:\Beispiel\osmconvert64 C:\Beispiel\andorra-latest.osm.pbf --out-timestamp > C:\Beispiel\andorra-latest.timestamp.txt

Filtern der Daten

Jetzt kann es ans filtern der Daten gehen.
Um zu wissen was man filtern möchte, muss man sich mit den Keys und Tags der OpenStreetMap auseinander setzten. Die OSM-Daten bestehen aus Punkten, Wege und Relationen (Ein Verbund mehrerer Wege) und haben alle einen Key (Schlüssel) und einen Tag (Wert) nach denen sie gefiltert werden können.
Im Beispiel werden wir jetzt alle Campingplätze filtern.
Campingplätze haben den Key 'tourism' und den Wert 'camp_site'.
Der Befehl muss dann lauten:

C:\Beispiel\osmfilter C:\Beispiel\andorra-latest.osm.o5m --keep="tourism=camp_site" > C:\Beispiel\Camping.osm
  • Die Option --keep= legt fest was gefiltert wird.

Wenn wir jetzt nicht nur Campingplätze sondern auch noch Wohnmobilstellplätze erhalten wollen müssen wir einen weiteren Tag dazu nehmen: A Wenn wir das Ergebnis weiter verfeinern wollen können wir bestimmte Keys ausschließen, als Beispiel wollen wir keine keine Campingplätze auf denen Hunde verboten sind.
Dazu fügen wir die Option --drop= zu dem Befehl hinzu:

C:\Beispiel\osmfilter C:\Beispiel\andorra-latest.osm.o5m --keep="tourism=camp_site tourism=caravan_site" --drop="dog=no" > C:\Beispiel\Camping.osm

Da die Befehlszeile bei komplexen Filtern schnell sehr lang und unübersichtlich wird, werden wir die Optionen und Keys in einer separaten Textdatei speichern und diese als Option der Befehlszeile mitgeben. Dazu legen wir wieder eine leere Textdatei an und speichern diese unter den Namen "Parameter_POI_Camping.txt".
In diese Textdatei kommt in die erste Zeile ie Option -v, die sorgt dafür das alle Eingabe-Parameter bei der Ausführung angezeigt werden.
Nach einer Leerzeile kommt dann die Option --keep=, in den Zeilen darunter kommen jetzt alle Keys nach denen gefiltert werden soll, je Zeile eine Kombination.
Nach einer weiteren Leerzeile kommt dann (falls benötigt) die Option --drop=. Die Keys kommen wieder in den folgenden Zeilen. Zum Schluß nopchmal eine Leerzeile gefolgt von der Option --out-osm oder --out-o5m die das Ausgabeformat festlegt.
Jetzt die Datei noch speichern und fertig.

Der Inhalt sollte jetzt folgendermaßen aussehen:

-v

--keep=
tourism=camp_site
tourism=caravan_site

--drop=
dog=no

--out-osm

Natürlich kann nur nach Keys gefiltert werden die überhaupt existieren, am besten vorher im Wiki der OpenStreetMap suchen ob etwas bestimmtes vorhanden ist. Wenn man zum Beispiel einen Hund hat in der Suche auf der Wikiseite einfach "Dog" eingeben, dann bekommt man eine Übersicht welche Tags es in Verbindung mit Dog also Hunde gibt: Suchergebnisse für "Dog"

Wenn man nun eine Vorstellung hat was man filtern möchte muss es nur noch umgesetzt werden, dazu lassen sich mehrere Keys mit 'and' oder 'or' zusammenfassen.
Als Beispiel wollen wir nur Campingplätze oder Wohnmobilstellplätze filtern die eine Entsorgungsstation für Wohnmobile haben.
Eine Entsorgungsstation hat den Key "amenity=sanitary_dump_station", es ist aber auch möglich bei einem anderen Objekt den Tag "sanitary_dump_station=yes" einzufügen. Da man leider nie weiß wer bzw wie etwas eingetragen wurde muss man auf Nummer sicher gehen und beide Möglichkeiten abfragen.

Jetzt will ich für Unterwegs noch alle Picknikplätze für Pausen filtern, füge also noch den Key "tourism=picnic_site" in die TXT ein. In der Batchdatei können wir die zwei Zeilen unter --keep= also gegen folgende Zeilen austauschen:

-v

--keep=
tourism=camp_site and amenity=sanitary_dump_station
tourism=caravan_site and sanitary_dump_station=yes
tourism=camp_site and sanitary_dump_station=yes
tourism=caravan_site and amenity=sanitary_dump_station
tourism=picnic_site

--drop=
dog=no

--out-osm

Auf was man alles gefasst sein sieht man gut bei den Keys um europaweit alle McDonald's zu filtern, da müssen dann nur noch Geschäfte mit dem Namen 'McDonald's' per --drop= gelöscht werden. Nur so bekomme ich ausschließlich WPs von McDonald's die in Europa sehr Unterschiedlich eingetragen wurden, der backslash maskiert ein Leerzeichen:

--keep=
amenity=fast_food and cuisine=burger and name=McDonald's
amenity=fast_food and cuisine=burger and name=McDonalds
amenity=fast_food and cuisine=burger and name=Mc\ Donald's
amenity=fast_food and cuisine=burger and name=Mc\ Donalds
amenity=restaurant and cuisine=burger and name=McDonald's
amenity=restaurant and cuisine=burger and name=McDonalds
amenity=restaurant and cuisine=burger and name=Mc\ Donald's
amenity=restaurant and cuisine=burger and name=Mc\ Donalds
brand=mcdonald's
brand=mcdonalds
brand=mc\ donald's
brand=mc\ donalds

Weitere Möglichkeiten mit osmfilter inkl. hinzufügen eigener Keys und Tags werden auf auf der Seite von osmfilter beschrieben.

Ausführen der Batchdatei

Wenn wir die Parameter_POI_Camping.txt sowie die Ausschneiden.cmd gespeichert haben, können wir die Ausschneiden.cmd durch einen Doppelklick (Win10) starten. Alternativ geht auch ein Rechtsklick und im Kontextmenü die Option 'Öffnen' auswählen. Darauf hin sollte sich ein Kommandozeilen-Fenster öffnen und die Datei ausgeführt werden, sobald alles abgearbeitet wurde schließt sich das Fenster wieder. Je nach Größe der .pbf und der Geschwindigkeit des PCs kann das Minuten bis zu mehreren Stunden dauern. Jetzt sollten in dem Ordner einige neue Dateien vorhanden sein.

Sollte das Kommandozeilenfenster nur kurz aufblitzen sollte man als letzte Zeile das Wort pause eintragen, das führt dazu das sich das Fenster nicht automatisch schließt sondern auf eine Eingabe wartet. Dadurch hat man die Möglichkeit eventuelle Fehlermeldungen lesen zu können.

Durch die Ausgabe auf eine zweite Festplatte wird die Verarbeitung beschleunigt.

Weitere Verwendung der gefilterten Daten

Als Ergebnis haben wir jetzt eine .osm erhalten die nur die von uns gefilterten Daten enthält. Da wir das .osm-Format zur Ausgabe gewählt haben können wir uns die *.osm mit dem Ergebnis in einem Texteditor ansehen.

Je nachdem was wir mit dem Ergebnis nun anfangen wollen gibt es verschiedene Wege.

  • Eine Möglichkeit ist die Umwandlung mittels anderer Programme wie z.B. GPSBabel.
  • Ein weitere Weg ist die Erstellung von QMVs für QuoVadis, dazu muss das Ergebnis wieder zu .pbf konvertiert werden. Die Befehlszeile von oben muss dazu leicht geändert werden:
    C:\Beispiel\osmconvert64 C:\Beispiel\Camping.osm --out-pbf > C:\Beispiel\Camping.pbf
  • Dann besteht noch die Möglichkeit die Daten als .csv zu exportieren, dazu sollte man aber mit der Option --all-to-nodes die Wege und Relationen entfernen und in Knoten umwandeln. Wenn man das nicht macht, bekommt man in der .csv nur bei den Punkten Koordinaten, die Wege und Realationen bekommen keine Koordinaten, die Option läßt sich aber direkt beim Ausgeben der .csv nutzen.
    Die Befehlszeile dazu muss dann folgendermaßen aussehen:
    C:\Beispiel\osmconvert64 C:\Beispiel\Camping.osm --all-to-nodes --csv="@id @lon @lat name amenity tourism" --csv-headline >  C:\Beispiel\Camping_all2node.csv
  • Mit der Option --all-to-nodes werden alle Wege und Relationen zu Punkte konvertiert.
  • Die Option --csv= steuert die Ausgabe der .csv Datei, '@id','@lon' und '@lat' für die ID und die Koordinaten des Punktes, 'name' für den Namen sofern der Punkt einen Namen hat, 'amenity' und 'tourism' für die Tags der beiden Keys, alles andere wird verworfen.

Leider behält man beim .csv Export alle Punkte und muss diese dann von Hand aussortieren. Um das zu verdeutlichen habe ich die gefilterte Camping.osm mit der Option --all-to-nodes zu Camping_all2nodes.osm konvertiert und beide .osm dann mit GPSBabel als GPX exportiert. Diese vier Dateien habe ich zur Darstellung dann in QGIS geladen:

vergleich

  • Ganz oben sieht man die Camping.osm mit der gefüllten Fläche.
  • Darunter die Camping_all2nodes.osm bei der QGIS nur das Zentrum darstellt.
  • Als drittes die Camping.gpx die den Weg als Route enthält.
  • Und ganz unten Camping_all2nodes.gpx die sowohl die Fläche als Weg sowie das Zentrum enthält.

Und so sieht der import der Camping_all2nodes.gpx von GPSBabel in QVX aus:
qvx

Arbeitsdateien

Zum Abschluss die Ausschnitt.cmd und die Parameter_POI_Camping.txt zum herunterladen:
Beispiel.zip