phyghtmap - NASA SRTM -> OSM xml translator

So so.


$ time phyghtmap --area=16:45.7:18.9:48 --jobs=2 --line-cat=500,100 --osm-version=0.6 --start-node-id=300000000 --step=20 --viewfinder-mask=3
<snip>
real    2m17.245s
user    3m58.267s
sys     0m4.964s

$ time phyghtmap --area=16:45.7:18.9:48 --jobs=1 --line-cat=500,100 --osm-version=0.6 --start-node-id=300000000 --step=20 --viewfinder-mask=3
<snap>
real    2m35.576s
user    2m30.325s
sys     0m3.408s

Ich wußte, dass ich etwas verkehrt mache :wink:

Mein Intel Atom N450 hat zwar 64 Bit und wird unter Linux mit 2 CPUs angezeigt, ist aber nur HyperThreading
und kein DualCore.

Daher verwundert es nicht, dass er mit jobs=2 zwar schneller (2:15 min zu 2:30 min) als jobs=1 ist, aber dafür auch beide “CPUs” fast je 2 min 100% Last hatten (= knapp 4 min CPU-Zeit).

Interessant. Vieleicht findet sich ja jemand, der die Tests mit richtigen Kernen nachstellt. Bei meinem Versuch mit etwas kleinerem Bereich war das Verhältnis 30:38 sec. bei 1:2 Kernen, also zugunsten der Verwendung von einem Kern, mehrfach getestet.

Phyghtmap wartet, bis eine .hgt fertig ist, bevor ein weiterer Kern die Arbeit fortsetzt. Wie sonst kann es sein, dass die IDs lückenlos (ohne den Bedarf vorher zu berechnen oder eine Sicherheitslücke zu lassen) fortgeschrieben werden? Hyperthreading dagegen arbeitet eher wie ein einzelner Kern, macht diesen jedoch durch Auslagerung von “Rechen”-Aufgaben, soweit dies möglich ist, etwas effektiver. So kommt die Umkehrung zwischen beiden verschiedenen Systemen zustande.

Vielleicht wird ja der Bedarf während der Erstellung auf einem Kern parallel auf dem zweiten Kern vorausberechnet, dann liefe die Erzeugung aber genauso schnell wie wenn man nur einen Kern verwendet und diese Vorausberechnung nicht nötig ist. Effektiv wird das dann erst ab 3 Kernen.

Grüße
Mario

Mmmh,

Wenn Du genau hinschaust, gibt es einen Unterschied in der Ausgabe bei “jobs=1” und “jobs=2/3…” nämlich

Computing hgt/SRTM3/N47E018.hgt

Computing hgt/SRTM3/N47E017.hgt
etc.

Das schaut mir schon so aus, als würde hier Node/Ways vorrausberechnet.
Jenes kostet etwas Zeit und vermutlich ist deshalb bei Dir dieser “Overhead” größer als der anschließende
“gain” durch die Doppel-CPU.

Vielleicht solltest Du mal einen größeren Ausschnitt nehmen, an dem Deine Kiste mehrere Minuten zu knappern
hat. Vielleicht kehrt sich dann die Sache um :wink:

Aha, ich hab’s. Schön auf beide Kerne gleichzeitig verteilen tut er nur, wenn man die 1°-Kacheln als Ergebnis will. Bei --max-nodes-per-tile=0 (alles in eine Datei) wechseln sich die Kerne mehr oder weniger ab.

Hatte jetzt 22 sec. gegenüber den oben erwähnten 38. :slight_smile: Aber die Geschwindigkeit ist ja bei der Einmalerstellung nicht so wichtig.

Grüße
Mario

Ja, das klingt plausibel. Und wenn man sich die CPU-Zeiten (jetzt für eine einzige Ausgabedatei) anschaut, dürfte das stimmen:


$ time phyghtmap --area=16:45.7:18.9:48 --jobs=2 --line-cat=500,100 --osm-version=0.6 --start-node-id=300000000 --step=20 --viewfinder-mask=3 --max-nodes-per-tile=0
real    2m56.006s
user    2m54.927s
sys     0m4.888s

$ time phyghtmap --area=16:45.7:18.9:48 --jobs=1 --line-cat=500,100 --osm-version=0.6 --start-node-id=300000000 --step=20 --viewfinder-mask=3 --max-nodes-per-tile=0
real    2m26.956s
user    2m23.909s
sys     0m2.740s

=> SingleFile SingleCore, MultipleFile MultipleCore :wink:

