BRouter: offline Fahrrad-Routing für Android

Da steht:

Download the file "brouter_0_8.zip" 

Ich finde die nicht. Ixh nehme an, Du meinst http://brensche.de/brouter/BRouter.apk

@abrensch: Vielen Dank für die schnelle Antwort. Nun erscheinte bei uns noch eine andere Meldung "An Error occured: The segments-directory /mnt/sdcard/brouter/segments2 contains no routing data files (*.rd5). see … Habe mir dann die readme.txt Datei mal genauer durchgelesen. Und siehe da. Wer lesen kann, ist klar im Vorteil. Wir mussten noch eine der *.rd5 Dateien extra herunterladen. Jetzt sollte alles supi funktionieren. Besten Dank.

Da redest Du jetzt jetzt aber von Fahrrad-Navigation? Ich glaub bei Auto-Navigation sind die Marktführer schon noch einen Schritt weiter.

Bei OsmAnd ist vieles noch nicht gelöst, nur in dem Fall kann es schlicht nichts mit unzureichenden OSM-Daten zu tun haben, weil OsmAnd an dieser Stelle die OSM-Daten überhaupt nicht nutzt, sondern ausschliesslich den berechneten Track verwendet.

Ich denke in der Tat, dass es genau hier den Preis zu gewinnen gibt. Wie schon gesagt, ich experimentiere zur Zeit mit der Integration in OsmAnd und beutzte dazu BRouter als Online-Dienst. Habe mir dazu OsmAnd so gepatched, dass es meinen Server kontaktiert statt den des konfigurierten Dienstes und einen gesonderten Dienst auf dem Server gestartet. Die automatischen Neuberechnungen sind schon ein echter Vorteil. Wenn ich das jetzt noch so hinkriege, dass es komplett offline läuft, langstreckenfähig und voll konfiguriertbar ist (=Profil + nogo-Areas), dann wäre das schon nicht schlecht, wenn da nicht diese grottenschlechten Sprachansagen wären.

Und da denk ich drüber nach, ob man nicht als ersten Schritt zur Integration zunächst mal den Neuberechnungstrigger und die Sprachausgaben in BRouter abbilden kann und damit erstmal die “Hemdentaschen-Navigation” brauchbar kann. Und ob man dann noch selbst eine offline-Karte rendert oder eine definierte Schnittstelle zu maptools baut, die das übernehmen, würde sich dann schon ergeben.

Wow! Das hört sich sehr vielversprechend an :).

Hallo,
leider reichen meine Kenntnisse nicht aus um Brouter mit Oruxmaps zu verbinden.
Gelingt mir die Speicherung der Webseite am PC, verzweifel ich damit am
Android Tablet.
Wie so wir nicht einfach eine GPX Datei heruntergeladen wenn man bei der
Onlinerversion das entsprechende Feld anklickt?

edit:

Ich kann mittlerweile meine Frage selbst beantworten.

Erzeugen der Textseite aus der Online Version von Brouter mit Firefox.
Alles markieren durch längeres Drücken auf das Textfeld.
Kopieren durch längeres drücken auf das Textfeld.
Einen Texteditor öffen, hier Office Suite Pro, drücken auf leeres Textfeld, der Text wird eingefügt.
Speichern als txt Datei.
Umbenennen mit einem File Explorer in *.gpx
Die GPX Datei mit Oruxmaps öffnen.

Es wäre toll wenn das etwas einfacher funktionieren würde.
Danke an das tolle Programm an den Autor.
jörg

Heute habe ich die Version 0.9 veröffentlicht, die grundsätzlich das neue Location-Matching verwendet. Und es ist auch nicht mehr spürbar langsamer.

Es werden also Wegpunkte jetzt immer so zu Wegen gematched, dass der nächstgelegene Weg verwendet wird, der im Routing-Profil erlaubt ist.

