Extrahieren von Objekten anhand der Tag-Historie und der beteiligten User
rainerU님이 German (Deutsch)로 2021년 3월 29일에 게시함. 최근 2021년 5월 6일에 업데이트됨.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 einen 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
토론
2021년 3월 30일 07:01에 Jochen Topf님의 의견
Osmium can auch das OPL-Format lesen und schreiben. Das ist ganz ähnlich wie ein CSV-Datei mit den üblichen Unix-Tools usw. zu bearbeiten.
2021년 3월 30일 15:14에 rainerU님의 의견
Hallo Jochen,
Danke für den Hinweis. Das OPL-Format kannte ich noch nicht. Für meinen Anwendungsfall hat es den kleinen Nachteil, dass bei jeder Version eines Objekts alle Objekt-Eigenschaften aufgeführt sind. Das macht das Identifizieren von Änderungen an einem Tag ein wenig komplexer als bei dem mit Rorys Tool erzeugten CSV-File. Ich werde es trotzdem mal versuchen.
Grüße Rainer
2021년 4월 4일 11:26에 tordans님의 의견
Danke fürs Teilen!
2021년 4월 4일 13:23에 rainerU님의 의견
Der Weg über eine OPL-Datei ist jetzt eingearbeitet.