Sowohl bei der “Multi-Ausgabe” als auch “Singe-Datei” sind die Dateien zwar jeweils gleich groß bei jobs=1 und jobs>1,
aber die nodes selbst sind anders sortiert.

Also bei mir lief Europe auf jobs=1 nun problemlos durch (gut 2 Stunden auf i7). jobs=4 crashte… – das runterladen der srtm/viewfinders Dateien dauert aber erheblich länger… zumindest aus phyghtmap heraus, manuell geht es da wenn man parallel downloaded schon deutlcih schneller, aber wohl auch mindestens um die 1-2 Stunden…

Bezüglich der Korrekturparameter (–corrx, --corry) würden mich folgende Punkte interessieren:

  • Welches wären geeignete Korrekturfaktoren für Deutschland ?
  • Welches wären geeignete Korrekturfaktoren für die Alpen ?
  • Ist die Anwendung der Korrekturparameter auch bei Mischung von SRTM- und Ferranti-Daten sinnvoll ?

Gruß Klaus

Hallo,

Bei den SRTM-Daten konnte mir bisher noch keiner eine Abweichung von mit phyghtmap generierten Daten zeigen. Im Gegensatz zu srtm2osm ist da phyghtmap von Haus aus besser.
Bei den Ferranti-Daten gibt es Behauptungen, das sie um 12m Abweichen. Aber auch da habe ich noch kein Beispiel gesehen.

Thorsten

Hallo Thorsten,

direkt am Übergang von VIEW zu SRTM bei 48° gibt es einen sichtbaren Versatz in Ost-West-Richtung - gleiche Höhenlinien stoßen dort nicht aneinander. Welche Datenherkunft da die genauere ist interessiert mich nicht so sehr, weil die Genauigkeit über größere Bereiche sowieso schwankt. Eine Korrektur anhand eines Bezugspunktes schafft anderenorts Ungenauigkeiten, und solange die Gipfel innerhalb der höchsten Höhenlinie liegen ist es ok. Und das ist bei den SRTM- UND Viewfinder-Daten der Fall.

Grüße
Mario

