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.
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:
Alle Programme gibt es für Windows und Linux und müssen unter Windows nicht installiert werden
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'.
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"
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\"
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
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
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
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.
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.
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.
C:\Beispiel\osmconvert64 C:\Beispiel\Camping.osm --out-pbf > C:\Beispiel\Camping.pbf
C:\Beispiel\osmconvert64 C:\Beispiel\Camping.osm --all-to-nodes --csv="@id @lon @lat name amenity tourism" --csv-headline > C:\Beispiel\Camping_all2node.csv
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:
Und so sieht der import der Camping_all2nodes.gpx von GPSBabel in QVX aus:
Zum Abschluss die Ausschnitt.cmd und die Parameter_POI_Camping.txt zum herunterladen:
Beispiel.zip