BRouter: offline Fahrrad-Routing für Android

Hmm, schade. Das sollte man ändern. Ein neues Tag/Attribut dafür?
Bahntrassen haben einen ganz besonderen Character, die sie von anderen Radwegen unterscheidet.
Die sind eben nicht entlang der Hauptstraßen, sondern mitten in der Landschaft.
Steigungen im Mittelgebirge werden durch Tunnel und Viadukte unterdrückt.

Die Attraktivität für Radfahrer ist also besonders hoch, gerade wenn man noch einen Kinderanhänger ziehen muss.

Meinst du den BRouter könnte man als Plugin in OsmAnd integrieren,
so dass er wie der eingebaute Router fungiert ?
Also incl. Routen-Neuberechnen, wenn man mit Absicht von der berechneten Route abweicht
(bei mir sehr typisch).

Damit kann man sich im Android-Market auch noch ein paar Euros dazuverdienen.
Du wirst schon reich, wenn nur ein Bruchteil der weltweiten Population (1 Mrd.?)
mit Android-Smartphone und Fahrrad jeweils ein paar Euros für das Plugin geben würden.
Sehr viel Konkurrenz hast du bei Profil “Rad” nicht. Man muss nur eben besser sein.
Fürs Auto ist mein kommerzielles Navi besser und darum nutze ich das dort exklusiv.

Genau das hab ich längst gemacht und so benutze ich das auch fast täglich:

Bei dem Pull-Request bin ich mir aber mittlerweile nicht mehr so sicher, ob Victors Bedenken wirklich technisch motiviert sind oder ob er einfach nicht will.

Hallo

ich habe den BRouter mit dem MapsforgeSwingMapviewer “verheiratet”. Ein Tester hat den Router jetzt mal in den Schweizer Alpen “vergewaltigt”. Routet man jetzt auf einer Bergstrecke in kurzen Abschnitten geht der Router irgenwann zurück auf eine “weit” abliegende Nebenstrasse…

Meine Frage ist nun: Läßt sich der BRouter auch so konfigurieren (vergewaltigen?) dass er auch auf Wanderpfaden (Bergpfaden) die kürzeste Route sucht. Egal welche Wege/Pfad Beschaffenheit vorhanden ist. Ich weiß, e soll ja ein Fahrradrouter sein. Ich bin in dieser Richtung auch zufrieden.

Zusammenfassung: Ist es möglich,den BRouter so zu konfiguriern dass er den kürzesten Wegt such unabhängig von Steigung und Wegbeschaffenheit ?
Hintergrund: WanderRouten in den Bergen…

Das sollte mit dem shortest Profil schon jetzt ohne weiteres funktionieren, wenn man nicht auch Privatwege und gesperrte Wege benutzen will.

Hallo schiki,

leider nicht! Hab ich schon probiert. Auf meinem Testpfad routet die ReitWanderKarte diesen Pfad problemlos…

Hallo womisa,

das wäre dann ein Fall für eine Rückmeldung im OSM-Android-Bike-Routing Forum bei Google. Evtl. sind auch nur die Routing-Daten veraltet.

Ich hab’ das mal in den östereichichen Alpen gesehen, dass eine Wintersperre für den Pass als access=no für ein kurzes Stück der Passstrasse eingetragen war. Was dann natürlich dazu führt, dass der Router irgendwelche noch unpassierbareren Wanderrouten findet.

Sowas kann man patchen, indem man access=no einfach rausnimmt, also aus “or access=private access=no” einfach nur “access=private” macht

Hallo

vielen Dank für die Antworten. Ich habe mal ein Snapshot gemacht (Zentrum ca. 46.53;8.37) geroutet wurde vom 1. roten Punkt zum 2. roten Punkt und dann sollte zum 3 . roten Punkt geroutet werden, aber dann kommt die Blaue Nebenlinie ohne roten Endpunkt…
Ich habe den “shortest.brf” genommen und die Routingdateien sind neu.

siehe da: http://augilabs.de/swingmapViewer/bilder/Oberwald.jpg

Wie schon beschrieben die http://www.wanderreitkarte.de/ routet das problemlos. Die Kartenbasis (OSM) müßte doch gleich sein, oder?.

ich habe das geändert:

zeile 23: switch or access=private acces=no geändert: switch or access=private
zeile 65: switch or access=private acces=no geändert: switch or access=private

