Skip to content

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 основного трека.
  • Task 1.3: Отрисовка "Пунктирного поводка".
    • В useRouteLayer.ts добавить дополнительный слой (line-dasharray). Он рендерит прямые отрезки от найденных точек на треке к самим POI-сайд-квестам.
  • Task 1.4: Модификация метрик.
    • При расчете Total Distance в UI добавлять удвоенное расстояние поводков (distance(trackPoint, POI) * 2), чтобы райдер видел честный километраж с учетом съездов с маршрута.