Ich habe das eingebaut. Es gibt jetzt Version 1.40 (http://katze.tfiu.de/projects/phyghtmap).

Zu den polygon-boundaries: Ich habe zum Testen die polygon-Definitionen aus http://download.geofabrik.de/clipbounds/clipbounds.tgz benutzt. Damit kommt der Parser zurecht, ich weiß aber nicht, was es da draußen noch für Formate gibt. Wie komplex die Polygone sein dürfen, weiß ich nicht, ich vermute aber, dass phyghtmap in der Hinsicht recht anspurchslos sein sollte. Die Routine zur Überprüfung, ob Punkte inner- oder außerhalb des Polygons liegen, kommt aus der matplotlib, führt also keine neue Anhängigkeit ein. Es sei gesagt, das die Verarbeitungszeit mit der Komplexität des Polygons steigt.

Zum pbf-Output: Es wird zusätzlich python-protobuf benötigt. Das gibt es als Paket in allen größeren Linux-Distributionen. Für andere Systeme gibt es die Quellen auf python.org. Ich möchte dazu auf die phyghtmap-Homepage verweisen. phyghtmap läuft jedoch auch ohne python-protobuf, dann eben ohne pbf-Output. Das Erzeugen von pbf-Dateien nimmt je nach Maschine zwei- bis dreimal soviel Zeit in Anspruch wie das Erzeugen von unkomprimiertem OSM XML. Der Speicherbedarf hingegen sinkt dramatisch (etwa ein Viertel von mittels --gzip=9 erzeugtem gegzipptem OSM XML).

Viele Grüße,
Adrian

Hallo,

irgendwas muss schiefgelaufen sein. Selbst ohne Optionen (oder nur “–help”) und mit installiertem python-protobuf bricht das Programm mit folgender Fehlermeldung ab:

Viele Grüße
Mario

Das geht bei mir noch, dafür osmconvert nicht mehr :wink:

Auf was für einem System tritt der Fehler auf, und welche python-protobuf-Version ist installiert?

Ich kann den Fehler leider nicht reproduzieren.

Viele Grüße,
Adrian

Das Problem ist genau, was die Fehlermeldung sagt, nur dass die vielleicht missverständlich ist. osmconvert kann mit latitude offsets (die Teil der pbf-Spezifikation sind) nicht umgehen (hier ein Auszug aus dem Quelltext von osmconvert):

Ich kann phyghtmap zwar so ändern, dass pbf von osmconvert gelesen werden kann (latitude offset und longitude offset auf 0 setzen und das erste Element der lat bzw. lon Listen im DenseNodes auf den entsprechenden Wert setzen). Das eigentliche Problem ist aber, dass osmconvert die pbf-Spezifikation nur unvollständig implementiert.

Ich werde mich wohl leider erst morgen darum kümmern können und eine Version 1.41 veröffentlichen.

Bis dann,
Adrian

P.S.: Ich hatte nur mit JOSM getestet, und das kann mit latitude und longitude offsets umgehen.

Hallo Adrian,

ich nutze Ubuntu 10.04, Phyghtmap ist über das angebotene *.deb installiert.

Die Paketverwaltung sagt bei python-protobuf, es wäre die Version 2.2.0a-0.1ubuntu1. Müsste also das Paket sein, das Ubuntu von Haus aus mitbringt.

Viele Grüße
Mario

Frage: Wofür soll das denn gut sein ?

Wenn es darum ging die PBF-Implementierung zu testen, dann wäre osmosis geeigneter.
Ich kann osmconvert leider nicht verwenden, da es nur eine PBF-Datei verarbeiten kann.
Vielleicht liest Markus (der Autor von osmconvert) mit und äußert sich mal …

Klaus

Debian 6 (squeeze) hat (in etwa) die Versionsnummern des ein Jahr älteren Ubuntu 10.04 (lucid);
in diesem Fall ist es mal weiter, nämlich bei 2.3.0.

Du könntest - nur so zum Spass :wink: - mal das 2.3.0 von Ubuntu 10.10 (maverick) ausprobiern:
https://launchpad.net/ubuntu/maverick/amd64/python-protobuf/2.3.0-2ubuntu1

Och, da lernt man zuweilen interesante Dinge kennen, wie - ähm - latitude offsets und so
:wink:

osmconvert gibt einen error aus, tatsächlich wird aber die Datei noch geschrieben.
Nur bin ich mir jetzt nicht mehr sicher, ob dieses Ergebnis “noch korrekt” ist.

Anders bei der “Statistik”, da geht dann halt gar nix mehr:

Hallo!

Richtig, osmconvert beherrscht nicht alle PBF-“Dialekte”. Für solche Spezialitäten würde ich besser Osmosis verwenden. Bei osmconvert wurde auf alle verzichtet, was üblicherweise nicht genutzt wird oder die Datenumwandlung bremsen könnte. Dazu gehören z.B. die Fähigkeit unkomprimierte PBFs zu schreiben sowie das Anwenden von Koordinaten-Offsets.

Zwar sind solche Offsets für das PBF-Format spezifiziert, aber die Spezifikation ist derart ungünstig geschrieben, dass diese Offsets immer erst nach den jeweiligen Datenblocks in der Datei stehen. Das heißt, man kriegt zuerst einen mittelgroßen Haufen an Daten und erst hinterher gesagt, “ätsch, die Koordinaten gelten so gar nicht, sie müssen noch verschoben werden”. :wink: Zu diesem Zeitpunkt hat osmconvert die Daten aber schon rausgeschrieben.

Ich hab vor einiger Zeit schon einmal überlegt, das Programm so zu ergänzen, dass es mit Offsets umgehen kann, hab den Gedanken aber wieder verworfen, weil das keiner gebraucht hat. Auch heute ist mir der Sinn solcher Offsets nicht klar, weil Koordinaten im PBF-Format sowieso nur als Deltas abgespeichert werden, man spart also durch die Offsets gar keinen Speicherplatz. Das Einzige, was man erreicht, ist langsameres Schreiben und langsameres Lesen.

Vielleicht irr ich mich aber auch? Wofür braucht ihr solche Offsets auf Datenblock-Ebene?

Schöne Grüße
Markus

Hallo,

nun verwende ich python-protobuf 2.3.0-4ubuntu2, welches eigentlich für natty ist. Damit funktioniert’s.

Allerdings sollte nicht schon beim Start von Phyghtmap ein installiertes (und aktuelles) python-protobuf vorausgesetzt werden, wenn man es nicht braucht. PBF schreiben geht - wie von Adrian schon erwähnt - recht langsam und ist nur was für PCs mit wenig Speicherplatz. Mir hilft das Format schon deshalb nicht, weil ich zwei Bereiche mit unterschiedlichen Parametern erstelle, dafür 3 Durchläufe brauche und anschließend per Script mergen möchte. Zudem ist die Bounding-Box beim XML-Format nicht osmosis-tauglich (Phyghtmap macht es korrekt nach Spec).

Viele Grüße
Mario