Skip to content

Use Case #13: Децимация для GPX («Умная диета» для файлов)

1. Жизненная ситуация (Катастрофа в лесу)

Представь: твой сайт работает отлично. Пользователь построил классный длинный маршрут на 200 километров, нажал кнопку «Скачать GPX» и закинул этот файлик в свой дорогущий велокомпьютер на руле (например, Garmin) или в смарт-часы.

Пользователь выезжает в лес. И вдруг... его дорогущий Garmin начинает жутко тормозить. Карта на экране зависает на 5–10 секунд. Нажимаешь кнопку — устройство не реагирует. В итоге посреди леса навигатор просто пишет «Out of Memory» (Не хватает памяти) и выключается. Юзер заблудился.

Кого он винит? Он не винит свой прибор. Он скажет: "Мой Garmin стоит 500 баксов, он никогда не вис. Это тот новый сайт выдал мне кривой, битый файл!". И он больше никогда к тебе не вернется.


2. В чем реальная проблема? (Слишком много "бусинок")

Проблема в том, что твой сайт оказался слишком хорошим и точным. В современном веб-браузере синяя линия маршрута выглядит идеально плавной, потому что под капотом сервер ставит невидимую координату на каждый метр дороги. Для маршрута в 200 километров твой сайт честно создаст список из 200 000 точек. Файл будет весить 15 Мегабайт. Твой ноутбук переварит такой текст мгновенно. А вот процессор в часах на руке — очень слабенький, почти как в старых телефонах. Если засунуть сотни тысяч точек в часы, они сойдут с ума, пытаясь их прочитать. Файл нужно делать "легким".


3. Как делают плохие сайты (Тупое удаление)

Глупый программист понимает: "Файл слишком тяжелый. Давай просто заставим код удалить каждую вторую точку!".

Что получается: Файл стал легче. НО когда в лесу начинается извилистая тропинка, "тупое" удаление точек приводит к тому, что крутые повороты "срезаются". Вместо плавной дуги на экране навигатора появляется грубый, острый угол. Юзер смотрит в экран, едет прямо... и падает в овраг, потому что на самом деле тропа плавно сворачивала.


4. Как это ДОЛЖНО работать (Умный хирург)

Твой сайт должен удалять точки не тупо "через одну", а только там, где они действительно не нужны (на этапе "Скачать").

  • Сценарий А: Прямое шоссе. Программа смотрит на кусок трассы длиной 10 км, который идет идеально прямо. Там 10 000 точек. Алгоритм понимает: "Зачем нам 10 000 точек на прямой? Навигатор и так соединит 2 точки прямой линией!". Сайт оставляет одну точку в начале шоссе и одну в конце. А 9 998 точек безжалостно удаляет!
  • Сценарий Б: Извилистая тропа. Сайт видит, что тропа петляет. Здесь алгоритм понимает: "Тут нельзя удалять ничего, иначе сломаем поворот!". И сайт оставляет все 100% точек, чтобы геометрия была идеально плавной.

5. СЕКРЕТ ДЛЯ ПРОГРАММИСТА (Как это написать)

Успокой программиста и скажи: "Всё уже придумано до нас. Этот фокус называется Алгоритм Рамера-Дугласа-Пекера (RDP). В стандартной библиотеке Turf.js есть готовая функция turf.simplify(). Перед тем, как собрать GPX-файл, просто пропусти нашу 'жирную' линию через эту функцию. Она сама выбросит мусор на прямых дорогах и оставит точки на поворотах".

6. Твой триумф (Итог для юзера)

Вместо файла на 15 Мегабайт, твой сайт отдаст юзеру аккуратненький файлик на 500 Килобайт (сжатие 80-90%). Старые часы "глотают" этот файл за долю секунды. Навигация работает без тормозов, батарейка экономится. А на экране юзер вообще не заметит разницы — все нужные повороты остались на месте! Юзер будет думать: "Какой крутой сервис! От других сайтов мой навигатор тупит, а тут — всё летает!".


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

Epic 1: Алгоритм RDP Децимации

  • Task 1.1: Использовать turf.simplify() на итоговом LineString перед упаковкой в XML.
  • Task 1.2: Вынести настройку параметра tolerance (допуск) в конфиг, чтобы опытным путем подобрать баланс между "весом" файла и закругленностью поворотов (обычно 0.0001 - 0.0005).

Epic 2: Исключение (Segment Protection)

⚠️ Критическое правило: Алгоритм сжатия НЕ ДОЛЖЕН применять упрощение к "Ручным" сегментам (из Use Case #9).

  • Task 2.1: При формировании файла разбивать геометрию по свойствам сегмента.
  • Task 2.2: Отрезки routingMode === 'auto' прогонять через turf.simplify().
  • Task 2.3: Отрезки routingMode === 'manual' вклеивать в итоговый массив в сыром виде (чтобы сохранить "нашинкованные" каждые 20 метров точки для обмана навигатора на бездорожье).