Gelöst&Howto: osmconvert "verliert" ways beim schneiden von srtm-daten

okay – inzwischen gehts.
Prozess wie hier: http://osm.thkukuk.de/srtm.html

Allerdings phyghtmap gepatched um von vornherein etwas weniger Tiles zu produzieren (1 pro Input – einfach nach 100.000 suchen im Sourcecode und 3 Nullen anhängen).
Dann mergen und sort per Skript

Anschließend mit osmconvert das osm file in ein osm.pbf umformatieren. Osmosis produziert allerdings auch mit obigem Skript sortierten File nur Fehlermeldungen…
Muss sagen - ist schon ziemlich umständlich das ganze ohne srtm2osm.

Außerdem spuckt osmconvert einige Fehlermedungen von wegen wrong sequence aus - scheint derzeit aber zu funktionieren und braucht viel weniger Speicher wie bei Benutzung von vielen Einzelfiles. Muss noch überprüfen ob der pbf output auch verwendbar ist.

20m…
(benutze ich für europaweit, außer Benelux).
BTW osmconvert für osm nach pbf ist extrem langsam. Etwa 1/4 der Geschwindigkeit die phyghtmap braucht - für Alpen wird mein Rechner also etwa 4 Stunden brauchen zum konvertierne - vs 1 Stunde die phyghtmap braucht. An einem Perl-Skript was zuverlässiger ist wäre ich auch interessiert - wobei schlauer wäre wohl phyghtmap entsprechend zu patchen, so dass dieser Schritt entfällt (dann bräuchte man nicht mal den mgkmap-splitter, da man die max-nodes ja im Sourcecode vorm kompilieren entsprechend anpassen kann), am besten wäre ja pbf support für phyghtmap.

ups zu früh gefreut… osm.pbf ist grad mal 420MB groß, da wird wohl ein Fehler vorliegen (Originaldatei 17GB). Mal schauen - lasse gerade mal splitter/und mkgmap drüberlaufen.

Das ist jetzt mal der Output von osmconvert:
openSUSE-114-64-minimal:/home/contourlines # ./osmconvert alps3.osm -o=alps3.osm.pbf
osmconvert Warning: wrong sequence at node 61343367
osmconvert Warning: next object is node 42707657
osmconvert Warning: wrong sequence at way 61343368
osmconvert Warning: next object is way 42707669

Allerdings unterschlägt osmconvert diese Warnings soweit ich sehen konnte sehr gerne nachdes es ein paar gemeldet hat…

Dort wo du Warnings von osmconvert erhälst fehlen (m.E.) auch die Daten.
Die Anzahl der Warnings wird begrenzt, danach werden sie unterdrückt.

Klaus

PS: Deine Daten sind m.E. doch nicht sortiert.

Jip, und osmconvert hat auch irgendeinen Schrott gebaut. Die Daten lassen sich zwar splitten - aber mkgmap akzeptiert sie nicht:

Error parsing file
Error at line 1, col 1
Bad file format: 75280000.osm.pbf

usw…

Das ganze passiert auch schon mit dem ungesplitteten osmconvert Output:
Error parsing file
Error at line 1, col 1
Bad file format: alps3.osm.pbf
Error parsing file
Exception in thread “main” java.lang.NullPointerException
at uk.me.parabola.mkgmap.combiners.FileInfo.getFileInfo(FileInfo.java:139)
at uk.me.parabola.mkgmap.main.Main.endOptions(Main.java:413)
at uk.me.parabola.mkgmap.CommandArgsReader.readArgs(CommandArgsReader.java:126)
at uk.me.parabola.mkgmap.main.Main.main(Main.java:112)

Vielleicht bringt dich ja irgendwie mein Workflow (für Deutschland) weiter:

phyghtmap --step=25 --osm-version=0.6 --jobs=1 --area=5:47:16:56 --line-cat=500,250 --viewfinder-mask=3 --start-node-id=2000000000

perl process_phyghtmap_data.pl lon*

./osmconvert phyghtmap_result.osm --complete-ways -B=germany.poly -o=Hoehenlinien_Deutschland.osm

./osmconvert germany.osm.pbf Hoehenlinien_Deutschland.osm -o=Freizeitkarte_Deutschland.osm.pbf

