BRouter: offline Fahrrad-Routing für Android

Die daten sind erneuert. Ist der “latest-planet”, der ist aber auch vom 13.6., also fast eine Woche alt.

Danke für die Aktualisierung.

Jetzt hätte ich noch eine Frage zu den Profilen.
Ich fahre eine Liegedreirad und bevorzuge geteerte Rad- bzw. geteerte Feldwege nutze aber auch Feldwege mit tracktype 2 und smoothness=intermediate. Land- und Bundesstraße möchte ich - ausserorts - soweit möglich meiden. Kreisstraßen sind noch akzeptabel, wenn kein geeigneter Rad- bzw. Feldweg in der Nähe ist.

Ich habe gerade - mit den neuen Daten - verschiedene Profile auf den von mir vor dem 13.06. mit smoothness ergänzten Wegen getestet.

Mein aktuelles Profil:
assign consider_elevation = true # set to false to ignore elevation in routing
assign allow_steps = false # set to false to disallow steps
assign allow_ferries = true # set to false to disallow ferries
assign ignore_cycleroutes = true # set to true for better elevation results
assign stick_to_cycleroutes = false # set to true to just follow cycleroutes
assign avoid_unsafe = true # set to true to avoid standard highways
assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style

avoid_unsafe = false führt mich zwischen Dürmentingen und Kanzach über eine Landstraße obwohl in der Nähe ein guter Radweg verläuft (teilweise tracktype 2 mit smoothness intermediate)
Beispiel mit Profil trekking und entspr. Zwischenzielen (entspricht o.a. Profil)
http://brouter.de/brouter-web/#zoom=13&lat=48.1081&lon=9.5007&layer=OpenStreetMap&lonlats=9.475209,48.153529|9.475209,48.153529|9.494591,48.146646|9.546089,48.092241|9.608231,48.065691&nogos=&alternativeidx=0&format=geojson&profile=trekking

Setze ich avoid_unsafe = true dann führt dies zu einem unnötigen Umweg:
http://brouter.de/brouter-web/#zoom=13&lat=48.1098&lon=9.5412&layer=OpenStreetMap&lonlats=9.475166,48.153432|9.60969,48.065426&nogos=&profile=trekking&alternativeidx=0&format=geojson

Meine gewünschte Route (alles auf guten Radwegen)
http://brouter.de/brouter-web/#zoom=13&lat=48.1035&lon=9.5421&layer=OpenStreetMap&lonlats=9.475166,48.153432|9.494462,48.146761|9.509354,48.132084|9.548836,48.107231|9.582825,48.064185|9.60969,48.065426&nogos=&profile=trekking&alternativeidx=0&format=geojson

Ich würde gerne avoid_unsafe = false verwenden, aber die Kosten für Land- und Bundesstraßen ausserorts höher setzen. Ist das möglich und in welcher Zeile des Profiles trekking müßte ich dazu ein entspr. Änderung vornehmen ?

Grüße aus Oberschwaben
Peter

Edit 25.06.2016:
Nachdem ich mir das Profil mal von hinten her angesehen habe, ist mir die Logik jetzt einigermaßen klar. Ich habe auch die Zeile mit den entspr. Kostenfaktoren gefunden und - nach mehreren Tests - die Kostenfaktoren entsprechend angepaßt.

Neues Problem, neue Frage:

Der Routenvorschlag mit meinem neuen Profil (s.o.) für eine Fahrt von Uttenweiler nach Laupheim führt mich über diese Straße:
https://www.openstreetmap.org/way/158461079#map=15/48.1968/9.7500

Dieses Wegstück ist unbefestigt und weist viele große Schlaglöcher auf und ist für ein Liegedreirad nicht empfehlenswert. Ich habe das Wegstück entspr. mit surface=gravel und smoothness=bad eingetragen. Da aber auch lcn=yes (Teil des Donau-Bodensee-Radweges) vorhanden ist, wird das Wegstück von brouter als gut eingestuft.
Ich möchte jetzt nicht den Kostenfaktor für gute unclassified entspr. erhöhen und habe deshalb versucht in der Zeile

assign isbike = or bicycle=yes or or bicycle=permissive bicycle=designated lcn=yes