Klingt wie ein unwesentliches Detail und ist es auch, wenn man die Wegpunkte selber setzt, aber für die Integration in ein Navigationssystem mit automatischer Neuberechnung ist es natürlich ganz wesentlich.

Und ich betreibe auch schon einen Online-Service und wer’s probieren will und hacken kann, kann ja mal in OsmAnd die URL für yournavigation durch meine ersetzen, damit OsmAnd solche URLs ruft:

http://h2096617.stratoserver.net:7777/brouter?format=kml&flat=49.565883&flon=8.799297&tlat=49.563606&tlon=8.811764&v=motorcar&fast=1&layer=mapnik%20HTTP/1.1

Super Arndt.
Wenn du mir jetzt noch verraten tust, welche Datei man in Osmand hacken muß, wo sie zu finden ist und welche Zeile durch was zu ersetzen ist.LG Volker

Suche mal nach “www.yournavigation.org/api/1.0/gosmore.php?format=kml” in den Java-Dateien und ersetze das durch “h2096617.stratoserver.net:7777/brouter?format=kml”.

Ich bin wieder einen schönen Schritt weiter, indem ich diesen “Online-Dienst” auf dem Telefon laufen lasse, womit es dann natürlich ein Offline-Dienst wird, aber das ist ja mein Ziel, eine voll-konfigurierbare Offline-Lösung zu schaffen, weshalb ich über diese Online-Spielereien auch garnicht so viel reden wollte. Insbesondere die Möglichkeit, in einem integrierten Routing mit automatischer Neuberechnung auch Sperrgebiete zu berücksichtigen hatte ich vorher nicht. Das geht jetzt.

Das ist schon ganz cool, und ich habe dazu dier Version BRouter 0.9.1 deployed, die diesen Android Dienst startet. Der notwendige Patch zu OsmAnd ist aber leider immer noch nur Hackern zugänglich, funktioniert wie oben beschrieben, nur dass es statt “h2096617.stratoserver.net:7777” dann “localhost:17777” heisst, damit OsmAnd auf einen lokal laufenden Service zugreift.

Ich habe selber von einem cleveren User eine Anleitung bekommen, wie man den Patch mit dem “apktool” hinkriegt, ohne OsmAnd wirklich von den Sourcen bauen zu müssen.

Ich würde ja gerne ein gepatches OsmAnd APK zur Verfügung stellen, aber das lässt die Lizenz wohl nicht zu.

Das mit dem Offline interface ist ein “uraltes” Thema (alt gemessem am Tempo der Entwicklung auf diesem Feld), siehe hier:

https://groups.google.com/forum/?fromgroups#!topic/osmand/paCDL5_xHkk

https://groups.google.com/forum/?fromgroups#!msg/osmand/CTwTvlKSHKQ/Bz98kmpxxD0J

Und das Thema ist auch noch nicht zu Ende, ein “entgültiges” Offline-Interface, was dann auch in die OsmAnd releases eingehen könnte, braucht sicher noch bisschen Hirnschmalz, und insbesondere die schnelle, partielle Neuberechnung, die ich unter dem Zwiten dieser Links mal beschrieben hatte, die muss ich jetzt endlich mal machen.

Hallo,

darf ich mal kurz dazwischen funken?

Kann man den BRouter nicht unter Verwendung der “INTENTS” -Schnittstelle mit OruxMaps “verheiraten”. Da steht zum Beispiel im Manual unter anderem folgendes:

OruxMaps INTEGRATION

…You can also show a route based on a set of points and / or waypoints:
//Offline map on current position
//Intent i = new Intent("com.oruxmaps. VIEW_MAP_OFFLINE ");
//Online map
Intent i = new Intent(“com.oruxmaps.VIEW_MAP_ONLINE”);
//Waypoints
double[] targetLat = {33.4,8.3,22.2};
double [] targetLon = {33.4,8.3,22.3};
String [] targetNames = {“point alpha”,“point beta”};
i.putExtra(“targetLat”, targetLat);
i.putExtra(“targetLon”, targetLon);
i.putExtra(“targetName”, targetNames);
//Track points
double[] targetLatPoints = {33.43,8.32,22.24};

