Appearance
Use Case #6: Работа с POI (Сайд-квесты и пунктирный поводок)
Интент: Юзер построил идеальный маршрут, но видит на карте родник (или кафе) чуть в стороне. Он хочет понимать, где нужно свернуть за водой, но категорически не хочет добавлять родник как жесткую транзитную точку, потому что алгоритм роутинга может сойти с ума (поведет по лесу, развернет обратно, перестроит весь идеальный трек).
Идеальная логика системы (Пунктирный поводок / Tethered POI)
- Отдельный слой: POI добавляется не в массив
waypoints(который уходит в BRouter/OSRM), а в отдельный массивsideQuests(Привязанные точки). - Проекция: Система математически находит на основном треке точку, максимально близкую к этому POI (Nearest Point on Line).
- Визуализация (Пунктирный поводок): На карте от трека к Роднику рисуется прямая пунктирная линия. Основной маршрут остается девственно чистым и не перестраивается!
- Калькуляция: Расстояние от трека до POI умножается на 2 (туда-обратно) и просто плюсуется к общей дистанции маршрута в UI.
Эпики и Задачи (Epics & Tasks)
Декомпозиция данного Use Case для разработки.
Epic 1: Сайд-квесты и Привязанные POI (Tethered POI)
- Task 1.1: Стейт-менеджмент Сайд-квестов.
- Создать в
plannerStoreотдельный массивsideQuests: { id, coords, type, meta }[]. - Эти точки исключаются из массива, передаваемого в API роутера (BRouter). Они не участвуют в построении основного графа.
- Создать в
- Task 1.2: Математическая проекция (Nearest Point on Line).
- Написать turf.js утилиту (или кастомную математику): для каждого
sideQuestнаходить ближайшую координату на массивеgeojsonосновного трека.
- Написать turf.js утилиту (или кастомную математику): для каждого
- Task 1.3: Отрисовка "Пунктирного поводка".
- В
useRouteLayer.tsдобавить дополнительный слой (line-dasharray). Он рендерит прямые отрезки от найденных точек на треке к самим POI-сайд-квестам.
- В
- Task 1.4: Модификация метрик.
- При расчете Total Distance в UI добавлять удвоенное расстояние поводков (
distance(trackPoint, POI) * 2), чтобы райдер видел честный километраж с учетом съездов с маршрута.
- При расчете Total Distance в UI добавлять удвоенное расстояние поводков (