Probleme mit Changefiles der Geofabrik

Danke! Trotzdem gab’s da einen Konflikt in der DB, der so eigentlich nicht hĂ€tte passieren dĂŒrfen :slight_smile:

Kann es sein, dass die Daily-Changefiles nachtrĂ€glich noch korrigiert wurden? Ich mĂŒsste mal die Minutely-Diffs ziehen und das dann prĂŒfen.

Bei http://www.openstreetmap.org/api/0.6/node/1800937801/history ist ĂŒberhaupt nichts besonderes. Ein node wurde angelegt, von einem anderen User gelöscht und von einem dritten User wieder angelegt. Das geht und das ist okay. Man sollte das nicht machen, wenn der Node was ganz anderes darstellt nachdem er wieder aufersteht, aber manchmal ist das sinnvoll, z.B. bei einem revert. In diesem Fall scheint der dritte User den delete des zweiten Users quasi revertiert zu haben und dabei die Tags korrigiert und die Position verĂ€ndert. Kann man sich drĂŒber streiten, ob das sinnvoll war, aber es ist kein Datenbankproblem oder dergl.

Habe es kurz zuvor im IRC diskutiert und dort wurde mir gesagt, dass der Node eben nicht revidiert wurde (ich bin ursprĂŒnglich auch davon ausgegangen). Woran siehst du, dass die Entfernung rĂŒckgĂ€ngig gemacht wurde?

Tom Hughes schrieb im genannten Thread auf osm-dev: "I’ve emptied the failed hourly now, as I believe everything in it is also in the following one, and rebuilt the daily. "

Also, wenn ich mir die Zeitstempel dort so ansehe, mĂŒsste das nur das File "325.osc.gz 2016-04-29 21:26 " betreffen. Alle anderen daily diffs werden immer brav um 00:06 erzeugt.

Habe es kurz zuvor im IRC diskutiert und dort wurde mir gesagt, dass der Node eben nicht revidiert wurde (ich bin ursprĂŒnglich auch davon ausgegangen). Woran siehst du, dass die Entfernung rĂŒckgĂ€ngig gemacht wurde?

Version 2 hat visible=“false”, also wurde die gelöscht. Version 3 hat visible=“true”, also wiederhergestellt.

Das habe ich auch vermutet. Im IRC wurde mir dann aber mitgeteilt, dass hier wohl zwei Nutzer ĂŒberschneidend gearbeitet haben (siehe oben). Die Wiederherstellung nur eines Nodes ist schon 
 schwierig. Selbst mit JOSM-Plugins. Außer man hĂ€tte recherchiert, ob dort ein Node existiert hat und dann mithilfe der ID das Objekt wiederhergestellt
 Das macht doch eigentlich keiner.

Edit: Will aber jetzt keinen Streit deswegen anfangen. Schade, dass die Changefiles der Geofabrik hier Probleme machen.

Also die Changefile-Extracts der Geofabrik sind definitiv fehlerhaft :frowning:

osmium getid -f osc europe.s000001144.osc.gz n1800937801
<?xml version='1.0' encoding='UTF-8'?>
<osmChange version="0.6" generator="osmium/1.3.0">
  <delete>
    <node id="1800937801" version="1" timestamp="2016-04-30T23:57:53Z" uid="190869" user="elbatrop" changeset="12003838" lat="54.398121" lon="10.231277">
      <tag k="name" v="Schwanenweg"/>
      <tag k="amenity" v="recycling"/>
      <tag k="recycling:glass" v="yes"/>
    </node>
  </delete>
</osmChange>

und hier aus dem Planet:

osmium getid -f osc 327.osc.gz n1800937801
<?xml version='1.0' encoding='UTF-8'?>
<osmChange version="0.6" generator="osmium/1.3.0">
  <delete>
    <node id="1800937801" version="2" timestamp="2016-04-30T13:49:17Z" uid="3899604" user="AxelRosch" changeset="38999663" lat="54.398121" lon="10.231277"/>
  </delete>
</osmChange>

Keine Ahnung, wie das da rein kommt.

Da ich nur mit den minĂŒtlichen Diffs von planet.openstreetmap.org arbeite und diese mit osmosis+osm2pgsql in meine lokale DB lade, sieht “mein” Node derzeit so aus:

select tags from planet_osm_point
where osm_id=1800937801;
tags

“amenity”=>“recycling”, “recycling_type”=>“container”, “recycling:glass”=>“yes”, “recycling:clothes”=>“yes”
(1 Zeile)

