auto-sync: 2026-05-02 06:40:01

This commit is contained in:
Stream
2026-05-02 06:40:06 +03:00
parent 05ac2d631d
commit ca706cc416
2 changed files with 320 additions and 0 deletions

BIN
enduro_architecture.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -0,0 +1,320 @@
# Enduro Trails — Концепция и Архитектура
**Дата:** 02.05.2026
**Автор:** Стрим 🌊
**Статус:** Концепция, ожидает согласования со Славой
---
## 🎯 Проблема
Обычные OSM-карты оптимизированы для автомобилей — они ярко подсвечивают магистрали, а грунтовые дороги и тропы прячутся в шум. Для эндуро это **бесполезно**: асфальт не интересен, хочется увидеть где можно проехать по-настоящему.
## 💡 Решение
Создать карту, где **грунтовки/тропы — главный слой**, а асфальт — тусклый фон. Плюс фичи для поиска и построения красивых маршрутов.
---
## Архитектура
Схема архитектуры: `enduro_architecture.png`
```
OSM данные → ETL парсинг → Spatialite/PostGIS
├── Слой: Грунтовки
├── Слой: Рельеф (SRTM)
├── Слой: Препятствия
├── Роутинг (OSRM/GraphHopper)
└── Аттрактивность (озёра, виды)
API Backend (FastAPI)
┌───────────────────┼───────────────────┐
↓ ↓ ↓
Фронт (PWA) Экспорт GPX/KML Мобильный оффлайн
```
---
## Компоненты
### 1. Источник данных
| Метод | Плюсы | Минусы | Когда нужен |
|-------|--------|---------|-------------|
| **PBF дамп** (Geofabrik) | Один раз скачал → локально нет API limits | Обновление раз в неделю | Основной метод |
| **Overpass API** | Свежие данные (1-5 мин) | Rate limits, нужен интернет | По требованию / дельты |
**Рекомендация:** PBF как база + Overpass для свежих изменений
**Регион:** По умолчанию Центральный ФО, потом — расширение на всю Россию
### 2. ETL Парсинг
**Технология:** Pyrosm (Python + osmium) или нативный Osmium
**Что парсим:**
#### Дороги (highway=*)
- `track` — грунтовые дороги (основной фокус!)
- `tracktype=grade1-5` — классификация по твёрдости
- `surface=unpaved/gravel/sand/mud/earth` — покрытие
- `trail_visibility=yes/no/negative` — видимость тропы
- `path` — тропы (пешие + вел/мото)
- `mtb:scale=0-6` — сложность МТБ
- `sac_scale=hiking/alpine/demanding` — уровень
- `unclassified` + `residential` + `service` + `footway` — только для связки (фон)
- `motorway/trunk/primary/secondary/tertiary` — асфальт (фон, минимум деталей)
#### Рельеф
- SRTM DEM (30 м) или SRTM 90 м
- Тангенс угла наклона → визуализация крутизны
- Перепады высот для оценки аттрактивности
#### Препятствия и ориентиры
```
waterway=ditch + ford — броды и канавы (пройти или нет?)
waterway=stream + ford — ручьи с бродом
natural=wetland — болота (сложно!)
natural=sand — пески
natural=mud — грязевые участки
power=line + tower — ЛЭП как визуальные ориентиры
barrier=gate + bollard — шлагбаумы, столбики
highway=milestone — километровые столбы
abandoned=* — заброшенные дороги, шахты
ruins=yes — ruins, объекты интереса
leisure=nature_reserve — заповедники, ограничения
boundary=national_park — нацпарки
man_made=bridge
ford=yes — броды!
surface=water + highway=track — переправы
highway=construction — строящиеся дороги (проехать?)
```
### 3. Хранилище
**Основной выбор:** Spatialite (SQLite с SpatialExtensions)
- Меньше зависимостей, portable
- Файл .sqlite, легко бэкап/мигрировать
- Достаточно для одного региона
**Альтернатива:** PostGIS (есть на FR24 VM!)
- Если нужен мультирегион или больше данных
- Лучшая производительность на больших масштабах
- Уже есть инфраструктура
**Структура таблиц:**
```sql
-- Дороги
CREATE TABLE trails (
id INTEGER PRIMARY KEY,
osm_id INTEGER,
highway_type TEXT, -- track, path, etc.
track_type TEXT, -- grade1-5
surface TEXT, -- paved, gravel, sand, etc.
name TEXT,
geometry GEOMETRY, -- LINESTRING
length_m REAL, -- длина в метрах
start_elevation REAL, -- высота начала
end_elevation REAL, -- высота конца
max_slope REAL, -- макс уклон %
avg_slope REAL, -- средний уклон %
mtb_scale TEXT, -- mtb:scale
visibility TEXT, -- trail_visibility
access TEXT, -- access=private/no
bridge TEXT, -- yes/no
ford TEXT, -- yes/no
tags JSON -- остальные теги
);
-- Точки интереса (POI)
CREATE TABLE poi (
id INTEGER PRIMARY KEY,
osm_id INTEGER,
poi_type TEXT, -- lake, viewpoint, ruins, etc.
name TEXT,
geometry GEOMETRY, -- POINT
elevation REAL,
tags JSON
);
-- Слой рельефа
CREATE TABLE elevation_grid (
id INTEGER PRIMARY KEY,
geometry GEOMETRY, -- POLYGON (ячейка сетки)
min_elev REAL,
max_elev REAL,
avg_elev REAL,
slope_pct REAL -- наклон
);
```
### 4. Роутинг
**Технология:** OSRM (Open Source Routing Machine) или GraphHopper
**Кастомизация профиля "Enduro":**
| Фактор | Вес |
|--------|-----|
| Грунтовки grade3-5 | 🟢 Минимальный вес (привлекают!) |
| Асфальт primary+ | 🔴 Максимальный вес (избегать) |
| Рядом с озером/видом | 🟢 Бонус (притягивает маршрут) |
| Броды | ⚠️ Средний (зависит от настроек) |
| Болота/пески | 🔴 Высокий (сложность) |
| Частная территория | ⛔ Проклятие (не роутить!) |
| Макс уклон > 20% | ⚠️ Высокий (по желанию) |
### 5. Фичи для построения маршрутов
#### 🛤️ "Дикий путь" (Wild Route)
- **Вход:** точки А и Б
- **Цель:** максимизировать грунтовку, минимизировать асфальт
- **Алгоритм:** модифицированный Dijkstra с весами (грунтовка = -1, асфальт = +10)
- **Настройки:** % грунтовки (50/70/90%), максимальная дистанция
#### 🎨 "Красивый маршрут" (Scenic Route)
- **Вход:** начальная точка, желаемая дистанция
- **Цель:** замкнутый круг через живописные места
- **Оценка аттрактивности:**
- Близость к водоёмам (+10)
- Перепад высот > 300 м (+15)
- Видовые точки на маршруте (+20)
- Наличие заброек/руин (+10)
- Тропы с trail_visibility=yes (+5)
- Прохождение через ЛЭП как ориентир (+3)
#### 🏔️ "Горка" (Elevation Route)
- **Вход:** точка старта, желаемый набор высоты
- **Цель:** максимизировать перепад высоты, минимизировать дистанцию
- **Использование:** тренировка, эндуро-кросс
#### 🔗 "Связка" (Link Route)
- **Вход:** два существующих трека
- **Цель:** соединить их грунтовками, не по асфальту
#### 📍 "Разведка" (Recon Mode)
- **Вход:** точка на карте
- **Выход:** все грунтовые дороги в радиусе X км
- **Использование:** посмотреть что есть вокруг, исследовать местность
#### 🚧 "Препятствия" (Obstacle Layer)
- Карта с подсветкой всех бродов, шлагбаумов, болот, ЛЭП
- Фильтр по сезонам: некоторые дороги непроходимы в межсезонье
- Отчёт "что тебя ждёт" перед поездкой
#### 📊 Статистика маршрута
- Общая дистанция, % грунтовки, % асфальта
- Набор/потеря высоты
- Максимальный уклон
- Прогноз времени (зависит от сложности)
- Техничность: 1-5 по grade дорогам
---
## Фронтенд
### Веб-приложение (основное)
- **Картографический движок:** MapLibre GL JS (open source форк Mapbox GL)
- **Стили:** кастомный Mapbox GL Style JSON с перевёрнутой логикой:
- Грунтовки = яркие, толстые, с градиентом по grade
- Асфальт = тонкие серые линии
- POI = иконки (озёра 💙, видовые точки 📷, заброек 🏚️)
- Рельеф = heatmap с тангенсом угла
- **Функции:**
- Клик → статистика дороги (название, длина, grade, покрытие)
- Рисование маршрута (ручной + автоматический роутинг)
- Поиск по названиям/тэгам
- Фильтр слоёв (вкл/выкл)
- Экспорт GPX/KML
### PWA (Mobile)
- Progressive Web App для работы оффлайн
- Кэш тайлов для оффлайн навигации
- GPS трекинг в реальном времени
- Оффлайн роутинг (загрузка графа в браузер)
---
## Данные и лицензии
### OpenStreetMap
- **Лицензия:** ODbL (Open Database License)
- **Требования:** атрибуция (© OpenStreetMap contributors)
- **Коммерческое использование:** разрешено с сохранением атрибуции
### SRTM (рельеф)
- **Источник:** NASA/USGS
- **Лицензия:** Public Domain
- **Качество:** 30 м (1 arc-second), 90 м для регионов без SRTM 30 м
### Overpass API
- **Термины использования:** https://wiki.openstreetmap.org/wiki/Overpass_API
- **Rate limits:** необходимо уважать (не чаще 1-2 запросов/сек)
- **Рекомендуемое использование:** для дельта-обновлений, not bulk download
---
## Технический стек (предварительный)
| Компонент | Технология | Обоснование |
|-----------|------------|-------------|
| Парсинг PBF | Pyrosm (Python) + Osmium | Простота, Python-стек |
| Хранилище | Spatialite | Портативность, zero-config |
| Роутинг | OSRM + кастомный профиль | Быстрый, проверенный |
| API Backend | FastAPI (Python) | Async, типизация |
| Тайлы | TileServer GL или самописный | Поддержка MapLibre |
| Фронт | MapLibre GL JS + React/Vanilla | Open source, производительность |
| Мобильный | PWA + Service Workers | Оффлайн, без store |
---
## Этапы реализации
### Фаза 1: MVP (дьявол в деталях)
- [ ] Настройка PBF загрузки выбранного региона
- [ ] Парсинг и фильтрация highway=track + surface
- [ ] Импорт в Spatialite
- [ ] Базовый рендеринг тайлов (грунтовки яркие, асфальт серый)
- [ ] Веб-карта с MapLibre GL
### Фаза 2: Роутинг
- [ ] Установка OSRM + кастомный профиль "Enduro"
- [ ] API для роутинга (точки А→Б → маршрут)
- [ ] "Дикий путь" — минимизация асфальта
- [ ] Экспорт GPX
### Фаза 3: Слои и фичи
- [ ] Импорт SRTM DEM + расчёт уклонов
- [ ] Слой рельефа
- [ ] POI (водоёмы, видовые точки, заброшки)
- [ ] Слой препятствий (броды, шлагбаумы, болота)
### Фаза 4: Продвинутый роутинг
- [ ] "Красивый маршрут" — через живописные места
- [ ] "Горка" — макс набор высоты
- [ ] "Разведка" — грунтовки вокруг точки
- [ ] Оценка маршрута (дистанция, сложность, время)
### Фаза 5: Мобильность
- [ ] PWA с оффлайн тайлами
- [ ] GPS трекинг
- [ ] Интеграция с OsmAnd/Locus (экспорт)
---
## Вопросы для Славы
1. **Регион:** какой регион берём для начала? (ЦФО, вся Россия, конкретная область?)
2. **Хостинг:** разворачиваем FR24 VM (PostGIS) или локально на mva154?
3. **Бюджет на данные:** SRTM 30 м бесплатные, но если нужен ASTER (15 м) — $50/регион
4. **Мобильное:** PWA достаточно, или нужно нативное приложение (Android)?
5. **Совместное использование:** сделать публичным (кто хочет пользуется) или только для Славы?
6. **Приоритет:** что важней — роутинг, красивая визуализация, или оффлайн работа?
---
*Документ будет дорабатываться после согласования со Славой*