fix(roadtrip): the alternatives list compared two routers' drive times

The ways of driving one leg come from OSRM, except the toll-free or
motorway-free offer beside them: the shipped OSRM hosts are built without
excludable road classes and answer exclude= with HTTP 400, so that one is
asked of the avoidance router instead.

Their figures were then read against each other. The quickest was elected
across both, which is what decides the road drawn as the one being driven,
and every other road was labelled with how far behind that election it sat.
The two engines agree on the road to a tenth of a percent and not at all on
how fast it may be driven: over twelve European legs the per-leg time ran
from 14.7 % under OSRM's to 13.2 % over, with the sign following the region.
On a Spanish motorway leg that gap alone is enough to crown a toll-free
detour and call the motorway somebody is on the slow way round.

An offer now carries the engine that timed it. It takes no part in electing
the quickest, no difference is printed across the two, and the bar says where
the figure came from. Each route still reports its own time; only the
subtraction is refused. An instance running its own OSRM through the MLD
pipeline answers exclude itself, so there both figures are one engine's and
the comparison works exactly as before.
This commit is contained in:
Maurice
2026-09-14 12:28:12 +02:00
parent b2384a7523
commit f4bbb0fe5d
29 changed files with 188 additions and 11 deletions
+1
View File
@@ -204,6 +204,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'الأسرع',
'roadtrip.alt.slower': 'أبطأ بـ {time}',
'roadtrip.alt.quicker': 'أسرع بـ {time}',
'roadtrip.alt.otherEngine': 'الزمن محسوب بمحرك التجنب، لا بالمحرك الرئيسي.',
'roadtrip.day': 'اليوم {number}',
'roadtrip.quietDay.empty': 'لا توجد محطات بعد — أفلِت واحدة هنا',
'roadtrip.quietDay.one': 'حتى الآن {name} فقط — أفلِت محطة هنا',
+1
View File
@@ -209,6 +209,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Mais rápida',
'roadtrip.alt.slower': '{time} mais lenta',
'roadtrip.alt.quicker': '{time} mais rápida',
'roadtrip.alt.otherEngine': 'Tempo do roteador de desvios, não do principal.',
'roadtrip.day': 'Dia {number}',
'roadtrip.quietDay.empty': 'Ainda sem paradas — solte uma aqui',
'roadtrip.quietDay.one': 'Até agora só {name} — solte uma parada aqui',
+1
View File
@@ -211,6 +211,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'La més ràpida',
'roadtrip.alt.slower': '{time} més lenta',
'roadtrip.alt.quicker': '{time} més ràpida',
'roadtrip.alt.otherEngine': 'Temps de l’encaminador d’evitació, no del principal.',
'roadtrip.day': 'Dia {number}',
'roadtrip.quietDay.empty': 'Encara sense parades: deixa’n una aquí',
'roadtrip.quietDay.one': 'De moment només {name}: deixa una parada aquí',
+1
View File
@@ -207,6 +207,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Nejrychlejší',
'roadtrip.alt.slower': 'o {time} déle',
'roadtrip.alt.quicker': 'o {time} rychleji',
'roadtrip.alt.otherEngine': 'Čas spočítal server pro objížďky, ne ten hlavní.',
'roadtrip.day': 'Den {number}',
'roadtrip.quietDay.empty': 'Zatím žádné zastávky — přetáhněte sem',
'roadtrip.quietDay.one': 'Zatím jen {name} — přetáhněte sem zastávku',
+1
View File
@@ -206,6 +206,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Schnellste',
'roadtrip.alt.slower': '{time} länger',
'roadtrip.alt.quicker': '{time} kürzer',
'roadtrip.alt.otherEngine': 'Zeit vom Ausweich-Router, nicht vom Haupt-Router.',
'roadtrip.day': 'Tag {number}',
'roadtrip.quietDay.empty': 'Noch keine Stopps — hier ablegen',
'roadtrip.quietDay.one': 'Bisher nur {name} — hier einen Stopp ablegen',
+1
View File
@@ -203,6 +203,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Fastest',
'roadtrip.alt.slower': '{time} slower',
'roadtrip.alt.quicker': '{time} quicker',
'roadtrip.alt.otherEngine': 'Timed by the avoidance router, not the main one.',
'roadtrip.day': 'Day {number}',
'roadtrip.quietDay.empty': 'No stops yet — drop one here',
'roadtrip.quietDay.one': 'Only {name} so far — drop a stop here',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'La más rápida',
'roadtrip.alt.slower': '{time} más',
'roadtrip.alt.quicker': '{time} menos',
'roadtrip.alt.otherEngine': 'Tiempo del enrutador de evitación, no del principal.',
'roadtrip.day': 'Día {number}',
'roadtrip.quietDay.empty': 'Sin paradas todavía: suelta una aquí',
'roadtrip.quietDay.one': 'Por ahora solo {name}: suelta una parada aquí',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'La plus rapide',
'roadtrip.alt.slower': '{time} de plus',
'roadtrip.alt.quicker': '{time} de moins',
'roadtrip.alt.otherEngine': 'Temps du routeur de contournement, pas du principal.',
'roadtrip.day': 'Jour {number}',
'roadtrip.quietDay.empty': 'Aucun arrêt — déposez-en un ici',
'roadtrip.quietDay.one': 'Seulement {name} pour l’instant — déposez un arrêt ici',
+1
View File
@@ -212,6 +212,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Η ταχύτερη',
'roadtrip.alt.slower': '{time} πιο αργή',
'roadtrip.alt.quicker': '{time} πιο γρήγορη',
'roadtrip.alt.otherEngine': 'Χρόνος από τον δρομολογητή αποφυγής, όχι τον κύριο.',
'roadtrip.day': 'Ημέρα {number}',
'roadtrip.quietDay.empty': 'Καμία στάση ακόμη — αφήστε μία εδώ',
'roadtrip.quietDay.one': 'Μέχρι στιγμής μόνο {name} — αφήστε μια στάση εδώ',
+1
View File
@@ -208,6 +208,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Leggyorsabb',
'roadtrip.alt.slower': '{time}-cel lassabb',
'roadtrip.alt.quicker': '{time}-cel gyorsabb',
'roadtrip.alt.otherEngine': 'Az időt a kerülő útvonaltervező számolta, nem a fő.',
'roadtrip.day': '{number}. nap',
'roadtrip.quietDay.empty': 'Még nincs megálló — húzzon ide egyet',
'roadtrip.quietDay.one': 'Egyelőre csak {name} — húzzon ide egy megállót',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Tercepat',
'roadtrip.alt.slower': '{time} lebih lama',
'roadtrip.alt.quicker': '{time} lebih cepat',
'roadtrip.alt.otherEngine': 'Waktu dihitung mesin penghindaran, bukan mesin utama.',
'roadtrip.day': 'Hari {number}',
'roadtrip.quietDay.empty': 'Belum ada perhentian — jatuhkan di sini',
'roadtrip.quietDay.one': 'Sejauh ini hanya {name} — jatuhkan perhentian di sini',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'La più veloce',
'roadtrip.alt.slower': '{time} in più',
'roadtrip.alt.quicker': '{time} in meno',
'roadtrip.alt.otherEngine': 'Tempo dal router delle esclusioni, non dal principale.',
'roadtrip.day': 'Giorno {number}',
'roadtrip.quietDay.empty': 'Ancora nessuna sosta: trascinane una qui',
'roadtrip.quietDay.one': 'Finora solo {name}: trascina qui una sosta',
+1
View File
@@ -207,6 +207,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': '最速',
'roadtrip.alt.slower': '{time} 遅い',
'roadtrip.alt.quicker': '{time} 速い',
'roadtrip.alt.otherEngine': '所要時間は主エンジンではなく回避用エンジンでの計算です。',
'roadtrip.day': '{number} 日目',
'roadtrip.quietDay.empty': 'まだ立ち寄り先がありません。ここにドロップ',
'roadtrip.quietDay.one': '今のところ {name} だけです。立ち寄り先をここにドロップ',
+1
View File
@@ -206,6 +206,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': '가장 빠름',
'roadtrip.alt.slower': '{time} 더 걸림',
'roadtrip.alt.quicker': '{time} 더 빠름',
'roadtrip.alt.otherEngine': '기본 엔진이 아니라 회피 엔진이 계산한 시간입니다.',
'roadtrip.day': '{number}일차',
'roadtrip.quietDay.empty': '아직 경유지가 없습니다. 여기에 놓으세요',
'roadtrip.quietDay.one': '지금은 {name}뿐입니다. 경유지를 여기에 놓으세요',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Snelste',
'roadtrip.alt.slower': '{time} langzamer',
'roadtrip.alt.quicker': '{time} sneller',
'roadtrip.alt.otherEngine': 'Tijd van de vermijdingsrouter, niet van de hoofdrouter.',
'roadtrip.day': 'Dag {number}',
'roadtrip.quietDay.empty': 'Nog geen stops — laat er hier een vallen',
'roadtrip.quietDay.one': 'Voorlopig alleen {name} — laat hier een stop vallen',
+1
View File
@@ -208,6 +208,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Najszybsza',
'roadtrip.alt.slower': '{time} dłużej',
'roadtrip.alt.quicker': '{time} krócej',
'roadtrip.alt.otherEngine': 'Czas policzony silnikiem omijania, nie głównym.',
'roadtrip.day': 'Dzień {number}',
'roadtrip.quietDay.empty': 'Brak przystanków — upuść tutaj',
'roadtrip.quietDay.one': 'Na razie tylko {name} — upuść tutaj przystanek',
+1
View File
@@ -210,6 +210,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Самый быстрый',
'roadtrip.alt.slower': 'на {time} дольше',
'roadtrip.alt.quicker': 'на {time} быстрее',
'roadtrip.alt.otherEngine': 'Время посчитал маршрутизатор обхода, не основной.',
'roadtrip.day': 'День {number}',
'roadtrip.quietDay.empty': 'Остановок пока нет — перетащите сюда',
'roadtrip.quietDay.one': 'Пока только {name} — перетащите сюда остановку',
+1
View File
@@ -207,6 +207,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Snabbast',
'roadtrip.alt.slower': '{time} långsammare',
'roadtrip.alt.quicker': '{time} snabbare',
'roadtrip.alt.otherEngine': 'Tid från undvikandemotorn, inte huvudmotorn.',
'roadtrip.day': 'Dag {number}',
'roadtrip.quietDay.empty': 'Inga stopp än – släpp ett här',
'roadtrip.quietDay.one': 'Hittills bara {name} – släpp ett stopp här',
+1
View File
@@ -209,6 +209,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'En hızlı',
'roadtrip.alt.slower': '{time} daha uzun',
'roadtrip.alt.quicker': '{time} daha kısa',
'roadtrip.alt.otherEngine': 'Süre, ana motorla değil kaçınma motoruyla hesaplandı.',
'roadtrip.day': '{number}. gün',
'roadtrip.quietDay.empty': 'Henüz mola yok — buraya bırakın',
'roadtrip.quietDay.one': 'Şimdilik yalnızca {name} — buraya bir mola bırakın',
+1
View File
@@ -209,6 +209,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Найшвидший',
'roadtrip.alt.slower': 'на {time} довше',
'roadtrip.alt.quicker': 'на {time} швидше',
'roadtrip.alt.otherEngine': 'Час порахував маршрутизатор обходів, а не основний.',
'roadtrip.day': 'День {number}',
'roadtrip.quietDay.empty': 'Зупинок ще немає — перетягніть сюди',
'roadtrip.quietDay.one': 'Поки лише {name} — перетягніть сюди зупинку',
+1
View File
@@ -208,6 +208,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': 'Nhanh nhất',
'roadtrip.alt.slower': 'chậm hơn {time}',
'roadtrip.alt.quicker': 'nhanh hơn {time}',
'roadtrip.alt.otherEngine': 'Giờ do máy chủ định tuyến tránh đường tính, không phải máy chính.',
'roadtrip.day': 'Ngày {number}',
'roadtrip.quietDay.empty': 'Chưa có điểm dừng — thả vào đây',
'roadtrip.quietDay.one': 'Hiện chỉ có {name} — thả một điểm dừng vào đây',
+1
View File
@@ -197,6 +197,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': '最快',
'roadtrip.alt.slower': '慢 {time}',
'roadtrip.alt.quicker': '快 {time}',
'roadtrip.alt.otherEngine': '駕駛時間由避開專用的路徑服務計算,無法與其他項比較。',
'roadtrip.day': '第 {number} 天',
'roadtrip.quietDay.empty': '尚無停靠點 — 拖到這裡',
'roadtrip.quietDay.one': '目前只有 {name} — 把停靠點拖到這裡',
+1
View File
@@ -197,6 +197,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.alt.fastest': '最快',
'roadtrip.alt.slower': '慢 {time}',
'roadtrip.alt.quicker': '快 {time}',
'roadtrip.alt.otherEngine': '用时由避开引擎计算,而非主引擎。',
'roadtrip.day': '第 {number} 天',
'roadtrip.quietDay.empty': '暂无停靠点 — 拖到这里',
'roadtrip.quietDay.one': '目前只有 {name} — 把停靠点拖到这里',