Ich habe aber keine Ahnung was Intents sind. Mit diesen kann man wohl ein Programm von einem anderen Programm fernsteuern, falls ich das richtig verstanden habe. Eventuell kann man dort im Forum erforderliche Intents vorschlagen, um BRouter nahtlos zu integrieren

…oder liege ich da voll daneben?
…dann SORRY…

Viele Grüsse
Achim

Nein, genau richtig. Es geht darum, die HTTP-Schnittstelle durch eine zu ersetzen, die zum Android Programmiermodell passt. Intents sind dabei nur die Nachrichten samt Empfaengeradresse, die da ausgetauscht werden, eine Schnittstelle wäre z.B. ein “Bound Service”. Hat gegenüber meine jetztigen Implementierung auch so Vorteile, dass man den Dienst nicht starten muss (sondern das macht der anfragende Client implizit) und dass man einen Auswahldialog bekommt, wenn es mehrere Implementierungen für einen angefragten Dienst (hier: Routenberechnung) gibt. Aber ich bin da noch im unteren Teil der Lernkurve…

Gruss, Arndt

PS: tolle E-Bike Runde heute durch den Odenwald, 60km/600 Höhenmeter und ich hab’s vorher gewusst und der Akku hat gehalten :slight_smile:

Kein Glück hier mit dem Server-Mode auf Android, BRouter schmiert nach wenigen Sekunden mit “BRouter angehalten” und irgendeiner NullPointerException bei RouterService onStart-irgendwas ab (sieht man nur in logcat, andere Log-Dateien habe ich vergeblich gesucht). Beim Start kommt zunächst noch eine Liste, in der man ein Profil auswählen kann, dann eine Meldung, dass keine from/to-Knoten für Locus definiert wurde. Hier wähle ich “Server-Modus”. Es erscheint eine kurze Meldung dass der Server-Modus gestartet wurde, dann folgt recht schnell der Absturz. Keine Ahnung, was da los ist, bei mir funktioniert es jedenfalls nicht.

Also ich habe gestern mal versucht, die Zeile zu ersetzen. Ich weiß nicht mal, wo ich nach was für einer Datei ich suchen muss.

Kann man nicht ein kleines Programm schreiben, was die Zeile ersetzt. Ähnlich wie Map Tweak für Locus https://play.google.com/store/apps/details?id=com.mjk.locusmaptweak&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5tamsubG9jdXNtYXB0d2VhayJd

Es geht um diese Zeile in der Klasse RouteProvider. Das Kompilieren von Quellen ist hier recht detailliert beschrieben. Ich gehe mal davon aus, dass du dir das freiwillig nicht antun willst.

Nein nicht wirklich.

Ich habe eigentlich keine Ahnung von Android. Deswegen kann ich auch nicht beurteilen, was dieser MapTweak bei Locus wirklich macht. Die Frage ist, ob man das Kompilieren nicht mit einer Art Patch umgehen könnte. Denn bei jeder Verionsänderung von Osmand neu zu kompilieren, ist auch nicht sehr produktiv.

Eigentlich dachte ich mir, ich müsste eine Datei auf meinem Telephon mit einem Texteditor öffnen und umschreiben. Mir war/ist unklar, wo die Datei überhaupt zu finden wäre. Also ähnlich wie bei Windows die EXE-Dateien.

In einer APK-Datei (die eine ZIP-Datei ist und nur anders heisst) sind die compilierten Java-Klassen alle in der Date “classes.dex” in übersetzer Form enthalten. Es gibt mächtige Tools, um APKs zu modifizieren, die “classes.dex” zu disassemblieren in so einer Art Assembler-Code ( “smali”-Dateien, die man lesen und verändern kan), das ganze wieder zu re-assemblieren und anschliessend neu zu signieren.

