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