Timestamp, version, uid und user stehen mir nicht zur VerfĂŒgung, da ich die nicht mit importiere.

Der Inhalt deckt sich auch mit dem der UK-Api-Db: https://www.openstreetmap.org/node/1800937801
Das verstÀrkt eure Vermutung, dass bei der Datafabrik mit dem Export was schief gelaufen sein könnte.

Insofern bin ich ziemlich beruhigt. :wink:

Gruss
walter

Nachtrag: Oder der Full planet in UK? Hat sich den mal wer angesehen?

Das ist ein sehr altes und, wie ich angenommen hatte, bekanntes Problem.

Wenn ich ein Deutschland-Diff ausrechne, dann tue ich das, indem ich vermittels Osmosis den Unterschied zwischen dem Deutschlandfile von heute und dem von gestern bestimme. Wenn ein Node gestern noch da war und heute nicht mehr, dann kann Osmosis nicht feststellen, in welcher Version er gelöscht wurde - sie muss höher sein als die von gestern, das ist klar, aber welche, kann man höchstens erraten. Osmosis verzichtet auf dieses Raten und verwendet die gleiche Versionsnummer wie vom bekannten Objekt.

FĂŒr osm2pgsql spielt das keine Rolle, weil das eh nicht auf Versionsnummern guckt.

Man kann sich jetzt drĂŒber streiten, ob das “fehlerhaft” ist, aber auf jeden Fall ist es normal :wink:

Bye
Frederik

Frederik, das Problem ist: es werden Uhrzeiten erfunden, die es gar nicht gibt. Werden die bei deinem Abgleichprozess nicht mitgenommen? Einfacher Workaround fĂŒr die Versionsnummern, wie Jochen schon sagte: beim Löschen die Version um 1 erhöhen, so macht es die API auch. Die API sollte Maß aller Dinge sein.

Hautproblem ist aber, dass das Mergen von daily-diffs mit den drei bekannten Tools osmium, osmconvert und osmosis zu falschen Ergebnissen fĂŒhrt. Ich denke nicht, dass es sich hierbei um ungewöhnliche Tools handelt, die ich hier einsetze. Ich sehe es als fehlerhaft an, da die besagten Probleme mit den Original-Planet-Files nicht auftritt.

Naja, mehr als informieren und warnen kann man nicht.

osmosis setzt dort einfach den aktuellen Zeitstempel an:

Link.

Oh okay - danke! Ich dachte, das wird irgendwie mitgefĂŒhrt
 Das erklĂ€rt echt, wieso die Scripte hunderte logische Fehler auswirft und die ganzen Tools beim Mergen durchdrehen. Gut, dann kann ich die jetzt nicht mehr verwenden, danke!

Ich habe allerdings noch ein Problem, welches derzeit NICHT auf den Timestamp zurĂŒckverfolgbar ist. Schreibe nachher noch was dazu.

+1

Naja
 auch die API kann mal falsch liegen. Und wenn Informationen fehlen - wie in dem von Frederik beschriebenen Szenario - muss man sich eben anders behelfen. Ich bin mir nicht sicher, aber ich meine, osmconvert arbeitet sogar noch primitiver: die Versionsnummern werden ignoriert, es entscheidet die Reihenfolge der Dateinamen in der ParameterĂŒbergabe. Bin mir aber jetzt nicht sicher, mĂŒsste in den Code schauen.

Deswegen finde ich die Lösung, fĂŒr das Löschen eine um 1 erhöhte Versionsnummer zu erzeugen, eine gute Idee.

Klar, “it’s a fake!”, aber es ist ein guter und sinnvoller Fake. Wichtig ist im Prinzip nur, dass der Zeitstempel neuer ist als der der letzten vorherigen Änderung. Und da man selten Changefiles verarbeitet, die in der Zukunft erzeugt wurden, ist das ja normalerweise der Fall. :wink:

Nicht durcheinanderbringen, das war das “Vulcan Science Directorate”. :wink:

Das könnte den Schluckauf erklÀren, den ich momentan mit den Daten habe.

Ach verflucht, stimmt
 die einen sind durchtriebener und die anderen sind einfach nur sturr :smiley:

