DE:Osmfilter version 0

From OpenStreetMap Wiki
Jump to navigation Jump to search

Mit dem Tool osmfilter Version 0 können .osm-XML-Dateien, von denen nur wenige Tags benötigt werden, gefiltert und damit auf das unbedingt notwendige Maß verkleinert werden. Besonders nützlich ist das dann, wenn wenn OSM-XML-Daten mit Hilfe von osm2pgsql in eine PostgreSQL-Datenbank importiert werden sollen. Obwohl sich am Ergebnis inhaltlich nichts ändert, wird durch das vorherige Filtern der Import-Vorgang deutlich beschleunigt - nicht zuletzt deswegen, weil osmfilter als C-Programm vergleichsweise schnell arbeitet.

Hinweis: Es gibt ein neueres Filterprogramm (o5mfilter Version 1), das einige Optionen mehr anbietet und einfacher zu bedienen ist, wenn es darum geht, Abhängigkeiten zwischen OSM-Objekten zu berücksichtigen.

Download

Diese Downloads sind verfügbar:

(Wie üblich: Gewährleistung ausgeschlossen, so weit wie gesetzlich zulässig.)

Programmbeschreibung

Dieses Programm arbeitet als Filter für OSM-XML-Daten. Nur die Abschnitte mit bestimmten Tags werden von Standard-Input nach Standard-Output kopiert. Über den Kommandozeilenparameter -k kann festgelegt werden, welche Abschnitte in der Standardausgabe gewünscht sind. Beispiele:

-k"key1=val1 key2=val2 key3=val3"
-k"amenity=restaurant =bar =pub =cafe =fast_food =food_court =nightclub"
-k"barrier="
-K/ -k"description=Irgendwas mit Leerzeichen/name=Baden Baden"

Einschränkungen: Die maximale Anzahl von Schlüssel/Wert-Paaren ist auf 1000 begrenzt, die maximale Länge eines Schlüssels (key) bzw. eines Werts (val) beträgt 100 Zeichen. Mit der Option -t kann eine Liste aller akzeptierter Parameterwerte ausgegeben werden.

Die Option -d wird dazu genutzt, bestimmte Objekte zu unterdrücken. Zum Beispiel:

 -d"highway=path =footway =cycleway railway=rail"

Alle Objekte, die mindestens einen der genannten Werte enthalten, werden ausgefiltert, und zwar unabhängig davon, ob sie Teil einer Relation sind, die weiterhin existiert. Das heißt, der Parameter -d überstimmt zum Teil den oben erklärten Parameter -k.

Berücksichtigung von Abhängigkeiten

Um referenzierte Objekte (z.B. Knoten eines ausgewählten Wegs oder Wege einer ausgewählten Relation) zu erhalten, muss die OSM-XML-Datei mindestens zweimal an das Programm gesendet werden. Um Knoten zu erhalten, die in Wegen vorkommen, auf die von einer ausgewählten Relation aus verwiesen wird, muss die Datei mindestens dreimal gesendet werden. Um auch Relationen zu berücksichtigen, die in anderen Relationen enthalten sind, wird die XML-Datei ein viertes Mal benötigt. Falls es mehr als eine interrelationale Hierarchieebene gibt, sollte die XML-Datei mindestens 5 oder 6-mal an das Programm gesendet werden.

In allen Fällen, bei denen die OSM-XML-Datei mehr als einmal an das Programm osmfilter gesendet werden soll, müssen der Beginn und das Ende dieses Vorverarbeitungsvorgangs markiert werden. Beispiel:

cat lim a.osm a.osm a.osm a.osm lim a.osm | ./osmfilter -k"lit=yes" >new.osm

Die Datei "lim" beinhaltet die benötigte Markierung als Text:

<osmfilter_pre/>

Falls die OSM-XML-Datei in komprimierter Form vorliegt, kann bzcat an Stelle von cat verwendet werden. Dann muss natürlich auch die Datei "lim" komprimiert worden sein.

Um den Filtervorgang zu beschleunigen, benötigt das Programm osmfilter etwas Arbeitsspeicher für eine Hash-Tabelle. Per Voreinstellung werden 320 MiB für Flags für Knoten, 60 für Flags für Wege und 20 für Flags für Relationen verwendet.
Jedes Byte enthält die Flags für 8 ID-Nummern, das heißt, in 320 MiB können 2684 Millionen Flags gespeichert werden. Da es derzeit (Oktober 2010) weniger als 1000 Millionen Flags gibt, würden 120 MiB ausreichen. So kann der Speicherplatzbedarf zum Beispiel auf 130, 12 und 2 MiB (Knoten, Wege und Relationen) mit diesem Kommandozeilenparameter verringert werden:

-h130-12-2

Zu berücksichtigen ist jedoch, dass die OSM-Datenbank kontinuierlich wächst. Aus diesem Grund ist die programmeigene Voreinstellung höher als momentan benötigt, und es kann angebracht sein, sie in der Zukunft noch weiter zu erhöhen. Will man sich um die Details nicht kümmern, kann man den zu verwendenden Arbeitsspeicher auch als Summe vorgeben. Das Programm wird ihn dann selbstständig aufteilen. Beispiel:

-h1000

Diese 1000 MiB werden aufgeteilt in 800 MiB für Knoten, 150 für Wege und 50 für Relationen.

Weil programmintern Hash-Algorithmen verwendet werden, ist es nicht notwendig, die gesamte empfohlene Speichermenge zur Verfügung zu stellen; das Programm wird auch mit weniger Speicher zuverlässig arbeiten. Jedoch ist der Filtervorgang dann nicht so effektiv, das heißt, es kann sein, dass in der Zieldatei manche Knoten und manche Wege vorhanden sind, die eigentlich herausgefiltert hätten werden sollen.
Das Programm akzeptiert maximal 4000 MiB als Hash-Größenvorgabe. Falls das Maximum an tatsächlich zur Verfügung stehendem Speicherplatz überschritten wird, reduziert das Programm den Platzbedarf selbstständig und gibt eine entsprechende Warnung aus.

Performance-Optimierung

Da es keine Knoten gibt, die auf andere Knoten verweisen, benötigt das Programm während der Vorverarbeitung den langen Abschnitt in der XML-Datei, der nur Knotendaten enthält, nicht. Ähnliches gilt für Wege, denn sie werden maximal einmal und nur ganz zum Schluss in der Vorverarbeitung benötigt, während Relationen diesen Prozess eventuell mehrfach durchlaufen müssen.
Um die Gesamtlaufzeit zu verringern, kann es hilfreich sein, die OSM-XML-Datei vorab zu filtern. Mit der drop-Option können alle Knoten, alle Wege oder auch alle Relationen ausgefiltert werden. Beispiel:

cat a.osm | ./osmfilter --drop-nodes >wr.osm
cat wr.osm | ./osmfilter --drop-ways >r.osm
cat lim r.osm r.osm r.osm wr.osm lim a.osm | ./osmfilter -k"lit=yes" >new.osm

Immer dann, wenn die drop-Option genutzt wird, findet kein anderes Filtern statt, das heißt, der Parameter -k wird ignoriert.

Beispielanwendung

Das Projekt OpenGastroMap.de nutzt das Programm osmfilter, um den Datenimport zu beschleunigen. Dadurch reicht für den Betrieb der Anwendung ein kleiner virtueller Internetserver aus. Hier die Details: OpenGastroMap/install#Tool_osmfilter.