--- type: brd work_item_id: ET-006 title: "BRD: Загрузка и визуализация GPX-треков" version: 2 status: approved created_at: 2026-05-22 updated_at: 2026-05-22 authors: - "agent:analyst" --- # BRD — ET-006: Загрузка и визуализация GPX-треков ## 1. Цель Дать пользователю возможность загрузить GPX-файл с треком и увидеть его на карте: линию маршрута, waypoints, профиль высот и статистику. Это позволяет визуально оценить чужой или ранее записанный трек перед поездкой. ## 2. Контекст - Приложение уже умеет строить маршруты через OSRM и экспортировать их в GPX (кнопка «Скачать GPX» в sheet-route). - Обратная операция — импорт GPX — отсутствует. - Фаза PH-3 (Smart Route) в roadmap включает работу с GPX. - Фронтенд: MapLibre GL JS + vanilla JS, без фреймворков. - Backend-изменения не требуются — парсинг GPX происходит на клиенте. ## 3. Scope ### In scope | # | Функция | |---|---------| | F-01 | Кнопка загрузки GPX в тулбаре карты | | F-02 | Парсинг GPX 1.1 на клиенте (XML → GeoJSON) | | F-03 | Поддержка нескольких треков в одном файле | | F-04 | Отрисовка линии трека на карте (каждый трек — свой цвет) | | F-05 | Отображение waypoints из GPX как маркеров с именами | | F-06 | Fit bounds — карта центрируется на загруженном треке | | F-07 | Загрузка нескольких файлов (треки накапливаются) | | F-08 | Удаление отдельного трека | | F-09 | Панель управления треками (список, цвет, удаление) | | F-10 | Профиль высот выбранного трека | | F-11 | Статистика трека: длина, набор высоты, сброс высоты, мин/макс высота | | F-12 | Лимит размера файла: 50 МБ | | F-13 | Сохранение GPX-слоёв при переключении стиля карты (тёмная тема / рельеф) | ### Out of scope - Сохранение треков на сервер / в БД - Редактирование трека (обрезка, склейка) - Конвертация из других форматов (KML, FIT, TCX) - Упрощение (simplify) точек трека - Экспорт загруженного трека обратно в GPX - Роутинг по загруженному треку (snap to road) ## 4. Метрики успеха | Метрика | Критерий | |---------|----------| | Загрузка файла | Файл до 50 МБ загружается и парсится без ошибок за ≤ 3 сек (на среднем устройстве) | | Визуализация | Трек отображается на карте как цветная линия | | Waypoints | Маркеры с именами видны на карте | | Fit bounds | Карта автоматически подстраивает zoom/center под трек | | Множественные треки | 5+ треков отображаются одновременно, различимы по цвету | | Удаление | Удалённый трек исчезает с карты и из панели | | Профиль высот | Отображается корректный график высот для выбранного трека | | Статистика | Длина, набор/сброс высоты отображаются корректно | | Сохранение при смене стиля | GPX-треки остаются на карте после переключения тёмной темы / слоёв рельефа | | Не ломает существующий функционал | Роутинг, рельеф, POI, линейка работают как прежде | ## 5. Риски | Риск | Вероятность | Влияние | Митигация | |------|-------------|---------|-----------| | Большой GPX (50 МБ, 500K+ точек) тормозит рендеринг | Средняя | Среднее | Использовать GeoJSON source + line layer (MapLibre оптимизирует); при необходимости — Web Worker для парсинга | | GPX без данных высот → профиль пустой | Средняя | Низкое | Показать сообщение «Данные высот отсутствуют» | | Невалидный GPX → ошибка парсинга | Низкая | Низкое | Показать пользователю понятное сообщение об ошибке | | Конфликт цветов треков с цветами маршрута OSRM | Низкая | Низкое | Использовать отдельную палитру, отличную от цветов роутинга | ## 6. Зависимости - Нет внешних зависимостей - Только фронтенд (vanilla JS + MapLibre GL JS) - Парсинг XML: нативный DOMParser браузера