DE:Osmfilter
osmfilter ist ein Kommandozeilentool, das aus OSM-Planetfiles Daten mit ausgewählten Tags heraus filtert. Es ist möglich verschiedene Arten von Filtern zu definieren, mit denen OSM-Objekte (d.h. Punkte, Wege und Relationen) einschließlich der zugehörigen Objekte (z.B. Punkte von Wegen, Wege von Relationen, Relationen von anderen Relationen) extrahiert werden können.
Unterstützte Eingabe- und Ausgabe-Formate sind das .osm-Format und das .o5m-Format. Um schnelleres Filtern zu ermöglichen, wird empfohlen, das .o5m-Format zumindest für die Dateneingabe zu verwenden. Das Programm osmconvert hilft bei entsprechenden Formatumwandlungen. Zum Beispiel: ./osmconvert file.pbf -o=file.o5m
Download
Folgende Downloads sind erhältlich:
- Programmdatei für Linux 32 bit
- Programmdatei für Windows
- Quellcode (neueste Version)
- (vorheriger Quellcode)
- Downloaden und übersetzen unter Linux in einem Aufwasch: wget -O - http://m.m.i24.cc/osmfilter.c |cc -x c - -O3 -o osmfilter
Wie üblich: Gewährleistung ausgeschlossen, so weit wie gesetzlich zulässig.
Beschreibung des Programms
Um das Programm auszuführen ist unter Linux wie Windows gleichermaßen eine Kommandozeile erforderlich. Unter Windows kann diese meist durch die Eingabe von "cmd" in das Suchen/Ausführen-Feld des Startmenüs geöffnet werden.
Eine detaillierte Beschreibung aller Optionen ist über die eingebaute englischsprachige Hilfefunktion unter Linux abrufbar:
./osmfilter --help
Eine Übersicht über alle Optionen wird unter Linux angezeigt mit:
./osmfilter -h
Die folgenden Absätze zeigen die wichtigsten Anwendungsbeispiele.
Objekt-Filter
Filter dieser Kategorie beziehen sich immer auf ganze Objekte (Punkte, Wege oder Relationen), das heißt, sie entscheiden, ob das jeweilige Objekt als Ganzes erhalten bleibt oder komplett aus der Datei ausgeschlossen wird.
Bestimmte Objekte und ihre Mitglieder behalten
./osmfilter norway.osm --keep="highway=primary =secondary waterway=river" -o=streets.osm ./osmfilter switzerland.o5m --keep="highway=cycleway and lit=yes" -o=litcycles.osm ./osmfilter europe.o5m --keep= --keep-relations="route=bus" -o=bus_lines.o5m ./osmfilter bayern.o5m --keep="admin_level=6 and name=Nürnberger\ Land" -o=nbg_boundaries.osm
Der Backslash "\" erlaubt auch Leerzeichen innerhalb von Schlüsselnamen oder Werten.
Objekte eines bestimmten Typs behalten
Um beim Filtern nur Objekte eines bestimmten Typs zu behalten, müssen Filter auch für die beiden anderen Objekttypen definiert werden. Um beispielsweise nur Punkte mit dem Tag fixme zu behalten, wird eines dieser Kommandos verwendet:
--keep-nodes="fixme=" --keep-ways= --keep-relations= --keep= --keep-nodes="fixme="
Bestimmte Objekte ausschließen
./osmfilter europe.o5m --keep="highway=" --drop="access=no" -o=good_ways.osm
Alle Punkte, Wege oder Relationen ausschließen
Mit den folgenden Optionen können alle Objekte eines bestimmten Typs ausgeschlossen werden (Kombinationen sind zulässig):
--drop-nodes --drop-ways --drop-relations
Erweitertes Objekt-Filtern
Abhängigkeiten zwischen Objekten ignorieren
Wenn ein Objekt behalten wird, gilt das normalerweise auch für alle seine Unterobjekte. Beispielsweise schließt der Filter --keep="highway=" nicht nur alle Straßen ein, sondern auch alle dazugehörenden Punkte. Gleiches gilt sinngemäß für Relationen und deren Mitglieder. Falls dieses Verhalten nicht gewünscht ist, kann es mit der folgenden Option abgeschaltet werden:
--ignore-dependencies
Boolesche Operatoren
Zum definieren komplizierter Filter können die booleschen Operatoren and und or verwendet werden. Der erste hat eine höhere Priorität als der zweite, das heißt, Und-Ausdrücke werden grundsätzlich zuerst berechnet. Diese Reihenfolge kann durch die Verwendung von Klammern geändert werden. Klammern müssen durch ein Leerzeichen von jeder anderen Klammer, jedem Operand und Operator getrennt werden. Beispiel für einen booleschen Ausdruck:
--keep="place=city or ( place=town and population>=10000 )"
Vergleiche
Sechs verschiedene Vergleichsoperatoren dürfen verwendet werden:
= != < > <= >=
Das Programm vergleicht grundsätzlich in ASCII-alphabetischer Folge. Je nach Sprache ist diese Reihenfolge möglicherweise nicht korrekt. Der auffälligste Unterschied ist, dass alle Großbuchstaben vor dem ersten Kleinbuchstaben einsortiert sind.
Für Zahlen erfolgt der Vergleich numerisch. Das bedeutet, dass "2" vor "10" kommt, obwohl das bei alphabetischem Vergleich genau andersherum wäre.
Platzhalter
Bei der Definition von Vergleichen mit "=" dürfen für die Werte Platzhalter verwendet werden. Sie sind am Anfang und am Ende zulässig. Zum Beispiel:
--keep="name=main* and highway=*ary and source=*aerial*"
Besondere Tags
Falls es notwendig sein sollte, Metadaten zu vergleichen, können die folgenden Ausdrücke in Filterdefinitionen verwendet werden:
@id @uid @user
Tag-Filter
Tag-Filter beziehen sich immer nur auf einzelne Tags. Damit lässt sich festlegen, welche Tags erhalten bleiben und welche ausgeschlossen werden.
Bestimmte Tags behalten
./osmfilter a.o5m --keep-tags="all amenity=restaurant =fast_food" -o=food.osm ./osmfilter a.o5m --keep-tags="all highway= waterway= name=" -o=ways.o5m
Bestimmte Tags ausschließen
./osmfilter a.o5m --drop-tags="oneway= name=" -o=plain_ways.o5m
Autor-Informationen ausschließen
Die meisten Programme benötigen keine Autor-Informationen. Mit der Option --drop-author können Benutzername, Benutzer-ID, Timestamp und Changeset vom Filterergebnis ausgeschlossen werden. Beispiel:
./osmfilter a.o5m --keep="route=" --drop-author -o=b.o5m
Autor-Informationen und Versionsnummer ausschließen
Um neben der Autor-Informationen auch die Versionsnummern auszuschließen, kann diese Option verwendet werden (Beispiel):
./osmfilter a.o5m --keep="route=" --drop-version -o=b.o5m
Bitte beachten, dass viele Programme mit den Daten nicht mehr arbeiten können, sobald die Versionsnummer ausgeschlossen wurde.
Tag-Modifizierer
Manchmal ist es nützlich, einzelne Tags zu verändern, um die weitere Verarbeitung der Daten zu erleichtern.
Werte verändern
Es lassen sich einzelne Werte bestimmen, die dann durch das Programm entsprechend geändert werden:
./osmfilter a.o5m --modify-tags="highway=primary to =tertiary highway=secondary to =tertiary" -o=all_streets_are_small.o5m
In diesem Beispiel werden alle Straßen der ersten und zweiten Ordnung umgewandelt in Straßen dritter Ordnung.
Schlüssel verändern
Schlüssel lassen sich auf die gleiche Weise ändern. Beispiel:
./osmfilter a.o5m --modify-node-tags="amenity=fire_hydrant to emergency=fire_hydrant" -o=new_hydrant_syntax.o5m
Tags hinzufügen
Genauso wie beim Filtern kann man auch beim Modifizieren Vergleiche verwenden. Dadurch lassen sich beispielsweise redundante Tags hinzufügen:
./osmfilter a.o5m --modify-tags="maxspeed<=20 add speed_category=slow" -o=speed_categories.o5m
Eine Prüfung, ob bereits ein Tag mit gleichem Schlüsselnamen existiert, findet nicht statt. Bitte ggf. die Tag-Filterfunktion benutzen, um Kollisionen zu vermeiden.
Tag-Statistik berechnen
Um zu entscheiden, welche Objekte oder Tags behalten werden sollen und welche ausgeschlossen werden können, ist eine Übersicht über alle in einer Datei genutzten Tags hilfreich. Die folgenden Abschnitte zeigen die verschiedenen Format anhand von Beispielen. Alle Beispiel-Ausgaben wurden auf 10 Zeilen begrenzt.
Liste aller Schlüssel
./osmfilter bremen.o5m --out-key 5 Boden 1 EE 84 FIXME 1 Fone 7 StrVz 113 TMC:cid_58:tabcd_1:Class 78 TMC:cid_58:tabcd_1:Direction 107 TMC:cid_58:tabcd_1:LCLversion 110 TMC:cid_58:tabcd_1:LocationCode 47 TMC:cid_58:tabcd_1:NextLocationCode
Die erste Spalte zeigt an die jeweilige Anzahl des Auftretens.
Um eine Gruppe benachbarter Schlüssel zu definieren, kann das Platzhalterzeichen "*" verwendet werden. Zum Beispiel:
--out-key=addr:*
Liste aller Schlüssel, sortiert nach Häufigkeit
./osmfilter bremen.o5m --out-count 28199 highway 22794 building 21365 name 18754 created_by 17751 source 11842 addr:housenumber 11835 addr:street 5925 addr:postcode 5724 foot 5543 addr:city
Liste aller Werte eines Schlüssels
./osmfilter bremen.o5m --out-key=railway 156 abandoned 6 abandoned_tram 16 buffer_stop 2 bumper_stop 9 construction 31 crossing 31 disused 8 halt 269 level_crossing 38 platform
Liste aller Werte eines Schlüssels, sortiert nach Häufigkeit
./osmfilter bremen.o5m --out-count=railway |head 1570 rail 269 level_crossing 192 tram 182 tram_stop 156 abandoned 126 spur 81 razed 38 platform 31 crossing 31 disused
Parameter-Datei
Die Kommandozeilenparameter können sehr lange werden wenn man komplexe Filter definiert. In diesem Fall ist es günstiger, eine Parameterdatei zu verwenden und darauf mit --parameter-file= zu verweisen. Zum Beispiel:
./osmfilter europe.o5m --parameter-file=my_parameters >line_1.o5m
Datei "my_parameters":
-v --keep= --keep-relations= all route=bus line=1 --drop-tags= operator= direction= --out-o5m
Die einzelnen Parameter werden durch Leerzeilen getrennt. Zeilenwechsel innerhalb von Parametern ersetzt das Programm durch Leerzeichen.
Benchmarks
(Bitte ergänzen.)