Nach näherer Betrachtung habe ich den Grund gefunden:
Festhalten, es sind statt 127 km/h sogar 1024 km/h (bei highway = path
+ foot = yes
+ bicycle = yes
). 
Die 127 km/h in der Debug-Ansicht resultieren lediglich daraus, dass 1024 nicht in ein Byte passen (signed char
geht von -128
bis +127
), deshalb wird der Wert bei 127 gekappt:
void set_speed(unsigned int value)
{
add_property(m_layer.key_speed, m_layer.uint_index(std::min(value, 127u)));
}
Quelle: osrm-backend/src/engine/plugins/tile.cpp at v5.27.1 · Project-OSRM/osrm-backend · GitHub
Das betrifft wirklich nur die Debug-Ansicht, für die Routing-Entscheidung und die Zeitberechnung werden 1024 km/h verwendet.
So berechnen sich die 1024 km/h:
Relevante Werte aus der bike.lua:
bicycle_speeds = {
(...)
path = {0.4, 8},
(...)
}
speed_path = {
(...)
foot = { designated = {0.2, 8},
yes = {0.35, 8} },
bicycle = { yes = {1.2, 16} },
(...)
}
WayHandlers.adjust_speed_for_path
(aus lib/way_handlers.lua) berechnet die Routing-Geschwindigkeit wie folgt:
path = 8 km/h
foot = 8
bicycle = 16
path * foot * bicycle = 1024 km/h
Vermutlich hat der Profil-Ersteller nicht bemerkt, dass es sich hier bei speed_path
um Multiplikatoren und nicht um absolute Geschwindigkeiten handelt!
Das Fahrrad-Profil ist auf Zeitdauer (weight_name = 'duration'
) eingestellt, das Routing minimiert somit ausschließlich die Zeit.
Um zu verifizieren, dass der OSM-Server auch tatsächlich so rechnet, habe ich mir einen langen (um Rundungsungenauigkeiten möglichst gering zu halten, OSRM rundet Sekunden und Meter auf Zehntel) Weg Way: 80519499 | OpenStreetMap mit (highway = path
+ foot = yes
+ bicycle = yes
) herausgesucht und über diesen geroutet:
https://www.openstreetmap.org/directions?engine=fossgis_osrm_bicycle&route=48.12709,8.52762;48.11293,8.51676#map=15/48.12002/8.52226
Hier noch die Debug-Ansicht mit den abgeschnittenen 127 km/h:
https://routing.openstreetmap.de/debug/bike.html#15/48.1191/8.5216
Antwort des OSM-Servers:
"weight_name":"duration","weight":6.3,"duration":6.3,"distance":1821.4
1821,4 Meter in 6,3 Sekunden ergibt 1040,8 km/h, das liegt nahe an den genannten 1024 km/h (somit kleine Rundungsungenauigkeiten).
OSRM-Profile lassen sich übrigens einfach debuggen, hier meine entsprechend angepasste Version (debug.lua
), angelehnt an debug_example.lua:
--
-- You run your copy via the lua command line:
-- > cd profiles
-- > lua5.1 debug.lua
-- for better printing
local pprint = require('lib/pprint')
-- require the debug tool
local Debug = require('lib/profile_debugger')
-- load the profile we want to debug
Debug.load_profile('bike')
-- define some input tags. they would normally by extracted from OSM data,
-- but here we can set them manually which makes debugging the profile easier
local way = {
bicycle = 'yes',
foot = 'yes',
highway = 'path',
surface = 'paving_stones'
}
-- output will go here
local result = {}
-- call the way function
Debug.process_way(way,result)
-- print input and output
pprint(way)
print("=>")
pprint(result)
print("\n")
-- report what tags where fetched, and how many times
Debug.report_tag_fetches()
Ergebnis sind die bekannten 1024 km/h:
backward_speed = 1024
forward_speed = 1024
Um das Problem nochmals anhand eines Beispiels zu verdeutlichen:
Ein 68 km langer Weg mit highway = path
+ foot = yes
+ bicycle = yes
(Routing-Geschwindigkeit 1024 km/h) würde gegenüber einem 1 km langen Weg mit highway = residential
(Routing-Geschwindigkeit 15 km/h) bevorzugt!