den Teil lcn=yes zu löschen. Dann erhalte ich aber von Brouter-Webclient die Fehlermeldung
Profile error: ParseException at line 56: assign operator within expression

Was mache ich falsch ?

Da ist dann auch ein “or” zuviel. Das ist bisschen schwer zu lesen wegen der polnischen Notation.

Man kann’s aber auch mit if-then-else schreiben und dann wird’s fast lesbar:

assign isbike = if bicycle=yes then true
else if bicycle=permissive then true
else if bicycle=designated then true
else false

Das “trekking” Profil hatte ich weitgehend in diesem Sinne umgeschrieben, aber halt doch nicht alles.

Mit dem neuen Code-Stück und einer Anpassung des Kostenfaktors für “schlechte” unclassified auf 1.7 kommt genau die Route heraus, die ich früher immer gefahren bin und die ich für mein Liegedreirad als ideal empfinde.

Danke

Grüße
Peter

Hallo Arndt,

jetzt hätte ich doch noch eine weitere Bitte. Könntest Du mir noch diese Passagen in if-then-else übersetzen:

assign ispaved = surface=paved|asphalt|concrete|paving_stones
assign isunpaved = not or surface= or ispaved surface=fine_gravel|cobblestone
assign probablyGood = or ispaved and isbike not isunpaved

Ich würde gerne noch die Unterscheidung nach ispaved und isunpaved etwas anpassen.

Im voraus schon vielen Dank.

Grüße
Peter

Ich habe es trotz vielfacher Versuche bisher nicht geschafft, BRouter unter Android mit OSMAND zum laufen zu bekommen. Wird es in absehbarer Zeit eine Version geben, die die aktuelle Android API unterstützt und einfach so funktioniert?

Ich kann nur auf die Probleme reagieren, die ich kenne, und hab’ kein Testfeld aus 50 Geräten zuhause. Welche Android Version, welcher SD-Karten Modus, und woran hängt es?

Leider habe ich auf meine Bitte im Forum bisher keine Hilfe erhalten. Auch ein Bekannter der im IT-Bereich tätig ist, kommt bisher nicht klar.
Kann mir jemand sagen, in welcher Programmiersprache die Profile geschrieben sind ?

Grüße
Peter

Wie @abrensch schon erwähnt hatte, wäre polnische Notation im Wiki ein guter Startpunkt: https://de.wikipedia.org/wiki/Polnische_Notation