Klaus

Das Problem scheint nicht osmconvert zu sein, sondern der Konvertierskript. Weil auch die 17GB osm Datei die daraus entstanden ist - funktioniert nicht mehr mit mkgmap.
Kannst du dein perl Skript mal irgendwo hochladen?

(die Grunddaten sind okay, weil die kann ich ungesplittet mkgmap vorlegen ohne Probleme)

Das (ich glaube, von meinem abgewandelte) Script auf http://osm.thkukuk.de/srtm.html sortiert die Daten nicht so wie ich es mache. Vielleicht ist das der Grund und osmconvert braucht unbedingt sortierte Daten - erst die Nodes nach ID, dann die Ways nach ID. Zumindest sollte aber der Tile-Splitter mit dem Schalter “–mixed” mit den Daten klarkommen.

Grüße
Mario

@Mario – genau Dein Skript hatte ich aber sogar genommen. Werde es nochmal mit dem vom Kukuk versuchen - aber mir sah es vom Prinzip her gleich aus, bis darauf dass der Content nicht compressed ist. Schneller als das perl Skript ist es auf jeden Fall…
Aber so groß ist der Unterschied auch nicht. Bin grad am converten des outputs vom perl skript mit osmconvert - allerdings auch da schon wieder Errors.

Sollte der splitter eigentlich bei korrekt sortierten Daten auch ohne --mixed klarkommen?

Bei Bedarf kann ich ja eine Erläuterung zu meinem Script geben, vielleicht kann man dabei Denkfehler wegen der Datenstruktur aufdecken. Das müsste aber bis morgen warten.

Und ja, bei meinem Script kommt der Splitter auch ohne --mixed aus.

Muss jetzt los.

PS: Für sowas würde sich auch die Diskussionsseite anbieten.

Bummer - das Perl Skript von toc-rox funktioniert genauso wenig… Selber Fehler.
So werde jetzt erstmal aufgeben. Scheinbar funktioniert keines der drei Skripte fehlerfrei, bzw kommt mit den Daten zurecht. Wenn ich die Daten allerdings direkt verarbeite mit mkgmap gibt es keine Probleme.
Probiere grad noch das Skript von kukuk aus - aber erwarte hier auch keine Besserung…

Wie genau hast du denn die Höhendaten erzeugt ?

Welchen gcc verwendest Du? (gcc --version)
“-march=native” sollte schon lange (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33115) unter Apple funktionokeln.

Dein Bugreport bezieht sich auf eine Lösung für Version 4.3.0 aus dem Jahr 2007.
Ich sollte meine Entwicklingsumgebung doch mal langsam aktualisieren. :frowning:

Edbert (EvanE)

Mmh, hab’ mir das mal an einem Mini-Beispiel angeschaut:
$ phyghtmap -a 10.98:48.98:11.02:49.02 --osm-version=0.6

Wenn ich das richtig sehe, sind bei den 4 entstandenen osm-Dateien nur nodes & ways intermittierend, die Reihenfolge
der nodes (bzw. ways) selbst aber ok.
Somit jene gefiltert und die daraus 8 generierten Dateien wieder zusammengemanscht:


#!/bin/sh
for i in *.osm
do
    osmconvert $i --drop-nodes --out-o5m > $i.w.o5m 2> /dev/null
    osmconvert $i --drop-ways  --out-o5m > $i.n.o5m 2> /dev/null
done
osmconvert *.o5m --out-pbf > all.osm.pbf

all.osm.pbf resp. all.osm sollten komplett richtig sortiert sein.

Keine Ahnung, ob das auch bei den Alpen klappt :wink:

Edit:
Hab’ mir mal auch im wiki das skript von Marco “Kleiner Einschub - Sort und Merge der Höhendaten” angeschaut.
Die Stelle
ls -t -r lonlat.osm
ist IMHO nicht ganz korrekt, es wird zwar zwischen Nodes und Ways unterschieden, aber jene nicht in richtiger Reihenfolge.
Bei meinem
lon10.98_11.00lat48.98_49.00_srtm3.osm (1)
lon10.98_11.00lat49.00_49.02_srtm3.osm (2)
lon11.00_11.02lat48.98_49.00_srtm3.osm (3)
lon11.00_11.02lat49.00_49.02_srtm3.osm (4)
gilt eben nicht die ID-Reihenfolge (4) - (3) - (2) - (1),
sondern (4) - (2) - (3) - (1), nur so als Beispiel.