dan kommt aber ein Fehler:

Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: ParseException at line 30: assign operator within expression
at btools.expressions.BExpressionContext.parseFile(BExpressionContext.java:470)
at btools.router.RoutingEngine.(RoutingEngine.java:78)
at womisa.brouter.BRouter.findROUTE(BRouter.java:25)
at org.mapsforge.map.swing.controller.MouseEventListener.mouseClicked(MouseEventListener.java:119)
at java.awt.Component.processMouseEvent(Component.java:6508)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Na, ich wollte meine Original-Version nicht deinstallieren. Die ist mittlerweile bei Version 1.6.5 und dein
Binary wäre ein Downgrade auf 1.6.1. Dazwischen hat sich laut Release-Notes das Format der Kartendateien geändert.
Die kommen jetzt auch von einem neuen Server (hatte ich schon bei mir aufgespielt):
http://new.osmand.net/list.php

Die Java-Version läuft auf meinem billigen Samsung-Smartphone (lahme CPU, wenig RAM) extrem langsam.
Mit den native Libs (C++) ist das erträglicher. Der Kartenaufbau könnte natürlich flotter sein, aber es sind
eben auch viele Objekte drin (Detailmodus ist aktiviert). Einmal hatte ich aus Versehen die Java-Version drauf,
da wegen Speichermangel die “Link to SD-Card” Funktion fehlerhaft war, OsmAnd dann die native Libraries
wohl nicht finden konnte. Mein interner Flash-Speicher ist nur 150 MB. Darum muss ich alles auf eine
ausgelagerte Partition der 32 GB µSD-Karte verlinken.

Also Brouter benimmt sich dann genauso wie der Interne Router? Der merkt relativ schnell, wenn ich der Route nicht folge,
und berechnet dann ohne Nachfrage oder Benutzerinteraktion gleich die neue Route.

Soll das denn wirklich ein OsmAnd-Plugin werden? Die stehen unter “Zusatzmodule”.
Dein Download ist ja kein Plugin, sondern eine gepatchte Version von OsmAnd selbst.
Der Unterschied beim Plugin wäre, dass man immer die Updates der Originalversion bekommt,
auch wenn sich das BRouter-Plugin nicht geändert hat.

Interessant. Willst du den zum Download anbieten?

Ich suche schon länger eine Offline-OSM-Karte, z.B. für den Laptop, wenn man mal kein Netz hat.
Am liebsten hätte ich den OsmAnd auf dem Laptop, aber das geht bisher nur umständlich in einer Android VirtualBox.
Eben mit den Funktionen, nach POI auf der Karte zu suchen oder Routen berechnen zu lassen.
Kann man mit dem Mapsforge Viewer auch nach POI suchen? Die Kombination ist sehr praktisch
(“kürzester Weg zur nächsten Pizzeria” oder so).

Hallo

das ist aus verschiedenen Tools mit “heißer Nadel” und nicht all zu vielen Java Kenntnissen zusammengestrickt. Suchen nach POIS lokal wüßte ich derzeit nicht wie man das machen sollte…?
Nehme da aber gerne Anregungen entgegen.
Das GANZE ist noch sehr BUGGY und bei der Bedienung nicht stabil genug für “Jedermann” und die “Inbetriebnahme” an Randbedingungen wie Karten, RenderThemes, Routingfile etc. geknüpt, deshalb möchte ich das nicht publizieren. Außerdem weiß ich nicht wie das mit den Urheberechten von Mapsforge, BRouter, GPXCreator ist.
Mein Beitrag dabei ist kein Geheimnis. Ich bin aber selbst erstaunt, wie man mit Klick,Klick,Klick eine Route auf eine Vektorkarte via BRouter (Mapsforge,Openandromap, Freizeitkarte) erstellen kann.
Gedacht ist das für meine Routenplanungen auf dem Desktop um dies dann auf das Smartphone zu übertragen. Ich verwende derzeit Oruxmaps.

Ok. Verstehe ich. Kannst du denn andere Offline OSM-Kartenprogramme empfehlen?
Ich suche schon länger nach einer Alternative zu Google Earth auf OSM-Basis,
zum schnellen Anschauen der Karte (Earth ist bei mir viel flotter und flüssiger als WWW-basierte Apps),
und zum Annotieren (drübermalen von Polygonen, Tracks, Fähnchen, Textkommentar, Flächen markieren,
Austausch der Overlay-Objekte via KML-Datei, etc.).

“Marble” sieht auf dem ersten Blick ganz gut aus, läuft aber nicht mit den Vektorkarten
und hat keine Annotierungsmöglichkeit.

Basecamp?

Gruß Klaus

…NEIN! Deshalb habe ich mich auf den Weg gemacht auf dem Desktop ein Tool zu schaffen, mit dem ich meine Mapsforge basierenden Vektorkarten anschauen kann. Dazu war das Mapsforge Rewrite mit dem Desktop SwingMapViewer eine Steilvorlage und ein Grund zum Einstieg in diese Thematik.

