feat(roadtrip): narrow the corridor to one stretch of the drive

A seven-hundred-kilometre day turns up seventy hits spread over the whole of
it, and the traveller wanting a break near Berlin has to read all seventy and
work out from "245 km along the route" which ones are anywhere near. That is
the wrong way round: you decide roughly where to stop, and then look at what is
there.

Picking a point narrows the list to what lies within 25, 50 or 100 km of it.
This is a subtraction rather than a second search, because the stops and the
hits are already measured along the same thinned line.

The midpoints of the legs are offered alongside the stops, and they are the
point of the feature: a break on a five-hour drive belongs in the middle of the
drive, not at either end. Asking only about stops would answer "what is near
Berlin" when the question is "what is near the halfway mark".

The chosen point is stored as which anchor it is rather than as a distance.
alongKm is measured against a line thinned with a tolerance derived from the
corridor width, so a kilometre figure kept here would quietly drift when the
width goes from 5 to 10; resolved through the stops it lands on the same place
again. It also names its day, so switching days cannot apply yesterday's break
to today's drive.
This commit is contained in:
Maurice
2026-09-04 23:44:16 +02:00
committed by Maurice
parent 061259b3d9
commit 36ac5de84c
29 changed files with 254 additions and 33 deletions
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'أي قابس',
'roadtrip.poi.anyPower': 'أي قدرة',
'roadtrip.poi.free': 'مجاني',
'roadtrip.poi.wholeDay': 'اليوم كله',
'roadtrip.poi.midLeg': 'في المنتصف، {from} إلى {to}',
'roadtrip.poi.rest': 'استراحة',
'roadtrip.poi.campsite': 'مخيم',
'roadtrip.poi.food': 'طعام',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Qualquer tomada',
'roadtrip.poi.anyPower': 'Qualquer potência',
'roadtrip.poi.free': 'Gratuito',
'roadtrip.poi.wholeDay': 'O dia todo',
'roadtrip.poi.midLeg': 'Na metade, {from} ate {to}',
'roadtrip.poi.rest': 'Área de descanso',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Comida',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Qualsevol connector',
'roadtrip.poi.anyPower': 'Qualsevol potència',
'roadtrip.poi.free': 'Gratuït',
'roadtrip.poi.wholeDay': 'Tot el dia',
'roadtrip.poi.midLeg': 'A mig cami, {from} a {to}',
'roadtrip.poi.rest': 'Àrea de descans',
'roadtrip.poi.campsite': 'Càmping',
'roadtrip.poi.food': 'Menjar',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Libovolná zásuvka',
'roadtrip.poi.anyPower': 'Libovolný výkon',
'roadtrip.poi.free': 'Zdarma',
'roadtrip.poi.wholeDay': 'Cely den',
'roadtrip.poi.midLeg': 'V polovine, {from} do {to}',
'roadtrip.poi.rest': 'Odpočívadlo',
'roadtrip.poi.campsite': 'Kemp',
'roadtrip.poi.food': 'Jídlo',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Alle Stecker',
'roadtrip.poi.anyPower': 'Alle Leistungen',
'roadtrip.poi.free': 'Kostenlos',
'roadtrip.poi.wholeDay': 'Ganzer Tag',
'roadtrip.poi.midLeg': 'Auf halber Strecke, {from} bis {to}',
'roadtrip.poi.rest': 'Rastplatz',
'roadtrip.poi.campsite': 'Campingplatz',
'roadtrip.poi.food': 'Essen',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Any plug',
'roadtrip.poi.anyPower': 'Any power',
'roadtrip.poi.free': 'Free',
'roadtrip.poi.wholeDay': 'The whole day',
'roadtrip.poi.midLeg': 'Halfway, {from} to {to}',
'roadtrip.poi.rest': 'Rest area',
'roadtrip.poi.campsite': 'Campsite',
'roadtrip.poi.food': 'Food',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Cualquier conector',
'roadtrip.poi.anyPower': 'Cualquier potencia',
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Todo el dia',
'roadtrip.poi.midLeg': 'A mitad, {from} a {to}',
'roadtrip.poi.rest': 'Área de descanso',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Comida',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Toute prise',
'roadtrip.poi.anyPower': 'Toute puissance',
'roadtrip.poi.free': 'Gratuit',
'roadtrip.poi.wholeDay': 'Toute la journee',
'roadtrip.poi.midLeg': 'A mi-chemin, {from} vers {to}',
'roadtrip.poi.rest': 'Aire de repos',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Restauration',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Κάθε βύσμα',
'roadtrip.poi.anyPower': 'Κάθε ισχύς',
'roadtrip.poi.free': 'Δωρεάν',
'roadtrip.poi.wholeDay': 'Ολη η ημερα',
'roadtrip.poi.midLeg': 'Στα μισα, {from} προς {to}',
'roadtrip.poi.rest': 'Χώρος ανάπαυσης',
'roadtrip.poi.campsite': 'Κάμπινγκ',
'roadtrip.poi.food': 'Φαγητό',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Bármely csatlakozó',
'roadtrip.poi.anyPower': 'Bármely teljesítmény',
'roadtrip.poi.free': 'Ingyenes',
'roadtrip.poi.wholeDay': 'A teljes nap',
'roadtrip.poi.midLeg': 'Felúton, {from} és {to} kozott',
'roadtrip.poi.rest': 'Pihenőhely',
'roadtrip.poi.campsite': 'Kemping',
'roadtrip.poi.food': 'Étkezés',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Semua colokan',
'roadtrip.poi.anyPower': 'Semua daya',
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Sepanjang hari',
'roadtrip.poi.midLeg': 'Di tengah, {from} ke {to}',
'roadtrip.poi.rest': 'Tempat istirahat',
'roadtrip.poi.campsite': 'Perkemahan',
'roadtrip.poi.food': 'Makanan',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Qualsiasi presa',
'roadtrip.poi.anyPower': 'Qualsiasi potenza',
'roadtrip.poi.free': 'Gratuito',
'roadtrip.poi.wholeDay': 'Tutta la giornata',
'roadtrip.poi.midLeg': 'A meta strada, {from} verso {to}',
'roadtrip.poi.rest': 'Area di sosta',
'roadtrip.poi.campsite': 'Campeggio',
'roadtrip.poi.food': 'Ristoro',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'すべてのプラグ',
'roadtrip.poi.anyPower': 'すべての出力',
'roadtrip.poi.free': '無料',
'roadtrip.poi.wholeDay': '一日全体',
'roadtrip.poi.midLeg': '中間地点、{from}から{to}',
'roadtrip.poi.rest': 'サービスエリア',
'roadtrip.poi.campsite': 'キャンプ場',
'roadtrip.poi.food': '食事',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': '모든 플러그',
'roadtrip.poi.anyPower': '모든 출력',
'roadtrip.poi.free': '무료',
'roadtrip.poi.wholeDay': '하루 전체',
'roadtrip.poi.midLeg': '중간 지점, {from}에서 {to}',
'roadtrip.poi.rest': '휴게소',
'roadtrip.poi.campsite': '캠핑장',
'roadtrip.poi.food': '식사',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Elke stekker',
'roadtrip.poi.anyPower': 'Elk vermogen',
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'De hele dag',
'roadtrip.poi.midLeg': 'Halverwege, {from} naar {to}',
'roadtrip.poi.rest': 'Rustplaats',
'roadtrip.poi.campsite': 'Camping',
'roadtrip.poi.food': 'Eten',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Dowolna wtyczka',
'roadtrip.poi.anyPower': 'Dowolna moc',
'roadtrip.poi.free': 'Bezpłatnie',
'roadtrip.poi.wholeDay': 'Caly dzien',
'roadtrip.poi.midLeg': 'W polowie, {from} do {to}',
'roadtrip.poi.rest': 'Miejsce odpoczynku',
'roadtrip.poi.campsite': 'Kemping',
'roadtrip.poi.food': 'Jedzenie',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Любой разъём',
'roadtrip.poi.anyPower': 'Любая мощность',
'roadtrip.poi.free': 'Бесплатно',
'roadtrip.poi.wholeDay': 'Весь день',
'roadtrip.poi.midLeg': 'На полпути, {from} до {to}',
'roadtrip.poi.rest': 'Зона отдыха',
'roadtrip.poi.campsite': 'Кемпинг',
'roadtrip.poi.food': 'Еда',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Alla kontakter',
'roadtrip.poi.anyPower': 'Alla effekter',
'roadtrip.poi.free': 'Gratis',
'roadtrip.poi.wholeDay': 'Hela dagen',
'roadtrip.poi.midLeg': 'Halvvags, {from} till {to}',
'roadtrip.poi.rest': 'Rastplats',
'roadtrip.poi.campsite': 'Campingplats',
'roadtrip.poi.food': 'Mat',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Tum soketler',
'roadtrip.poi.anyPower': 'Tum gucler',
'roadtrip.poi.free': 'Ucretsiz',
'roadtrip.poi.wholeDay': 'Tum gun',
'roadtrip.poi.midLeg': 'Yolun yarisi, {from} - {to}',
'roadtrip.poi.rest': 'Dinlenme alanı',
'roadtrip.poi.campsite': 'Kamp alanı',
'roadtrip.poi.food': 'Yemek',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Будь-який роз’єм',
'roadtrip.poi.anyPower': 'Будь-яка потужність',
'roadtrip.poi.free': 'Безкоштовно',
'roadtrip.poi.wholeDay': 'Весь день',
'roadtrip.poi.midLeg': 'На пiвдорозi, {from} до {to}',
'roadtrip.poi.rest': 'Зона відпочинку',
'roadtrip.poi.campsite': 'Кемпінг',
'roadtrip.poi.food': 'Їжа',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': 'Mọi loại phích',
'roadtrip.poi.anyPower': 'Mọi công suất',
'roadtrip.poi.free': 'Miễn phí',
'roadtrip.poi.wholeDay': 'Cả ngày',
'roadtrip.poi.midLeg': 'Giữa đường, {from} đến {to}',
'roadtrip.poi.rest': 'Trạm dừng nghỉ',
'roadtrip.poi.campsite': 'Khu cắm trại',
'roadtrip.poi.food': 'Đồ ăn',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': '任意接口',
'roadtrip.poi.anyPower': '任意功率',
'roadtrip.poi.free': '免費',
'roadtrip.poi.wholeDay': '全天',
'roadtrip.poi.midLeg': '中途,{from} 至 {to}',
'roadtrip.poi.rest': '休息站',
'roadtrip.poi.campsite': '露營地',
'roadtrip.poi.food': '餐飲',
+2
View File
@@ -44,6 +44,8 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.anySocket': '任意接口',
'roadtrip.poi.anyPower': '任意功率',
'roadtrip.poi.free': '免费',
'roadtrip.poi.wholeDay': '全天',
'roadtrip.poi.midLeg': '中途,{from} 至 {to}',
'roadtrip.poi.rest': '服务区',
'roadtrip.poi.campsite': '露营地',
'roadtrip.poi.food': '餐饮',