(Einfach mal googeln nach "apktool, smali, baksmali, APK Manager 5.0.2 und so)

So in der Art hatte ich das gemacht. Das ist zwar eine nette Spielerei, aber es lohnt sich nicht, irgendwas geht dann doch immer nicht.

Ich muss jetzt einfach mich doch mal durchbeissen, den OsmAnd Source-Build hinbekommen, ein vernünftiges Interface entwickeln und als GIT-Pull-Request ins OsmAnd Release bekommen. Victor sperrt sich ja nicht, obwohl das ja zu befürchten wäre, dass sie OsmAnd abschotten wollen gegen externe Router, aber ich glaube, das ist nicht der Fall, also mach ich’s jetzt einfach richtig, dauert halt nur noch bisschen.

Schaust Du dir die NullPointerException in Post #97 noch an, brauchst Du noch mehr Details? Ich hatte 3-4h für einen funktionsfähigen OsmAnd Source-Build investiert, nur um dann festzustellen, dass BRouter bei mir nicht im Server-Modus läuft. Wirklich sehr ärgerlich, dabei wollte ich den Router doch gerne mal testen.

Hallo Arndt,

planst du auch eine nahtlose Integration in OruxMaps mit Hilfe der Intents ? OSMAND hat ja schon ein Routing drin, was aber bei OruxMaps noch (?) fehlt. Da wäre der BRouter eine wirkliche sinnvolle Ergänzung.

Viele Grüsse
Achim

Ich komme erst am Sonntag wieder dazu.

Hast Du denn einen Stacktrace? Und welche Android Version? Bei mir läuft es auf 2.3.6 stabil, während ich bei 4.0.1 eher mal eine vorzeitgen Dienst-Stop kriege, was aber nicht wirklich ein Fehler ist, weil Android darf das.

Ich hab’ Dir einen Download-Link geschickt für die BRouter-Sourcen, vielleicht magst Du’s ja selber mal im Debugger laufen lassen. Der Dienst, um den es geht, ist in der Klasse BRouterService.

Ich könnte den folgenden Stacktrace anbieten, den ich mit adb logcat eingesammelt habe. Vielleicht ist das einfach irgendein dummer Folgefehler, weil irgendwas in meiner Umgebung nicht stimmt oder vergessen wurde zu installieren und damit RouteServer nicht sauber instantiiert werden konnte? Leider habe ich ansonsten keine Meldung gefunden, die mich weitergebracht hätte. Getestet hatte ich BRouter mit Android 4.1.2.


/dalvikvm(30137): threadid=1: thread exiting with uncaught exception (group=0x40d412a0)
E/AndroidRuntime(30137): FATAL EXCEPTION: main
E/AndroidRuntime(30137): java.lang.RuntimeException: Unable to start service btools.routingapp.BRouterService@41a27468 with null: java.lang.NullPointerException
E/AndroidRuntime(30137): 	at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2548)
E/AndroidRuntime(30137): 	at android.app.ActivityThread.access$1900(ActivityThread.java:140)
E/AndroidRuntime(30137): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324)
E/AndroidRuntime(30137): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(30137): 	at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(30137): 	at android.app.ActivityThread.main(ActivityThread.java:4898)
E/AndroidRuntime(30137): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(30137): 	at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(30137): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
E/AndroidRuntime(30137): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
E/AndroidRuntime(30137): 	at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(30137): Caused by: java.lang.NullPointerException
E/AndroidRuntime(30137): 	at btools.routingapp.BRouterService.onStartCommand(BRouterService.java:42)
E/AndroidRuntime(30137): 	at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2531)
E/AndroidRuntime(30137): 	... 10 more

Mail geht übrigens am besten über OSM Nachricht senden, den Forum-Mailer habe ich nicht aktiv.