osmosis

Hallo,

ich habe ein kleines (großes) Problem mit Osmosis. Leider lässt sich osmosis auf meinem System nicht ausführen. Ich erhalte immer die folgende Fehlermeldung, wenn ich Osmosis ausrufen möchte. http://pastebin.com/m6d38c36c Die Fehlermeldung scheint mir ja recht umfangreich zu sein, aber leider sagt sie mir überhaupt nichts, da ich von Java keinen Dunst habe. Bin für jeden Tipp in die richtige Richtung dankbar!

Als OS nutze ich übrigens Ubuntu 9.10 in der 64Bit Version.

Grüße

Telegnom

Ein paar weitere Hinweise wären nicht schlecht: Osmosis-Version, eingegebene Befehlszeile, installierte Java-Version?

Ansonsten, aufgrund der Fehlermeldung könnte es sein, dass Osmosis eines seiner zugehörigen Plugins (vermutlich das Plugin “jpf-1.5.jar” mit der Erweiterung “PluginLifecycleException”) nicht findet. Dieses und andere Plugins (weitere “jar”-Dateien) sollten sich entweder im Unterordner “lib” oder im Unterordner “lib/default” des Omsosis-Verzeichnisses (kann je nach Version wohl variieren) befinden. Das sollte als erstes geprüft werden.

Bei Osmosis-Versionen ab 0.30 reicht es aufgrund dieser Plugins daher nicht mehr aus, einfach Java mit der “osmosis.jar”-Datei aufzurufen. Dann findet Osmosis obige Plugins nicht. Deshalb sollte man Osmosis über die Batch-Datei “osmosis” im Unterordner “bin” aufrufen, welche entsprechend erweitert ist.

Da ich selbst Windows nutze, kenne ich die Details der “osmosis”-Batchdatei für Linux allerdings nicht (sollte man erst in das “bin”-Verzeichnis wechseln oder nicht(?), muss man Anpassungen vornehmen(?), … keine Ahnung). Zumindest für Windows ist die dazugehörige Batch-Datei “osmosis.bat” nämlich oft fehlerhaft, so dass es sich da wiederum vielfach anbietet, Osmosis doch direkt zu starten, was aber eine ellenlange Befehlszeile erfordert. Ob die Batch-Datei “osmosis” für Linux da ähnlich problematisch ist, weiß ich nicht. Dies nur schon mal als Vorwarnung, wenn es nicht klappt.

Hallo,

die Java-Version ist: java version “1.6.0_15”
Java™ SE Runtime Environment (build 1.6.0_15-b03)
Java HotSpot™ 64-Bit Server VM (build 14.1-b02, mixed mode)

Version von osmosis ist 0.32

Auf den Aufruf habe ich leider keinen Einfluss da es aus einem Programm heraus aufgerufen wird.

Ok, die Java-Version sollte ok sein.

Als erstes wäre es interessant zu wissen, wie im Detail “Dein” Programm Osmosis aufruft. Lässt sich das irgendwie herausfinden oder protokollieren?

Java verwendet bei der Suche nach Dateien/Klassenbibliotheken die Variable CLASSPATH als Suchpfad, d.h. alle in jener Variablen angegebenen Verzeichnisse werden bei Java-Aufrufen nacheinander durchsucht. In jenen Suchpfad müssen die Osmosis 0.32-Klassendateien aus “lib/default” aufgelistet sein (ggf. reicht auch der Verzeichnisname aus). Standardmäßig ist das nicht der Fall, daher muss CLASSPATH entsprechend erweitert werden.

  • Entweder nimmt “Dein” übergeordnetes Programm eine entsprechende Änderung schon vor. Dann stimmen vielleicht nur die Unterordner nicht. Ggf. mal alle Dateien aus “lib/default” nach “lib” kopieren, falls das Programm statt “lib/default” nur “lib” nutzt.

  • Ggf. wird das übergeordnete Programm über ein Skript gestartet, wo man den CLASSPATH anpassen muss. Jener muss für Osmosis um