Speziell zu den Diffs der Geofabrik mit gelöschten Objekten: Der Timestamp sollte eigentlich auf Datum/Uhrzeit der Erstellung des jeweiligen Diffs gesetzt sein, der wahre Zeitpunkt lĂ€sst sich ja nicht mehr ermitteln. Bekannt ist nur, welches Element “gestern noch drin war” und “heute nicht mehr drin ist”. Wird ein Element am gleichen Tag revertet, werden die Meta-Daten anhand des Unterschieds “gestern/heute” korrekt aktualisiert. Wenn sich aber der Revert in einem anderen Diff befindet, benötigt man Kenntnis von der Wirkungsweise und möglichen Schaltern der Programme. Bei Osmosis weiß ich aus eigener Erfahrung, dass der Standardaufruf zu Fehlern in den Daten fĂŒhrt.

Osmosis hat den Schalter “conflictResolutionMethod”. Benutzt man ihn nicht, muss man --rxc in umgekehrter Reihenfolge anwenden (es sei denn, man arbeitet mit “inPipe.x” und gibt so die Reihenfolge vor). Grund ist der verwendete Stack fĂŒr zu mergende Einzelelemente - was zuerst zwischengespeichert wird, wird zuletzt abgeholt und gilt als aktuell, also:
–rxc heute --rxc gestern → Stack: heute, gestern → Daten: erst gestern, dann heute.

Ansonsten bietet der Schalter “conflictResolutionMethod” speziellere Möglichkeiten:
http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.44#–merge-change_.28–mc.29

Wobei auch zu sehen ist, dass ein Erhöhen der Version um 1 beim Löschen aufgrund des Defaults keine gute Idee ist. (Ist sie beim Revert höher als vorher?)
version: Macht trotzdem die Reihenfolge wichtig, falls die Version gleich ist.
lastSource: Reihenfolge zu beachten
timestamp: scheint geeignet zu sein, aber Vorsicht: ein Revert nach Erstellung der osm.pbf, aber vor der Laufzeit der Diff-Erstellung bringt den Fehler, weil der Timestamp in der aktuellen Diff dann neuer ist als der Revert in der nÀchsten Diff. Dagegen hilft, als Timestamp den neuesten in der osm.pbf zu nehmen statt der aktuellen Uhrzeit.

Fazit: Mit der richtigen Zeihenfolge der Input-Quellen ist man auf der sicheren Seite, weil die Version “schlimmstenfalls” gleich sein kann.

Ja, siehe weiter oben (wenn es denn wirklich ein Revert ist).

Sorry, war bei einem Kunden. Hier die Auswertung. Ich empfinde das als Fehler:


# Changefiles runterladen
# Geofabrik 142.osc.gz hat die Daten vom 2016-04-28 (plus ein paar Zeiteinheiten)
# Geofabrik 146.osc.gz hat die Daten vom 2016-05-03 (plus ein paar Zeiteinheiten)
wget http://download.geofabrik.de/europe-updates/000/001/14{2..6}.osc.gz
mkdir europe && mv *.osc.gz upd_europe/

# Planet 325 hat die Daten von 2016-04-28 (plus ein paar Zeiteinheiten)
# Planet 329 hat die Daten von 2016-05-03 (plus ein paar Zeiteinheiten)
wget http://planet.openstreetmap.org/replication/day/000/001/32{5..9}.osc.gz
mkdir planet && mv *.osc.gz upd_planet/

# Analyse am Beispiel von Weg 414256828
zgrep 414256828 upd_europe/143.osc.gz
zgrep 414256828 upd_europe/146.osc.gz
zgrep 414256828 upd_planet/325.osc.gz
zgrep 414256828 upd_planet/329.osc.gz

# Ergebnis (von oben nach unten) als CSV
osm_id;timestamp;version;filename
414256828;2016-04-28T20:44:16Z;1;europe/143.osc.gz
414256828;2016-05-03T00:18:16Z;1;europe/146.osc.gz
414256828;2016-04-28T20:44:16Z;1;planet/325.osc.gz
414256828;2016-05-02T08:11:34Z;2;planet/329.osc.gz

Wie deutlich wird, weichen die Timestamps extrem ab - und dabei handelt es sich um die Rohdaten. Ich habe das noch nicht mit einem Tool bearbeitet.

Offenbar schreibt Osmosis, wenn man zum Zeitpunkt X ein Diff aus A und B erzeugt, und etwas in A drin war, was in B nicht mehr drin ist, den Zeitpunkt X in das Objekt statt dem Originalzeitpunkt.