Weiterhin kam hinzu, dass der BRouter leicht zu integrieren war. Somit habe ich eine vertraute Umgebung für meine Android / Oruxmaps Karten/ und BRouterwelt auf dem Desktop. Somit habe ich auch auf dem Desktop einen “grafische” Routenerstellungsmöglichkeit, ohne Onlineverbindung. Karten und Routen sind 1:1 austauschbar.

Wenn sich das Ganze stabilisiert hat kann man eventuell auch über eine Weitergabe auch nachdenken…aber dazu bedarf es einer vernünftigen Doku bzw. Infoseite und das machen Entwickler sehr ungern.

Ps.: Nebenbei eine Frage an NOP.:

Ich weiß ich soll einen eigenen Thread aufmachen, aber weiter oben habt Ihr weit ab vom Thema diskutiert…

Welcher Router steckt hinter der “wanderreitkarte” und wo könnte man Infos für eine lokale Integration und Konfiguration finden?

Es ist eine Schwäche im Wegpunkt-Matching von BRouter. Ich durchsuche für den Match (=nächste Entfernung zu einem in diesem Profil routbaren Weg) nur in 4 1/80-Grad Kacheln, also einem Gebiet von ca 2,5km*2,5km. Ein solcher Wanderweg, der kilometerweit keine Verzweigung hat, kann mir dabei entgehen. Ich werde das nochmal verbessern, also z.B. das Suchgebiet vergrössern, wenn der Match so weit danebenliegt oder lange Wegabschnitte unterteilen. Danke für den Hinweis.

Das “or” hätte noch weg gemusst, sonst ist die Hirarchie des Ausdrucks kaputt. Aber wie gesagt, access=no ist hier ja nicht das Problem.

Ja zu schnell, wie ich finde, die Schwelle liegt bei 30m. Ja, die Funktion ist fast völlig identisch, nur dass BRouter keine Strassennamen liefert (also wenn Du Strassennamen hörst, hast Du den falschen Router eingestellt…) und bei Langstrecken ist das Verhalten anders: BRouter hat einen Timeout von 60 Sekunden, OsmAnd-Intern hat keinen Timeout, verschluckt sich aber irgenwann am Memory-Limit. BRouter kann aber “timeout-freie” Neuberchnungen, wenn zu dem selben Zielpunkt schon eine Route berechnet wurde, und diese Vorberechnung kann man alternativ auch über die BRouter-App machen, so dass man auch Langstrecken mit automatischen Neuberchnungen über OsmAnd (oder Locus…) abfahren kann.

Nein, OsmAnds Plugins sind ja nur eine Mogelpackung, mit modularer Software hat das nichts tu tun. Ich hab’ den Patch als Pull-Request in Guthub eingestellt und erwarte eigentlich, dass Victor ihn “merged”, und dann ist es ganz normaler Bestandteil der Releases.

Hallo Arndt,

in diesem Zusammenhang ein Vorschlag für zukünftige Versionen?

Sollte der gefundene Routen-Endpunkt xxx m vom vorgegebenen Zielpunkt oder yyy m Höhe entfernt sein wird die gefunden Route verworfen. Im Extremfall “keine” Route gefunden.
Möglichkeit der Vorgabe der Maximalen Alternative Routen und der Router gibt die Anzahl der gefundenen Routen (tmp Files) zurück.

Das ist im Falle von Bergwanderrouten wichtig: Worst Case…Es führt genau 1 Weg zum Gipfel, aber es wird ein Routenendpunkt 500m entfernt aber 1000m tiefer gefunden…

Wie denkst du darüber?

Ok. Prima. Dann wird das sicher bald meine bevorzugte Routing-Engine. Meistens, so wie heute, benutze ich OsmAnd nur informativ als Karte und als GPS-Logger. Wahrscheinlich komme ich erst wieder im Frühjahr zu längeren Touren in unbekannte Gebiete. Im Winter fahre ich nicht gerne. Bis dahin ist BRouter dann hoffentlich schon in der Release-Version von OsmAnd drin. Meinst du das funktioniert mit Victors Plänen zur C+±Umstellung? Ich kann mir nicht vorstellen, dass die App komplett nach C++ umgestellt wird. Geht das überhaupt bei Android? Ich dachte die App-APIs sind in erster Linie in Java ausgelegt und C++ hat dann im Prinzip nur die Linux-Betriebssystem-APIs zur Verfügung. Ich sehe den Mix verschiedener Programmiersprachen nicht so kritisch. Bei mir nutze ich oft mathematischen Code aus Fortran, der über DLLs angebunden wird. Fast alle Supercomputer machen das so für HPC. Bei klar definierten Schnittstellen und unabhängigen Modulen ist das kein Problem. Auch der Mix von Python und C++ ist sehr beliebt in der OpenSource-Welt.