%MYAPP_HOME%\osmosis.jar;%MYAPP_HOME%\lib\default\aopalliance-1.0.jar;%MYAPP_HOME%\lib\default\bzip2-20090327.jar;%MYAPP_HOME%\lib\default\commons-dbcp-1.2.2.jar;%MYAPP_HOME%\lib\default\commons-logging-1.1.1.jar;%MYAPP_HOME%\lib\default\commons-pool-1.3.jar;%MYAPP_HOME%\lib\default\jpf-1.5.jar;%MYAPP_HOME%\lib\default\mysql-connector-java-5.1.10.jar;%MYAPP_HOME%\lib\default\postgis-1.3.2.jar;%MYAPP_HOME%\lib\default\postgresql-8.3-603.jdbc4.jar;%MYAPP_HOME%\lib\default\spring-beans-2.5.6.SEC01.jar;%MYAPP_HOME%\lib\default\spring-context-2.5.6.SEC01.jar;%MYAPP_HOME%\lib\default\spring-core-2.5.6.SEC01.jar;%MYAPP_HOME%\lib\default\spring-jdbc-2.5.6.SEC01.jar;%MYAPP_HOME%\lib\default\spring-tx-2.5.6.SEC01.jar;%MYAPP_HOME%\lib\default\stax2-api-3.0.1.jar;%MYAPP_HOME%\lib\default\woodstox-core-lgpl-4.0.3.jar;%MYAPP_HOME%\lib\default\commons-codec-1.4.jar