Anschließend mal einen Blick in den Profile Developer Guide werfen, Abschnitt “The operators of the profile scripts” (http://brouter.de/brouter/profile_developers_guide.txt)

Das mit der polnischen Notation habe ich schon gelesen und auch schon im Wikipedia nachgeschlagen. Das Prinzip habe ich verstanden, den Codeteil im Detail verstehen bzw. in eine If-then-else-Anweisung übersetzen kann ich aber trotzdem nicht.
Mein Bekannter (Datenbank-Programmierer) kann sich zur Zeit wegen eines aktuellen Augenleidens nicht intensiv mit meinem Problem beschäftigen. Er war aber über die Kombination von Or und | verwundert und will - nach Besserung seines Augenleidens - zuerst mal schauen, in welcher Programmiersprache der Ursprungscode geschrieben ist, um die Default-Werte korrekt zu verwenden. Daher meine Anfrage nach der Programmiersprache für die Profile.

Ich werde Deinen Link weitergeben.
Ich selbst kann damit leider nichts anfangen.

Grüße
Peter

Ohne Polnische Notation sind die Profile fast/gar nicht möglich, einfach mal anschauen, die ist gar nicht so kompliziert.

Ich habe die einzelnen Zeilen mal übersetzt, finde aber die neuen Versionen viel unübersichtlicher. Getestet habe ich sie bisher aber noch nicht.

assign ispaved = if surface=paved|asphalt|concrete|paving_stones then true
	else false

…alternativ…

assign ispaved = if surface=paved then true
	else if surface=asphalt then true
	else if surface=concrete then true
	else if surface=paving_stones then true
	else false

assign isunpaved = if surface= then false
	else if ispaved then false
	else if surface=fine_gravel|cobblestone then false
	else true

…alternativ…

assign isunpaved = if surface= then false
	else if ispaved then false
	else if surface=fine_gravel then false
	else if surface=cobblestone then false
	else true
assign probablyGood = if ispaved then true
	else if and isbike not isunpaved then true
	else false

else if and isbike not isunpaved then true
…bedeutet so viel wie…
else if isbike and not isunpaved then true
…alternativ…

assign probablyGood = if ispaved then true
	else if not isunpaved then isbike
	else false

Das | ist die Kurzschreibweise, um mehrere mögliche Values eines Keys mit ODER zu verknüpfen. Das OR wird verwendet um zwei boolsche Ausdrücke mit ODER zu verknüpfen.

Das ist o.K. und funktioniert (soweit war ich auch schon).

Nach Deiner Übersetzung würde bei fine_gravel und bei cobblestone isunpaved auf Nein gesetzt.
Das verstehe ich nicht und sieht für mich verdreht aus.

else if not isunpaved then isbike verstehe ich ebenfals (noch?) nicht.

Grüße
Peter

Müsste aber eigentlich so stimmen, habe mir die entsprechende Stelle nochmal angeschaut. Denn das NOT setzt das Ergebnis auf false/Nein, sobald einer der Werte true/Ja ist. Das Ganze kann auch umgedreht überlegt werden und so geschrieben werden.

cobblestone und fine_gravel lassen sich nach dieser Logik dann weder zu ispaved noch zu isunpaved zuordnen (also ispaved=false & isunpaved=false) - alle anderen Values für surface ergeben entweder ispaved = true oder isunpaved = true.

Was bedeutet assign isunpaved = if surface= then false ?
surface fehlt oder irgendein surface-Wert vorhanden ?

Grüße
Peter

Soweit ich das hier richtig verstehe, ist mit surface= gemeint, dass in den Kartendaten für den entsprechenden Way kein surface Wert vorhanden ist.

Nach dem ich mir noch mal angeschaut habe, wo sich unpaved auf die Kosten auswirkt, habe ich - glaube ich zumindest - die Logik dieses Code-Abschnittes verstanden.

Dann werde ich jetzt mal versuchen smoothness mit einzubauen.

Vielen Dank für Deine Unterstützung und Geduld.

Grüße
Peter

Ich habe mein Profil jetzt so umgeschrieben / ergänzt:

assign isbike = if bicycle=yes           then true
           else if bicycle=permissive then true
           else if bicycle=designated then true
           else if lcn=yes then true
           else if maxspeed=50|40|30|20 then true
           else false

assign ispaved = if smoothness=excellent|good then true
            else if surface=paved then true
            else if surface=asphalt then true
            else if surface=concrete then true
            else if surface=paving_stones then true
            else false


assign isunpaved = if smoothness=bad|very_bad then true
     else  if surface=  then false
	else if ispaved then false
	else if surface=fine_gravel|cobblestone then false
	else true

assign probablyGood = or ispaved and isbike not isunpaved

Leider sind die Routing-Vorschläge nicht so wie gewünscht. Ich habe deshalb nochmals Routen mit meinem “alten Profil” berechnen lassen, mit dem ich bisher meine “Wunsch-Routen” bekommen habe. Auch hier kommen nicht mehr die gewünschten Routen heraus. Ist vielleicht etwas mit den neuen Routing-Dateien vom 16.07. nicht in Ordnung ?

Grüße
Peter

Fehler gefunden. Ursache ist die Ergänzung else if maxspeed=50|40|30|20 then true.

Grüße
Peter

Der letzte Ausdruck mit dem AND-Operator ist tatsächlich schwieriger, geht aber auch umzuschreiben:

assign probablyGood = or ispaved and isbike not isunpaved

– ist analog →

assign probablyGood = if ispaved then true
                 else if not isbike then false
                 else if isunpaved then false
                 else true

Ich hatte mir für den Test, ob 2 Profile wirklich funktional identisch sind, damals einen statistischen Test gebaut, und der ist auch Teil des “brouter.jar” aus dem Distribution-zip. Der Aufruf geht so:

java -cp …..\brouter.jar btools.expressions.ProfileComparator lookups.dat trekking.brf trekking2.brf 100000