Skip to content

Use Case #11: Анализ Ветра 💨 (Где ветер будет в спину?)

1. Жизненная ситуация (Боль пользователя)

Представь: Велосипедист строит себе круговой маршрут на 80 км. Выезжает солнечным утром. Первые 40 км он летит со скоростью 35 км/ч, не потеет, чувствует себя суперменом. Доезжает до середины пути, разворачивается домой... и упирается в невидимый бетонный блок. Оказывается, всё это время ему дул мощный попутный ветер, а теперь предстоит 40 км жесткого встречного ветра ("мордодуя"). Скорость падает до 12 км/ч, колени болят, юзер возвращается выжатым как лимон. Что думает юзер: "Блин! Если бы я заранее знал про ветер, я бы поехал этот круг в ОБРАТНУЮ сторону! Сначала пострадал бы, пока есть силы, а домой летел по ветру с кайфом!".


2. Как это ДОЛЖНО работать у тебя (UX-Магия)

Мы превращаем скучную синюю линию в умный индикатор страданий и радости.

Сценарий (Что видит юзер):

  1. Юзер построил маршрут.
  2. В панели инструментов нажимает тумблер 💨 «Показать ветер».
  3. Визуальное чудо: Линия мгновенно перекрашивается в цветную гирлянду:
    • 🔴 Ярко-красные куски: Встречный ветер. Тут будет больно.
    • 🟢 Ярко-зеленые куски: Попутный ветер в спину. Ты будешь лететь.
    • 🟡 Серые/Желтые куски: Боковой ветер (терпимо).
  4. Юзер видит, что вторая половина пути вся красная. Он вспоминает про кнопку 🔄 «Развернуть маршрут» (База №2). Нажимает её.
  5. Трек перестраивается в обратную сторону, и цвета меняются местами! Возвращение домой становится зеленым. Юзер счастлив.

3. СЕКРЕТ ДЛЯ ПРОГРАММИСТА (Как это написать без нейросетей)

Здесь не нужна сложная метеорологическая физика, только базовая геометрия и бесплатное API.

Инструкция для кода:

  • Шаг 1 (Угол Дороги): Код режет линию маршрута на куски по 1 км (или по секциям). Для каждого куска вычисляет Азимут движения (turf.bearing). Например: едем строго на Юг = Азимут 180°.
  • Шаг 2 (Угол Ветра): Сайт делает скрытый запрос к погодному API (Open-Meteo). Спрашивает: "Откуда дует ветер?". API отвечает: "Ветер южный, 180°" (Дует С юга НА север).
  • Шаг 3 (Математика совпадений): Код вычисляет дельту (разницу) углов.
    • Если юзер едет на Юг (180°), и ветер южный (180°) ➡️ Они встретятся лбами! Встречный ветер (Красим в КРАСНЫЙ).
    • Если юзер едет на Север (0°), а ветер южный (180°) ➡️ Толкает в спину! (Красим в ЗЕЛЕНЫЙ).
    • Разница около 90° ➡️ Боковой ветер (ЖЕЛТЫЙ).

4. ВАЖНАЯ ЛОВУШКА (Проблема путешествия во времени)

Ошибка новичка: Запрашивать ветер на "текущую секунду". Если юзер строит трек вечером в пятницу, сайт покрасит линию ночным штилем, а юзеру ехать завтра в полдень в шторм! Сайт наврет. ✅ Как делать ПРАВИЛЬНО: Рядом с кнопкой "Показать ветер" обязан быть селектор времени: [ Выберите время старта: Завтра 10:00 ]. Код должен запрашивать Прогноз (Forecast) на выбранный час. Только тогда цвета будут честными на 100%.


5. Идеальный экспорт (Внедряем шпаргалку в файл)

Мы помним, что железный Garmin не понимает цветных линий. Магия автоматизации (Интеграция с Базой №6 - Cue Sheets): Когда юзер жмет "Скачать GPX", скрипт анализирует массив. Если он видит впереди длинный кусок (например, >5 км) жуткого красного ветра со скоростью более 15 км/ч, он автоматически ставит невидимую точку (<wpt>) перед этим участком с текстом: ⚠️ ВСТР. ВЕТЕР (15км/ч). В лесу навигатор громко запищит, юзер увидит предупреждение, переключит передачу и морально приготовится поработать ногами.


Эпики и Задачи

Epic 1: Интеграция Weather API

  • Task 1.1: Подключить Open-Meteo API. Реализовать функцию fetchWindForecast(lat, lng, timestamp).
  • Task 1.2: Сделать UI контрол "Выбор времени старта" (с шагом в 1-3 часа на ближайшие 5 дней).

Epic 2: Геометрический процессор ветра (Turf.js)

  • Task 2.1: Использовать turf.lineChunk для разбиения маршрута на километровые сегменты.
  • Task 2.2: Для каждого сегмента рассчитать turf.bearing(start, end).
  • Task 2.3: Написать утилиту calculateWindFactor(pathBearing, windBearing) возвращающую коэффициент от -1 (строго в лицо) до +1 (строго в спину).

Epic 3: MapLibre Визуализация (Цветовая шкала)

  • Task 3.1: Добавить новый слой-гирлянду поверх основного маршрута при активации режима Ветра.
  • Task 3.2: Использовать Data-Driven Styling в MapLibre для покраски отрезков на основе windFactor: [-1: 'red', 0: 'yellow', 1: 'green'].

Epic 4: Auto Cue-Sheet Generator (Экспорт)

  • Task 4.1: Перед сборкой GPX находить непрерывные массивы сегментов с windFactor < -0.8.
  • Task 4.2: Генерировать и инжектить <wpt> (Тип: Warning) в начало этого сектора, соблюдая лимит 15 символов.