Also ich muss ich da ein bisschen stur stellen. Da sehr viele Leute völlig unproblematisch die Geofabrik-Diffs einsetzen, scheinen es nur Nischen-AnwendungsfĂ€lle zu sein, die hier ein Problem haben. Ich setze derzeit Osmosis “von der Stange” ein, um diese Diffs zu erzeugen. Es gibt keine “eindeutig richtige” Lösung, was Osmosis ins Changefile schreiben soll, wenn es feststellt, dass ein Objekt gelöscht wurde. Ich sehe nicht, was ich Ă€ndern sollte, und wenn ich es sĂ€he, hĂ€tte ich nicht das Programm dazu, um es zu machen. Nur sehr ungern wĂŒrde ich ein gepatchtes Osmosis einsetzen, das andere Resultate erzeugt, als sie jemand bei sich reproduzieren könnte. Die beste Lösung wĂ€re, ein Original-Tagesdiff von OSM zu nehmen und dieses nach LĂ€ndern und Regionen aufzudröseln. Das ist aber aus verschiedenen GrĂŒnden eine teure Operation. Augmented Diffs von Overpass wĂ€ren eine Alternative. Aber es fehlt mir die Zeit, hier zu forschen, was man am besten machen sollte, besonders, wenn es nur fĂŒr einen Nischen-Anwendungsfall ist.

Also, langer Rede kurzer Sinn, wem das nicht passt, der soll sich dafĂŒr einsetzen, dass Osmosis geeignet geĂ€ndert wird, dann installiere ich bei mir auch gern eine neue Osmosis-Version. In der Zwischenzeit sollte ich vielleicht einfach die Dokumentation zu den Diffs dahingehend verbessern, dass dieses Problem klar erklĂ€rt wird.

Bye
Frederik

Wer zwingt dich denn osmosis zu verwenden? Im Vergleich zu allen anderen Lösungen “auf dem Markt” ist osmosis mit Abstand die langsamste Variante.

Nochmal kurz: Ich mache dir keinen Vorwurf, wollte nur den Leuten helfen, die Ă€hnliche Probleme wie ich haben. Mag sein, das Verfolgen von Änderungen eine Nischenanwendung ist, aber OpenStreetMap ist mehr als eine Karte, die man aus osm2pgsql-Daten rechnet.

Mein Tool hat ĂŒbrigens ĂŒber 300 Abweichungen in den oben genannten Changefiles gefunden. Ein tolles Beispiel, welches auch auf osm2pgsql Einfluss hat, ist z.B. Way 6525983. Das ist aber augenscheinlich ein osmium-Problem, was in Verbindung mit den Geofabrik-Daten auftritt (da hier die Version nicht erhöht wird).

Mit den Dateien von oben...
# Arrays erstellen (numerisch sortiert)
files_europe=(upd_europe/14{2..6}.osc.gz)
files_planet=(upd_planet/32{5..9}.osc.gz)

# Merge mit osmium v1.3.0 (57715b1)
osmium merge-changes --simplify --output=osmium_europe.osc "${files_europe[@]}"
osmium merge-changes --simplify --output=osmium_planet.osc "${files_planet[@]}"

# Merge mit osmconvert v0.8.5
osmconvert --merge-versions -o=osmconvert_europe.osc "${files_europe[@]}"
osmconvert --merge-versions -o=osmconvert_planet.osc "${files_planet[@]}"

# Analyse der Dateien anhand von Weg 6525983
grep 'way id="6525983"' -B1000 osmium_europe.osc | grep -E 'delete|modify|create' | tail -n 1 # Ergebnis: <modify>
grep 'way id="6525983"' -B1000 osmium_planet.osc | grep -E 'delete|modify|create' | tail -n 1 # Ergebnis: <delete>
grep 'way id="6525983"' -B1000 osmconvert_europe.osc | grep -E 'delete|modify|create' | tail -n 1 # Ergebnis: <delete>
grep 'way id="6525983"' -B1000 osmconvert_planet.osc | grep -E 'delete|modify|create' | tail -n 1 # Ergebnis: <delete>

Jochen hat inzwischen osmium ĂŒberarbeitet. Ich prĂŒfe die Ergebnisse gleich nochmal mit der neuen Version.
Edit: Das Problem mit den Versionen wurde behoben (in diesem Post genannter Fehler). Die falschen Timestamps bleiben vorhanden, sind aber fĂŒr das Rendering egal.

Danke an alle Beteiligten.