Osmosis 'Unable to parse xml file' error

Hallo,

ich bin normalerweise kein Freund von Doppel-Posts, allerdings scheint die englische ‘Questions and Answers’ Sektion nicht so gut besucht zu sein wie das deutsche Forum. Deshalb versuche ich es nochmal hier. Mein Anliegen ist das folgende:

Ich bin gerade dabei, xml Extrakte mittels des dump bulk-load Ansatzes in Postgres zu importieren. Bis jetzt hat das ohne Probleme funktioniert, d.h. die verwendete Toolchain leistet das Gewünschte. Die Extrakte habe ich bisher von der GeoFabrik bezogen. Jetzt will ich allerdings von den vorgenerierten Extrakten weg und nur die Daten in einer von mir definierten Polygonregion importieren. Das funktioniert ebenfalls ohne Probleme, solange ich mit den Daten der Geofabrik arbeite. Ein Beispiel:


C:\Program Files\osmosis\bin>osmosis.bat --read-xml file=C:\osmosis\germany-latest.osm.bz2 --bounding-polygon file=C:\osmosis\bayern.poly --write-pgsql-dump directory=C:\osmosis\20131103_bayern
Jan 15, 2015 10:27:53 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Osmosis Version 0.43.1
Jan 15, 2015 10:27:53 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Preparing pipeline.
Jan 15, 2015 10:27:53 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Launching pipeline execution.
Jan 15, 2015 10:27:53 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Pipeline executing, waiting for completion.
[...]

Mir ist bewusst, dass auf Geofabrik schon ein Bayern Extrakt existiert und dass deshalb das Ausschneiden aus Germany nicht viel Sinn macht. Ich habe das auch nur testweise gemacht um die verwendete Toolchain zu testen. Später will ich wie gesagt auf ein von mir definiertes Polygon umschwenken.

Sobald ich den Germany Extrakt der Geofabrik durch das volle planet.osm File ersetzte, starten die Probleme. Ich bekomme dann einen ‘Unable to parse xml file’ Fehler. Wieso dieser Fehler auftritt, kann ich mir nicht erklären. Sowohl die Extrakte von der Geofabrik als auch das planet.osm File sind im *.osm.bz2 Format, d.h. xml. Für mich deutet das drauf hin, dass es einen Unterschied zwischen den Geofabrik Extrakten und den planet.osm Files auf planet.openstreetmap.org geben muss. Hier der genaue Fehler:


C:\Program Files\osmosis\bin>osmosis.bat --read-xml file=C:\osmosis\planet-141008.osm.bz2 --bounding-polygon file=C:\osmosis\bayern.poly --write-pgsql-dump directory=C:\osmosis\20131103_bayern
Jan 15, 2015 10:34:03 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Osmosis Version 0.43.1
Jan 15, 2015 10:34:03 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Preparing pipeline.
Jan 15, 2015 10:34:03 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Launching pipeline execution.
Jan 15, 2015 10:34:03 AM org.openstreetmap.osmosis.core.Osmosis run
INFO: Pipeline executing, waiting for completion.
Jan 15, 2015 10:34:04 AM org.openstreetmap.osmosis.core.pipeline.common.ActiveTask
Manager waitForCompletion
SEVERE: Thread for task 1-read-xml failed
org.openstreetmap.osmosis.core.OsmosisRuntimeException: Unable to parse xml file C:\osmosis\planet-141008.osm.bz2.  publicId=(null), ystemId=(null), lineNumber=3956, columnNumber=223.
        at org.openstreetmap.osmosis.xml.v0_6.XmlReader.run(XmlReader.java:116)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.xml.sax.SAXParseException; lineNumber: 3956; columnNumber: 223; XML document structures must start and end within the same entity.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
[...]

Der Fehler ‘XML document structures must start and end within the same entity’ tritt unmittelbar nach Start von osmosis auf und wie gesagt nur bei den planet.osm Files. Hat jemand eine Idee, wieso das passiert?

Einen kaputten Download kann ich ausschliessen, denn die MD5 Checksumme meiner lokalen Kopie ist korrekt:

//
// File Checksum Integrity Verifier version 2.05.
//
732620d02e2f14112b65df61120dcc9b c:\osmosis\planet-141008.osm.bz2

Und noch was interessantes: der Fehler tritt sogar noch auf, wenn ich den “–bounding-polygon” Switch weglasse. Das ist für mich insofern verwunderlich, weil doch sicher schonmal jemand mit osmosis einen OSM dump für den Import in Postgres erzeugt hat. Insofern hätte so ein Fehler doch schon längst auffallen müssen.

