Analyse der OSM-Historie nach Benutzer und Attributen

Rubrik: 

Extrahieren von Objekten anhand der Tag-Historie

Mit dem Werkzeug osmium-tool kann man OSM-Extrakte nach Schlüssel/Wert-Kombinationen filtern. Das funktioniert auch mit History-Dateien. Dabei werden alle Objekte herausgefiltert, bei denen es mindestens eine Version mit der gesuchten Schlüssel-Wert-Kombination gibt. Auf diese Weise ist es z.B. möglich, alle Objekte zu extrahieren, bei denen der Wert eines Schlüssel in der Versionshistorie des Objekts in einer bestimmten Weise geändert wurde, z.B. von highway=track auf highway=service|unclassified|tertiary:

# Create data file from history file to ensure consistency between data and history files:
osmium time-filter extract.osh.pbf -o extract.osm.pbf

# Get all ways with highway=track in any version 
# (Discard nodes in the first step in order to eliminate nodes that are no longer part of the current versions of the ways)
osmium tags-filter --omit-referenced extract.osh.pbf w/highway=track -o track-w.osm.pbf
osmium getid --id-osm-file track-w.osm.pbf --add-referenced extract.osm.pbf -o track.osm.pbf

# Keep only ways that are now service,unclassified or tertiary:
osmium tags-filter track.osm.pbf w/highway=service,unclassified,tertiary -o no-track.osm

Die Datei no-track.osm kann mit JOSM geöffnet werden.

Filtern nach User und Tag-Änderung

Manchmal ist es hilfreich, Objekte zu extrahieren, an denen der ursprüngliche oder der aktuelle Wert von einem bestimmten User gesetzt wurde. Mit osmium ist das leider nicht möglich, da nicht nach den Schlüsseln user und uid gefiltert werden kann.osmium kann aber die History-Datei in eine OPL-Datei umwandeln, ein Textformat mit einer Zeile pro Objektversion, in der auch der Username enthalten ist. Eine andere Möglichkeit bietet das Tool osm-tag-csv-history. Beide Wege werden nachfolgend beschrieben. In beiden Fällen wird zunächst eine History-Datei der bisher herausgefilterten Objekte erstellt:

osmium getid --id-osm-file no-track.osm --with-history extract.osh.pbf -o no-track.osh.pbf

Mit osmium und OPL-Datei

Erzeugen der History der OPL-Datei:

osmium cat -t w no-track.osh.pbf -O -o no-track.opl

Interessiert man sich für alle Wege, bei denen ein bestimmter User den Schlüssel highway von track auf einen anderen Wert gesetzt hat, dann kann man die entsprechenden Einträge in der OPL-Datei z.B. mit grep und awk finden:

awk -F' ' '{if($1==id){\
              p=match($0,"highway=");\
              if (p>0){\
                 h2=substr($0,RSTART+RLENGTH,5)\
              }else{\
                 h2=""\
              }\
              if (h1=="track" && h2!="track"){\
                 print $0\
              }\
           }\
           h1=h2;\
           id=$1\
           }' no-track.opl|\
grep u<username>|\
cut -d' ' -f1> no-track.id

Und zu guter Letzt wird eine OSM-Datei erzeugt, die man nach JOSM laden kann:

osmium getid --add-referenced --id-file no-track.id extract.osm.pbf -O -o no-track-${USER}.osm

Mit osm-tag-csv-history und CSV-Datei

Die von osm-tag-csv-history aus der History-Datei erzeugte CSV-Datei enthält für jede Änderung eines Schlüssel oder Werts eine Zeile enthält, in der u.a. der Schlüssel, der alte und der neue Wert und der Username des Benutzers aufgeführt ist, der die Änderung durchgeführt hat.

Zu der in den bisherigen Schritten erzeugten .osm-Datei wird zunächst eine History-Datei erzeugt:

osmium getid --id-osm-file no-track.osm --with-history extract.osh.pbf -o no-track.osh.pbf

Aus dieser History-Datei wird eine CSV-Datei erzeugt:

osm-tag-csv-history -i no-track.osh.pbf -o no-track.csv

In dieser Datei sucht man nun nach den Objekten, an denen man interessiert ist und erstellt eine Liste der Ids dieser Objekte zur anschliessenden Verwendung mit osmium. Die Suche kann mit den üblichen Textanalysewerkzeugen erfolgen, grep, sed, awk, usw.

Ist man im obigen Beispiel nur an den Wegen interessiert, die man selbst auf highway=track gesetzt hat, dann genügt ein einfacher Aufruf von grep und csvtool:

grep ^highway,track no-track.csv | grep ,<eigener Username>,|csvtool col 4 - > myUser.id

Mit osmium kann man eine OSM-Datei erstellen, die in JOSM geöffnet werden kann:

osmium getid --add-referenced --id-file myUser.id no-track.osm.pbf -o myTracks.osm