[OSM-Devserver] Cronjob OLM Update

Alexander Matheisen AlexanderMatheisen at ish.de
Sa Apr 9 12:11:02 CEST 2011


> > Die Lösung, die ich vorgeschlagen habe und meiner Meinung nach am
> > einfachsten realisierbar ist:
> > Ein Script, das erst den Updatekram für hstore behandelt, nach diesen
> > Anweisungen kann man zum Beispiel den Updatebefehl für mein oder andere
> > Projekte einfügen. Im Falle von OLM wäre das dann ein Script, dass das
> > Diff einliest und die Änderung auf die vereinfachte Tabelle anwendet.
> 
> Hast du vor, nach dem Einspielen von dem osmChange XML in die
> hstore-Datenbank, die Änderungen aus hstore zu holen oder aus der
> osmChange XML-Datei?
> Ich kenne die Details von Osmosis nicht, aber ich fürchte, dass da keine
> XML-Datei irgendwo im Dateisystem liegenbleibt. Sven hatte sowas
> angedeutet.

Also ich stelle mir das so vor:
Ein Script, das etwa so aufgebaut ist:

osmosis --rri configuration --wxc changes.osc
osm2pgsql --database hstore --append --prefix planet --slim --style
hstore.style --hstore --cache 3096 changes.osc
./olm-update.py changes.osc

Ist simpel aber sollte funktionieren. Meine Scripte müssen kaum
angepasst werden, und die hstore DB würde auch bleiben wie sie ist, man
müsste nur das Script "dazwischenschalten".

Mein Updatescript liest dann das Diff ein und wendet die Änderungen auf
die vereinfachte Tabelle an. Hat man zum Beispiel im Diff ein

<create>
  <way>
  ...
  </way>
</create>

dann holt sich mein Script den Centroid aus der hstore DB. Für das
Updatescript brauche ich die hstore DB also nur, um einfach Centroids
abzurufen. Bei nodes kann ich die Koordinaten aus dem Diff entnehmen.
Beim Verarbeiten des Diffs würde das Script dann auch nur die Objekte
mit den für mich interessanten Tags berücksichtigen.

> Wenn du aus dem Planet updatest, dann erzeugst du nicht alles neu?
> Ich stelle mir deinen Verarbeitungsprozess so vor:
> - existierende Daten sind alt, Extrakt der Daten auch
> - existierende Daten werden aktualisiert
> - neuer Extrakt wird erzeugt
> - neuer Extrakt wird mit altem Extrakt verglichen
> - Unterschied wird in alten Extrakt eingepflegt
> 
> Ist das effizienter als einen neuen Extrakt zu erzeugen und den direkt
> zu verwenden? Verstehe ich etwas falsch an deinem Verarbeitungsprozess?

Funktioniert genauso, wie du es gerade beschrieben hast. Was effizienter
ist, weiß ich nicht. Beim Vollupdate muss ja jedesmal auch wieder eine
ganz neue Sepezialtabelle erstellt werden, bei der die Centroids aller
Objekte berechnet werden. Dafür muss natürlich kein Diff gebildet
werden.

Ich denke, dass das Bilden und Einspielen des Diffs in die
Spezialtabelle schneller geht als jedesmal von allen Objekten neu den
Centroid zu berechnen.

Aber insgesamt ist meiner Meinung eben meine vorgeschlagene Lösung am
effizientesten und vor allem einfachsten.


Alex