Die von mir verwendete Java Version ist die folgende:


C:\Program Files\osmosis\bin>java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

Allerdings ist es nach meiner Meinung extrem unwahrscheinlich, dass es an Java liegt. Denn dann dürfte germany-latest.osm.bz2 von der Geofabrik ja auch nicht funktionieren.

Edit:
Einen Unterschied gibts natürlich, nämlich die Größe der Files. Allerdings bringt auch ein ‘set JAVACMD_OPTIONS=“-Xmx16G”’ vor dem Aufruf von osmosis keine Besserung.

Grüße,
Pete.

Kein Problem, bist hier eh besser aufgehoben :wink:

Nur zur Info, daß mer dran sind:

  • Linux
  • anderer Planet
  • anderes Polygon

—> gleiches Problem

Ich meine, ich hätte immer Probleme mit den bz2-Files gehabt.

Bis später
walter

Bingo:


OSMOSIS=/opt/install/osmosis-latest/bin/osmosis

bzip2 -d -c -k /osm/db/import/planet-150105.osm.bz2 | $OSMOSIS --rx /dev/stdin \
	 --bounding-polygon file=/osm/db/test/62718.poly \
	 --write-pgsql-dump directory=/osm/db/test/dump

siehe http://wiki.openstreetmap.org/wiki/DE:Osmosis#Hinweise

Wie die Pipe (|) in Windows geht, wirst du selber rausfinden müssen. Mit dem Backslash \ kann man einen Befehl in mehrere Zeilen schreiben. mach halt eine lange Zeile raus.

Hallo walter,

Ich kann schonmal bestätigen, dass das Vorgehen mittels Pipe (ich benutze 7zip zum Dekomprimieren, da gerade kein bzip2 Executable zur Hand ist) für die Verarbeitungskette Germany → Bayern funktioniert. Für Planet → Bayern habe ich gerade erst das Extrahieren gestartet. Das Positive ist, dass es unmittelbar nach dem Start schonmal zu keinem ‘Unable to parse xml file’ Fehler mehr kommt.

Die Seite mit den Osmosis Hinweisen hatte ich sogar gelesen. Allerdings klingt der Hinweis, die bz2 Dateien separat auszupacken und dann mittels StdIn in Osmosis reinzupipen, für mich optional. Es wird die schnellere Verarbeitung grosser Dateien erwähnt. Ich will erstmal, dass es geht, um Performance kümmere ich mich immer später. Wenns wirklich daran liegt, dann sollte der Text umformuliert werden und für die Verarbeitung grösserer Files die Pipe Methode als der einzig funktionierende Weg hervorgehoben werden.

Grüße,
Pete.

Ich mag nicht glauben, dass es an der Größe liegt. Allerdings bekommt man von planet.openstreetmap.org ja nur den vollen 39GB-Planeten und die relativ kleinen Diffs.

Lass die Pipe so wie sie bei die funzt. Schneller ist sie sowieso.

Gruss
walter

Wahrscheinlich liegts schon an der Dateigrösse. Wenn man sich die Doku der von Osmosis verwendeten API zum bzip2 Archive Handling anschaut (siehe: Package org.apache.commons.compress.compressors.bzip2), dann fällt ins Auge, dass die API mit (32-Bit) int arbeitet. Deshalb behaupte ich mal ganz frech ohne den Code genauer zu analysieren, dass das Parsing Problem in Osmosis ab 4GB Files auftritt.

Grüße,
Pete.

das asia-latest.osm.pbf der Geofabrik ist 5.0 GB groß - no Problem.

Ich klink mich mal aus.

Gruss
walter

Zur Vollständigkeit noch die funktionierende Osmosis Befehlszeile des Imports mittels Pipe Benutzung (Windows):


7z.exe e -so C:\osmosis\planet-141008.osm.bz2 | osmosis.bat --read-xml file=- --bounding-polygon file=C:\osmosis\bayern.poly --write-pgsql-dump directory=C:\osmosis\20131103_bayern

Das 7-Zip Executable habe ich aus dem 7-Zip 9.20 Archiv (Download von dieser Seite).

BTW - erstaunlicherweise benötigt nur der volle Planet die Pipe Methode, kleinere Extrakte funktionieren auch ohne (getestet mit 6GB Asien (siehe oben) und 9GB Nordamerika).

Grüße,
Pete.