Appearance
Use Case #07: Режим «Карандаш» ✏️ (Прямая линия по воздуху)
1. Жизненная ситуация (Боль пользователя)
Представь: Пользователь строит маршрут через глухой лес. Он дошел до реки. На схематичной карте моста нет, но юзер переключает слой на "Спутник" и своими глазами видит, что там лежит деревянный мостик (или колея от трактора).
В чем проблема на обычных сайтах: Юзер кликает мышкой на другой берег. Умный алгоритм сайта говорит: "Моста нет! В воду нельзя!" — и прокладывает маршрут в обход, делая огромный крюк в 40 км. Юзер пытается перетянуть синюю линию на свой брод — алгоритм сопротивляется. Юзер кричит в монитор: "Да пусти ты меня, я сам знаю, что там проход!". Но сайт не дает. Мечта юзера: Кнопка, которая временно отключает "умность" сайта и позволяет просто провести прямую линию по воздуху.
2. Как это ДОЛЖНО работать у тебя (UX-Магия)
Мы даем юзеру в руки "карандаш", чтобы он сам дорисовывал реальность.
Сценарий (Что видит юзер):
- В панели инструментов горит иконка 🧲 «Магнит» (Умная привязка включена).
- Юзер доходит до берега реки. Он нажимает на Магнит. Кнопка отключается, иконка меняется на ✏️ «Карандаш». Алгоритм выключен!
- Юзер делает клик на другом берегу — и сайт рисует АБСОЛЮТНО ПРЯМУЮ линию через реку. Без вопросов.
- Юзер "перешел" реку, снова нажимает 🧲 «Магнит» и продолжает строить маршрут по дорогам.
Визуальное чудо (Защита от плохой памяти): Этот кусок маршрута "по воздуху" ОБЯЗАН визуально отличаться! Например, он должен стать жирным синим или фиолетовым пунктиром. Зачем это нужно: Открыв трек перед выездом через 2 месяца, юзер посмотрит на карту, увидит пунктир и вспомнит: "Ага! Это же тот брод, который я нарисовал наугад по спутнику. Дороги там может не быть, это мой риск, беру запасные носки".
3. СЕКРЕТЫ ДЛЯ ПРОГРАММИСТА (Как спасти навигатор от зависания)
Нарисовать прямую линию в браузере просто. Но здесь кроются ДВЕ СТРАШНЫЕ ЛОВУШКИ. Из-за них навигаторы Garmin сходят с ума в лесу.
Ловушка №1: Проблема "Голой прямой" (Истерика навигатора)
Если юзер нарисует прямую линию через замерзшее озеро длиной 5 км, он поставит всего ДВЕ точки (Старт и Финиш). ❌ Если так и записать их в GPX, велокомпьютер в лесу запаникует: "Ой! Трек порвался! Расстояние до точки 5 км по воздуху, так нельзя!". И попытается САМ перепроложить маршрут по дорогам, уводя юзера в лес на крюк в 40 км прямо во время поездки.
✅ Как делать ПРАВИЛЬНО (Фейковое уплотнение): Мы должны ОБМАНУТЬ чужой навигатор. "Дружище, перед скачиванием мы должны программно «нашинковать» эту пустую прямую линию фейковыми точками каждые 20-30 метров! (В библиотеке Turf.js это делается одной строчкой turf.lineChunk()). В итоге в файл запишется густая цепочка из 250 координат по прямой. Навигатор увидит плотную цепочку, успокоится и покорно поведет юзера строго по этой прямой!"
Ловушка №2: Провал на графике гор
Когда алгоритм выключен, высота новых ручных точек равна нулю. На графике высот внизу экрана появится жуткий отвесный провал до уровня моря. ✅ Решение (Запрос рельефа): Наш сайт должен отправить эти новые "нашинкованные" точки к бесплатному API Рельефа (например, OpenTopoData). Сервер ответит реальными высотами, и профиль высот останется идеальным!
4. Высший пилотаж UX (Кисточка и Хоткей)
Опытные туристы ненавидят тянуться мышкой к кнопке "Карандаш". Сделай им два подарка:
- Горячая клавиша (Alt / Shift): Юзер просто зажимает и удерживает
Altна клавиатуре. Магнит временно отключается сам! Юзер делает два клика через реку по воздуху, отпускаетAlt, и следующий клик уже автоматически строит умный путь по дорогам. - Свободное рисование (Кисточка): Если при зажатом
Altюзер не просто кликает, а зажимает левую кнопку мыши и ведет курсор, сайт должен рисовать линию непрерывно (как кисточка в Paint). Это позволяет за 3 секунды идеально плавно "обвести" извилистый песчаный берег озера по спутнику!
Эпики и Задачи
Epic 1: Управление режимами (UI/UX)
- Task 1.1: Создать состояние
routingMode: 'auto' | 'manual'и переключатель (Магнит/Карандаш). - Task 1.2: Добавить глобальный слушатель клавиатуры (
keydown/keyup) на клавишуAltдля временного переключения вmanual. - Task 1.3: Реализовать режим
freehand(Кисточка) при зажатомAltи зажатой кнопке мыши (собирать массив координат поmousemoveс троттлингом).
Epic 2: Рендер ручных сегментов
- Task 2.1: Сохранять свойство
mode: 'manual'внутри геометрии конкретных отрезков в сторе. - Task 2.2: Настроить
line-dasharrayв MapLibre для отображения ручных отрезков фиолетовым пунктиром (защита памяти юзера).
Epic 3: Подготовка GPX-экспорта (Обман навигатора)
- Task 3.1: Разделить итоговую геометрию на auto и manual отрезки. Отрезки
autoотправить на Децимацию (RDP), а отрезкиmanual— на Уплотнение (turf.lineChunkпо 20м). - Task 3.2: Отправить уплотненные manual-координаты батч-запросом к Elevation API для восстановления Z-координаты (высоты), чтобы убрать провалы на профиле высот перед склейкой финального GPX.