Hi,

bei mir wird die Reihenfolge der IDs korrekt eingehalten. Vor paar Tagen erst habe ich “filelist=$(ls -t -r lonlat.osm)” eingefügt (vorher hatte ich einfach eine Datei nach der anderen eingelesen, was dann alphabetisch nach Dateiname war). Die Option “-t -r” bewirkt ja erst das Auflisten der Dateien in die Variable in der Reihenfolge nach Erstellungszeit (-t = time und -r = reverse = älteste zuerst). Dies korreliert mit dem Aufsteigen der IDs aufgrund des (sowieso nötigen) Schalters --jobs=1 in Phyhtmap.

Aber nach meiner Erfahrung ist die Reihenfolge unwichtig, zumindest dem Mkgmap-Splitter. Die Splits, ob mit sortierten oder unsortierten Daten haben die gleiche Größe. Beim Schreiben des Scripts habe ich sogar mit einem umständlichen Osmosis-Merge verglichen - ist identisch bis auf den Umstand, dass Osmosis alle Tags in Langform umschreibt - aber nach Splitten wieder absolut gleiches Ergebnis.

Grüße
Mario

Das Problem ist, dass es halt nicht ganz hinhaut :wink:

Du machst Dir ein neues Verzechnis (mkdir test; cd test), kopierst die HGT-Dateien rein (cp -r …/hgt .) und legst los mit
$ phyghtmap -a 10.98:48.98:11.02:49.02 --osm-version=0.6

Und jetzt lässt Du Dir die Änderungszeiten aller Dateien anzeigen:


$ stat *
  File: „hgt"
  Size: 4096            Blocks: 8          IO Block: 4096   Verzeichnis
Device: fe01h/65025d    Inode: 6955390     Links: 3
Access: (0755/drwxr-xr-x)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Access: 2012-01-06 09:12:42.000000000 +0100
Modify: 2012-01-06 09:12:42.000000000 +0100
Change: 2012-01-06 09:12:42.000000000 +0100
  File: „lon10.98_11.00lat48.98_49.00_srtm3.osm"
  Size: 21953           Blocks: 48         IO Block: 4096   reguläre Datei
Device: fe01h/65025d    Inode: 6955398     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Access: 2012-01-06 09:13:09.000000000 +0100
Modify: 2012-01-06 09:13:09.000000000 +0100
Change: 2012-01-06 09:13:09.000000000 +0100
  File: „lon10.98_11.00lat49.00_49.02_srtm3.osm"
  Size: 30566           Blocks: 64         IO Block: 4096   reguläre Datei
Device: fe01h/65025d    Inode: 6955416     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Access: 2012-01-06 09:13:09.000000000 +0100
Modify: 2012-01-06 09:13:09.000000000 +0100
Change: 2012-01-06 09:13:09.000000000 +0100
  File: „lon11.00_11.02lat48.98_49.00_srtm3.osm"
  Size: 30963           Blocks: 64         IO Block: 4096   reguläre Datei
Device: fe01h/65025d    Inode: 6955415     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Access: 2012-01-06 09:13:09.000000000 +0100
Modify: 2012-01-06 09:13:09.000000000 +0100
Change: 2012-01-06 09:13:09.000000000 +0100
  File: „lon11.00_11.02lat49.00_49.02_srtm3.osm"
  Size: 26553           Blocks: 56         IO Block: 4096   reguläre Datei
Device: fe01h/65025d    Inode: 6955417     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     user)   Gid: ( 1000/     user)
Access: 2012-01-06 09:13:09.000000000 +0100
Modify: 2012-01-06 09:13:09.000000000 +0100
Change: 2012-01-06 09:13:09.000000000 +0100

Die 4 osm-Dateien haben den gleichen (Modify)-Zeitstempel, so dass “ls -t -r” doch wieder alphabetisch sortieren muss :wink:

osmconvert braucht halt eine vollständig korrekt sortierte Datei, wenn es keine “wrong sequence …” ausgeben soll.
Beim o. g. mini-shell skript “choked” osmconvert noch (deshalb Unterdrückung mittels “2> /dev/null”, die entstehenden
“nodes-only”- bzw. “ways-only” sind aber bereits korrekt (hoffentlich ;), so dass das letzte “osmconvert *.o5m …” ohne
Schluckauf funktionokelt.

Ich stelle dann hier doch mal die Beta-Version des Perl-Utilities zur Verfügung.
Das Utility interessiert überhaupt nicht für die Timestamps der Dateien,
sondern baut eine Hashmap mit der jeweils ersten ID aus jeder Datei auf.
Diese Hashmap wird anschließend sortiert abgearbeitet.
Wichtig ist jedoch (wie auch schon von Marco erwähnt) bei phyghtmap die Option “–jobs=1” zu setzen.
Hierdurch wird sichergestellt, daß die IDs in allen erzeugten lon*-Dateien fortlaufend sind.

Link: http://dl.dropbox.com/u/1677057/process_phyghtmap_data.pl
Benutzung: process_phyghtmap_data.pl lon*
Man erhält eine Ergebnisdatei mit dem Namen “phyghtmap_result.osm”.

Klaus

Hallo Klaus,

sehr schön, geht ab wie eine Rakete :slight_smile:

Der Loop bei meinen skript war sehr “clever”, richtig reingeswappt.
Daher umgeschwenkt auf


osmconvert lon*.osm --drop-nodes --out-o5m > w.o5m 2> /dev/null
osmconvert lon*.osm --drop-ways --out-o5m > n.o5m 2> /dev/null
osmconvert n.o5m w.o5m > all.osm

Braucht aber immer noch 2x so lang wie Deine perl-Variante.

Tja, das hat er leider uns nicht mitgeteilt, der liebe, gute extremecarver :wink:

Wir können aus seinen posts nur vermuten, dass es etwas in der Art


$ phyghtmap --area=5.5:45.2:16.7:48.7 --gzip --jobs=1 --max-nodes=250 --osm-version=0.6 --start-node-id=10000000 --step=20 --viewfinder-mask=1

war.
Meinem armen, kleinen Netbook (1/12 RAM von extremecarvers Kiste) wollt’ ich die 18 GB (oder so) nicht antun und hab’ mich so auf die Hochalpen beschränkt:


phyghtmap --area=6:44:9:47 --jobs=1 --osm-version=0.6 --step=20 --viewfinder-mask=1

Das Perl-Skript von Klaus bzw. das Shell-Skript von Mario generieren (gleichschnell :slight_smile: aus den 103 osm-Dateien
jeweils ein ca. 6 GB große osm-file. Die Sortierung hab’ ich geprüft wie folgt:
osmconvert --out-statistics phyghtmap_result.osm
bzw.
osmconvert --out-statistics topo.osm
In beiden Fällen gab es keine “wrong order/wrong sequence”-Warnung. Dann für beide Fälle
problemlos jeweils ein pbf generiert ( 5.8 GB → 148 MB !) und aus jenen per “omsconvert -B=geneve.poly …”
Genf extrahiert ohne Fehlermeldung und dieses kurz in JOSM angeschaut.
splitter/mkgmap wurde nicht gestestet, da nicht der Garmin-Fraktion angehörend :wink:

Denke nicht, dass von 6 GB auf 18 GB sich etwas grundsätzlich ändert, so vermute ich den Fehler woanders.

Debian 6, phyghtmap 1.24 (ohne patches)

EDIT:
Nett wäre es, wenn phyghtmap einen Parameter “–single-file” hätte, bei welchem es eine Art “phyghtmap_result.osm”
generieren würde, indem es 2 temporäre Dateien mit nur ways resp. nur nodes benutzt und jene am Schluß konkateniert.
Dann bräuchte man keine “merge-scripte” mehr und osmconvert könnte das “singe-file” sehr platzsparend nach
pbf konvertieren, da sich in diesem Format die Höhendaten extrem gut packen lassen, besser als mit gzip.