erweitert werden (%MYAPP_HOME% ist durch das Osmosis-Basisverzeichnis zu ersetzen, obiges ist von der Windows-Version kopiert, bei Linux wären die Schrägstriche logischerweise andersherum). Und ja, das ganze ist so lang. CLASSPATH lässt sich eleganter im Skript über eine Schleife anpassen. Ansätze bietet das Osmosis-Aufrufskript (siehe “bin/osmosis”). Meine Linux/Unix-Skript-Kenntnisse habe ich aber seit Jahren nicht mehr genutzt. Ggf. reicht auch eine Erweiterung von CLASSPATH um das Verzeichnis "%MYAPP_HOME%\lib\default" aus.

  • Außerdem muss irgendwie bewirkt werden, dass bei Osmosis 0.32 die Klasse “org.openstreetmap.osmosis.core.Osmosis” gestartet wird. Das könnte bei Dir aber schon der Fall sein, sonst käme wohl eine andere Fehlermeldung.

  • Eine anderer Ansatz wäre, einmal die ältere Osmosis-Version 0.29.5 aus zu probieren. Jene ist die letzte Version mit einfacherer Aufruf-Syntax, die trotzdem schon die aktuelle OSM-API 0.6 unterstützt. Auf der Osmosis-Seite (http://bretth.dev.openstreetmap.org/osmosis-build/) scheint es jene nicht mehr zu geben, eventuell vielleicht noch woanders (bei mir heißt die Datei “osmosis-0.29.5.zip”)? Ansonsten könnte ich diese auch nach Nachricht an meinen OpenStreetMap-Account (Ebbe73) per Mail zusenden.

Vielleicht weiß jemand was viel einfacheres??? So vollkommen eindeutig sind Osmosis-Fehlermeldungen ja doch nicht.

Hallo,

danke erstmal an Ebbe73 für seine ausführlichen Ausführungen. Das Script mit dem Osmosis aufgerufen wird ist dieses: http://svn.openstreetmap.org/applications/utils/sv-stat/SV-Stat.pl

Ich habe mal versucht osmosis über die bin/osmosis aufzurufen. Das funktioniert. Leider wird Osmosis in diesem Script direkt über die .jar Datei aufgerufen. Ich habe zwar versucht es auf die bin/osmosis zu Ändern, aber leider ohne Erfolg!

Grüße

Telegnom

Da sollte sich das Skript aber anpassen lassen. Den Java-Suchpfad kann man entweder, wie beschrieben, über die Variable CLASSPATH setzen oder man muss alles vollständig in der Java-Befehlszeile übergeben.

Allgemeiner Java-Aufruf:
java -cp

Entsprechend kann man auch den Aufruf im Perl-Skript ändern. Ich habe das mal kurz gemacht, ohne es aber selbst testen zu können(!). Die neue Variable “$osmosisclasspath” im Skript muss ggf. noch an die eigene Verzeichnisstruktur angepasst werden. Momentan geht diese davon aus, dass sich osmosis.jar im aktuellen Verzeichnis (also “.”) befindet und die anderen .jar-Dateien von Osmosis im Unterverzeichnis “./lib/default” unterhalb des aktuellen Ordners.

Ich hoffe, ich habe als Nur-Sporadisch-Windows-Skript-Bearbeiter, Nicht-Programmierer, Nicht-Perl-Kenner und Nicht-Linux-Nutzer nichts vergessen und keine Schnitzer eingebaut. :wink: Das Perl-Skript ist ansonsten übrigens recht alt. Funktioniert das überhaupt grundsätzlich noch mit der aktuellen OSM-API?

Kann man hier keine Dateien anhängen? Ok, dann packe ich die geänderten Teiles des SV-Stat.pl-Skriptes hier mal unten drunter. Das ist zwar nicht sehr professionell, sollte aber für ein Copy&Paste reichen:

Geänderter Skriptanfang:

#!/usr/bin/perl -w

Test für Osmosis ab 0.30, Ebbe73, 2009-12-22

Variablen $osmosisclasspath und $osmosismainclass ergänzt

Variable $osmosisjar entfernt

use vars um $osmosisclasspath und $osmosismainclass ergänzt, $osmosisjar entfernt

keine Ahnung, ob das so richtig ist, kenne Perl nicht näher

entsprechende zwei Aufrufe im Skript angepasst

“-jar”,$osmosisjar durch “-cp”,$osmosisclasspath,$osmosismainclass ersetzt

ergänzt Perl die Leerzeichen dazwischen automatisch?

use utf8;
use Time::Local;
use Text::LevenshteinXS qw(distance);
use XML::Parser;
use strict; # geht leider noch nicht
use vars qw($ort $ortURL $ortHTML $bundesland $pw_schutz
$standdate $csvSpalteStr $csvSpalteOrt
$osmosis_source $osmosis_polygon
$osmosis_minLat $osmosis_maxLat
$osmosis_minLon $osmosis_maxLon
$bildSource $bugWikiText $bugWikiURL
$csvSeperator $nutzungsErlaubnis $printBild
$java_bin $osmosisclasspath $osmosismainclass
$debug $autocoordinaten
$nutzeLeisurePark
$strip_dash_names $link_unknown
$bzip2_bin
);
$java_bin=“/usr/local/java/jre1.6.0_05.amd64/bin/java”;
$osmosisclasspath=“./osmosis.jar;./lib/default/bzip2-20090327.jar;./lib/default/commons-logging-1.1.1.jar;./lib/default/jpf-1.5.jar;./lib/default/mysql-connector-java-5.1.10.jar;./lib/default/postgis-1.3.2.jar;./lib/default/postgresql-8.3-603.jdbc4.jar;./lib/default/stax2-api-3.0.1.jar;./lib/default/woodstox-core-lgpl-4.0.3.jar”;
$osmosismainclass=“org.openstreetmap.osmosis.core.Osmosis”
$bzip2_bin=“/bin/bzip2”;

<<<<<<

Geänderter Osmosis-Abschnitt im Skript:

############################################################################

Osmosis

############################################################################
my @osmosiscmd=();
my $zuschnittStr=“”;
if (defined($osmosis_source)) {
my $doit=0;
if (-f “$ortURL.osm.bz2”) {
my @statsource=stat($osmosis_source);
my @statdestination=stat(“$ortURL.osm.bz2”);
$doit=($statsource[9]>$statdestination[9]);
if ($doit==0) {
print “do not run osmosis: Source is older than Destination\n” if $debug;
}
} else {
$doit=1;
}
if (defined($osmosis_minLat)) {
defined($osmosis_maxLat) or die(“osmosis_maxLat not defined”);
defined($osmosis_maxLon) or die(“osmosis_maxLon not defined”);
defined($osmosis_minLon) or die(“osmosis_minLon not defined”);
(-f $osmosis_source) or die(“Osmosis Source $osmosis_source not found”);
@osmosiscmd=($java_bin,“-cp”,$osmosisclasspath,$osmosismainclass,
“–rx”,“file=$osmosis_source”,
“–bb”,
“top=$osmosis_maxLat”,
“bottom=$osmosis_minLat”,
“left=$osmosis_minLon”,
“right=$osmosis_maxLon”,
“–wx”,“file=$ortURL.osm”);
$zuschnittStr=“Der Zuschnitt erfolgte durch die Koordinaten: ($osmosis_minLat,$osmosis_minLon),($osmosis_maxLat,$osmosis_maxLon).”;
} elsif (defined($osmosis_polygon)) {

@osmosiscmd=($java_bin,"-cp",$osmosisclasspath,$osmosismainclass,
	     "--rx","file=$osmosis_source",
	     "--bp","file=$osmosis_polygon",
	     "--wx","file=$ortURL.osm");
$zuschnittStr="Der Zuschnitt erfolgte durch das Polygon: <a href=\"$osmosis_polygon\">$osmosis_polygon</a>.";
my @cmd=("/bin/cp",$osmosis_polygon,$ortURL."/");
system(@cmd)==0 or die;
} else {
die("osmosis_source is defined but no lat/lon or poly");
}
if ($doit==0) {
@osmosiscmd=();
}

}
if ($#osmosiscmd>-1) {
if (-f “$ortURL.osm.bz2”) {
print “rm $ortURL.osm.bz2\n” if $debug;
unlink(“$ortURL.osm.bz2”);
}
print join(" “,@osmosiscmd),”\n" if $debug;
system(@osmosiscmd)==0 or die(“Osmosis died with exit code: $?”);
# Bzip
my @bzipcmd=($bzip2_bin,“$ortURL.osm”);
print join(" “,@bzipcmd),”\n" if $debug;
system(@bzipcmd)==0 or die(“Bzip2 died with exit code: $?”);
}

############################################################################

<<<<<<

Hallo,

vielen Dank für deine Mühen! Ich werde es nachher testen und dann berichten.

Grüße

Telegnom

Hallo Ebbe73,

entschuldige bitte meine späte Antwort! Leider hatte ich vorher keine Zeit, die Modifikationen zu testen. Aber ist bin vollkommen begeistert! Alles funktioniert wie es soll! HERZLICHEN DANK!

Telegnom

Hallo,

bei mir hat es genügt, osmosis ohne Manipulation des Scripts über einen symbolischen Link von jedem beliebigen Verzeichnis aus aufrufbar zu machen: Gesamten Inhalt des entpackten osmosis-0.32 z.B. ins Homeverzeichnis nach .osmosis verschieben und mittels
“sudo ln -s ~/.osmosis/bin/osmosis /usr/local/bin/osmosis”
einbinden. Der Link befindet sich dann ganz normal in den Umgebungsvariablen des Systems.

Passend zum Thema vielleicht noch ein Tipp: Der Download und das Ausschneiden lässt sich, wenn man keine weiteren Bereiche benötigt, in einem Rutsch erledigen (spart die Zeit für das Entpacken der OSM-Daten und das Ausschneiden eines Bereiches). Dazu müssen die gedownloadeten Daten in die Pipe geschoben und über die Pipe mit bzcat entpackt an osmosis weitergereicht werden. Zum Beispiel für Europa von der Geofabrik, rechteckiger Bereich etwas größer als Deutschland:
“wget -O - http://download.geofabrik.de/osm/europe.osm.bz2 | bzcat | osmosis --read-xml enableDateParsing=no file=/dev/stdin --bounding-box top=55.3 left=5.6 bottom=45.8 right=18.9 --write-xml file=area.osm”
Nicht übersehen werden darf dabei der zweite Parameter (der unauffällige Bindestrich).

Grüße
Garmin-User