Also hatte ich das vorher richtig eingeschätzt, dass das Memory-Limit die größte Einschränkung beim Routing ist, oder? Mein Billig-Samsung hat nur ca. 150 MB RAM. Das ist nicht viel.

Dass du dein Wegenetz konsequent auf Routing-Performance optimiert hast ist verständlich. Aber ist das so stark reduziert, dass du keine Referenz (ID, Index, Pointer) mehr zur OsmAnd-Vektorkarte herstellen kannst? Da stehen die Straßennamen schon drin.

Ok, so hatte ich das auch ursprünglich verstanden. Dann muss ich wohl auf die nächste Release warten.

Aber was ist das Problem mit den Plugins aka “Zusatzmodule” ? Die werden im Android-Market separat zum Download angeboten (Parking-Plugin, STRM-Plugin etc.) Oder sind die alle schon im Hauptprogramm vorhanden, werden quasi durch den Extra-Download nur freigeschaltet? Ein modulares Plugin-Konzept ist natürlich schwieriger zu realisieren. Ein Routing-Plugin würde Zugriff auf interne Datenstrukturen benötigen, z.B. auf die Kartendaten, die in OsmAnd geladen werden.

in dem Zusammenhang eine interessante Meldung:

Dalvik-Nachfolger: Google lädt zum Testen der neuen Android-Runtime ein
http://www.heise.de/newsticker/meldung/Dalvik-Nachfolger-Google-laedt-zum-Testen-der-neuen-Android-Runtime-ein-2041644.html

Man kann Java natürlich auch normal zum Maschinencode statt Bytecode compilieren. In GCJ gibt es das schon länger (wohl nicht so gut optimiert). Google will das jetzt auch für Android umsetzen. Maschinencode ist einfach vom Prinzip her schneller als Bytecode. Bytecode ist für ARM und x86 immer ein Fremdkörper, der in virtuellen Maschinen emuliert werden oder übersetzt werden muss. Nur spezielle Java-Prozessoren können den ausführen. Bytecode hat sicherlich Vorteile, ist aber nie performance-optimal.

Verschiedene Sprachen geben aber verschiedene Möglichkeiten, einen Algorithmus zu optimieren. Java und Python leiden darunter, dass man die Speicherbytes durch Pointer nicht so gut unter Kontrolle hat. Das wird der ART-Compiler von Google auch nicht lösen können. Das ist sprachinhärent.

Es kann durchaus sein, dass es für das Routing-Problem keine so große Rolle spielt, denn die Speicherverwaltung im dynamischen Routing-Graphen würde man vermutlich auch in C++ nicht manuell übernehmen.

Einen Unterschied gibt es auch bei den Datentypen. Bei Java wird immer eine virtual table für Objekte benötigt (richtig?). Wenn massenweise Datenobjekte verwaltet werden (z.B. in Vektoren und Matrizen), ist das deutlich weniger effizient als C+±Objekte ohne virtual tables.

Hallo Arndt,

der BRouter verhält sich an vielen Stellen sehr seltsam. Am Kartenmaterial kann es beinahe nicht liegen, da das Graphhopper problemlos packt.

Exemplarisch 1 Beispiel:

BRouter ==> http://www.gpswandern.de/gpxviewer/tvanzeige.shtml?url=http%3A%2F%2Fh2096617.stratoserver.net%2Fcgi-bin%2Fbrouter.sh%3F8.467605_48.792984_8.46915_48.790765_shortest_0

Graphhopper ==> http://graphhopper.com/maps/?point=48.792984%2C8.467605&point=48.790765%2C8.46915&vehicle=FOOT&locale=de-de

Viele Grüsse
Achim

Hi Achim

oh ja, passiert immer dann, wenn start- und endpunkt auf dem gleichen wegabschnitt liegen, da findet er den zielpunkt nicht und durchsucht dann den rest der welt. Danke für den Hinsweis.

War noch nie ganz richtig an der Stelle, nur bisher war es so, dass dann der Zielpunkt falsch gemappt wurde (auf die nächste Kreuzung, nur irgendwann (wird wohl die 0.95 gewesen sein) hab’ ich’s dann wohl verschlimmbessert.

Wird wohl Zeit für die 0.97… muss nur erst paar andere, langweilige Dinge (wie Steuererklärung…) vom Tisch kriegen bevor ich mich wieder rein vertiefen kann.

Gruss, Arndt