Eigene Vektorkarten -> osmosis -> OSM 2 MAP

Hallo!

Es ist etwas OT, aber ich habe eine Frage an die Gemeinde, da ich Tools aus dem osm-Projekt verwende.

“Früher” habe ich eigene Vektorkarten mittels GPSmapEdit für mein Garmin erstellt. Nun benutze ich ein Android-Gerät und Locus Maps usw.

Wie viele Applikationen auch, unterstützt Locus Maps auch Karten im Mapsforge-Format.

Mit Global Mapper v14 habe ich eine Karte in das OSM-XML-Format exportiert und möchte es gerne mittels osmosis in das map-Format umwandeln.
Hier entsteht jedoch immer ein Fehler, den ich nicht nachvollziehen kann.

org.openstreetmap.osmosis.core.OsmosisRuntimeException: Node -180687 does not ha
ve a version attribute as OSM 0.6 are required to have.  Is this a 0.5 file?

Natürlich verstehe ich, dass es hier einen Versionsfehler geben kann, aber Global Mapper exportiert unter der API 0.6.
Gibt es vielleicht Einschränkungen in der Art, wie OSM-Files aufgebaut werden müssen?
Ich habe in einer Beispieldatei einfach nur die administrativen Grenzen von Mosambik in eine MAP-Datei umwandeln wollen. Später sollen es eigene thematische Karten für die Geländearbeit werden.

Generische OSM-Daten von der Geofafrik können ohne Fehler konvertiert werden.

Kann mir bitte jemand einen Hinweis geben, ob die osm-Datei einfach nur nicht standartgemäß ist?
Hier der Link: http://webdoc.urz.uni-halle.de/dl/643/pub/mbz.osm

Kleine Frage am Rande:
Wie kann man denn relativ einfach Vektorkarten für das Mapsforge-Format erstellen? Ich erstelle die Vektordaten normaler Weise in ArcGIS und benutze die Shape-Files für den Import.

Vielen Dank!

Michael

Klaro: Die Daten, die da drin stehen, sind noch nicht zu Osm hochgeladen worden. Daher haben alle Objekte negative IDs.

Gruss
walter

Die Daten sollen ja auch nicht hochgeladen werden, da sie nicht für das OSM-Projekt gedacht sind. Ich möchte eigene thematische Karten erstellen, die für meine Arbeit im Gelände relevant sind. Hochladen würde für das Projekt keinen Sinn ergeben.

Ich möchte gerne MAP-Files erstellen, um diese auf meinem Android-Gerät anzeigen lassen zu können.

Gruß, Michael

Jein: Negative IDs sind ungewöhnlich (nicht hochgeladene Objekte oder Zählerüberlauf?) und Objekt-Version, Changeset, Timestamp und Benutzer-ID/-Name fehlen (könnte man vermutlich für diesen Anwendungsfall einfach mit osmconvert oder osmosis auf irgendetwas setzen). Das ist laut ](OSM XML - OpenStreetMap Wiki) alles zulässig – bis auf die fehlende Version, von der die Fehlermeldung handelt – aber auch das andere mögen nicht alle Anwendungen…

jo, dann lade ein kleines OSM-File vom OSM-Server runter (Bremen von der Geofabrik ?) und stelle die formalen Unterschiede fest. Einer besteht in den negativen IDs - die müssen weg. Es wird aber auch noch andere Kleinigkeiten geben.

Ist doch deutlich, oder? Die node-Objekte haben kein version-Attribut, welches von osmosis aber verlangt wird, vgl. Deine Datei:

  <node id='-180687' lat='-14.9972100000' lon='30.2173830000'/>
  <node id='-180688' lat='-14.9972000000' lon='30.2174140000'/>
  <node id='-180686' lat='-14.9982570000' lon='30.2177090000'/>
  <node id='-180685' lat='-14.9986260000' lon='30.2178220000'/>
  <node id='-180684' lat='-15.0000000000' lon='30.2182530000'/>
  <node id='-180675' lat='-15.0625150000' lon='30.2206170000'/>
...
  • kein version=‘%d’.
    Wenn das zur Erzeugung verwendete Programm kein version-Attribut schreibt, kann man das auch z.B. per sed einbauen, etwa so:
 ... | sed -r "s/(node|way|relation) /&version='1' /" | ...

Derart verpfuschte Daten sollten natürlich erst recht nicht mehr zur API geladen werden, aber das ist ja hier nicht der Plan.

Ach ja, nach Einbau der obigen Lösung wird osmosis sich über den ebenfalls fehlenden timestamp beschweren. Also den sed-Befehl entsprechend ergänzen; dann Iteration, bis der Input von osmosis akzeptiert wird. version und timestamp reicht.

... | sed -r "s/(node|way|relation) /&version='1' timestamp='1970-01-01T00:00:00Z' /" | ...

PS.

Dazu sei hiermit die Suchfunktion des Forums mit dem Suchwort mapsforge angepriesen.

Dieser Code funktioniert leider nicht. sed rattert zwar durch die osm-datei, aber Änderungen finden nicht statt.

user@debian:~# sed -r "s/(node|way|relation) /&version='1' timestamp='1970-01-01T00:00:00Z' /" mbz.osm 

Die Suche half nicht weiter. Die Themen tangieren nicht mein Anliegen, weshalb ich hier frage.

Trotzdem vielen Dank.

Wenn Du damit meinst, daß die Datei mbz.osm hinterher unverändert vorliegt: das ist logisch, sed heißt ja auch stream editor. Im Output von sed werden die Änderungen wie gewünscht vorgenommen. Diesen solltest Du weiterverarbeiten (oben angedeutet mit “… | …”) oder in eine Datei umleiten (“>” – nicht in die ursprüngliche Datei). Du kannst natürlich auch einen (interaktiven) Editor verwenden und direkt die Datei bearbeiten.

Edit: Besser noch ein “<” einbauen, hatte ich zuvor vergessen.

sed -r "s/<(node|way|relation) /&version='1' timestamp='1970-01-01T00:00:00Z' /"

Ich kenne mich mit sed nicht so genau aus. Kannst du bitte eine vollständige Kommandozeile posten? Das würde die Problemlösung beschleunigen. :slight_smile:

sed -r "s/<(node|way|relation) /&version='1' timestamp='1970-01-01T00:00:00Z' /" mbz.osm > mbz2.osm

oder ohne den Umweg über eine zusätzliche Datei

sed -r "s/<(node|way|relation) /&version='1' timestamp='1970-01-01T00:00:00Z' /" mbz.osm | osmosis --rx - ...

wo anstelle von “…” die übrigen osmosis-Argumente zur Weiterverarbeitung folgen.