103 lines
4.9 KiB
Markdown
103 lines
4.9 KiB
Markdown
---
|
||
type: data-requirements
|
||
work_item_id: ET-006
|
||
version: 1
|
||
status: approved
|
||
created_at: 2026-05-22
|
||
authors:
|
||
- "agent:architect"
|
||
---
|
||
|
||
# Data Requirements — ET-006
|
||
|
||
## 1. Сводка: персистентных данных нет
|
||
|
||
ET-006 не вводит серверного хранения. Все данные GPX-треков живут **только
|
||
в памяти браузера** на время сессии (BRD §3 «Out of scope», TRZ NF-04).
|
||
|
||
| Аспект | Решение |
|
||
|---|---|
|
||
| Схема БД (SQLite/Spatialite) | без изменений |
|
||
| Миграции (`migrations/`) | нет |
|
||
| Серверное хранение треков | нет |
|
||
| `localStorage` / `sessionStorage` | **не используется** (объём данных велик) |
|
||
| Время жизни данных | сессия; при перезагрузке страницы — потеря |
|
||
|
||
## 2. Входные данные
|
||
|
||
- Формат: **GPX 1.1**, namespace `http://www.topografix.com/GPX/1/1`
|
||
(с fallback на парсинг без namespace — TRZ REQ-F-02, тест U-08).
|
||
- Источник: локальный файл, выбранный пользователем
|
||
(`<input type="file" accept=".gpx" multiple>`).
|
||
- Ограничение размера: ≤ 50 МБ на файл (TRZ REQ-F-03).
|
||
- Извлекаемые сущности: `<trk>` / `<trkseg>` / `<trkpt>`, `<wpt>`, `<rte>`
|
||
(трактуется как трек).
|
||
|
||
## 3. Внутренняя модель (in-memory)
|
||
|
||
Каноническая модель — `window.gpxTracks` (массив загруженных файлов),
|
||
определена в TRZ §4. Владеет ею `gpx.js` (ADR-002):
|
||
|
||
```javascript
|
||
window.gpxTracks = [
|
||
{
|
||
id: 'gpx-<timestamp>', // уникальный ID
|
||
filename: 'morning_ride', // имя файла без расширения
|
||
color: '#e6194b', // цвет из палитры (8 цветов, цикл)
|
||
tracks: [
|
||
{
|
||
name: 'Morning Ride',
|
||
points: [[lon, lat, ele, time], ...],
|
||
stats: { distanceKm, elevGain, elevLoss, eleMin, eleMax }
|
||
}
|
||
],
|
||
waypoints: [ { lon, lat, name, ele } ],
|
||
sourceId: 'gpx-source-<timestamp>',
|
||
layerId: 'gpx-layer-<timestamp>',
|
||
waypointLayerId: 'gpx-wpt-<timestamp>'
|
||
}
|
||
];
|
||
```
|
||
|
||
Замечания для разработки:
|
||
|
||
- `ele` / `time` опциональны. При отсутствии `<ele>` — `ele = null`,
|
||
поля статистики высот = `null` (TRZ REQ-F-11, тесты U-05, U-14).
|
||
- `window.gpxTracks` — единственный источник правды; объекты карты
|
||
(source / layer / маркеры) **производны** от него и пересоздаются при
|
||
`map.setStyle()` через `rebuildGpxOverlays()` (REQ-F-13, ADR-002).
|
||
- Дополнительно потребуется состояние «активный трек» (для статистики и
|
||
профиля высот) — хранится в `gpx.js`, должно переживать смену стиля.
|
||
|
||
## 4. Объём данных в памяти
|
||
|
||
Предельный файл 50 МБ ≈ 500K+ точек. Ориентировочный транзиентный профиль:
|
||
|
||
| Стадия | Память (порядок) |
|
||
|---|---|
|
||
| Строка файла | ~50 МБ |
|
||
| DOM после `parseFromString` | ~150–300 МБ (освобождается после конвертации) |
|
||
| Модель `points` + GeoJSON source | десятки МБ на файл |
|
||
|
||
TRZ REQ-F-07 не ограничивает число одновременных треков. Накопление
|
||
нескольких предельных файлов может исчерпать память вкладки на слабом
|
||
устройстве — см. риск R-3 в `10-tech-risks.md`.
|
||
|
||
## 5. Приватность
|
||
|
||
GPX-файлы могут содержать персональные данные (координаты поездок,
|
||
метки времени `<time>`). В ET-006 эти данные:
|
||
|
||
- **не передаются на сервер** (парсинг и хранение клиентские);
|
||
- **не сохраняются** между сессиями (нет БД, нет `localStorage`).
|
||
|
||
Следствие: серверных обязательств по хранению/удержанию/удалению
|
||
персональных данных ET-006 **не порождает**. Это сознательное проектное
|
||
свойство, а не упущение.
|
||
|
||
## 6. Выходные данные
|
||
|
||
ET-006 не экспортирует и не записывает данные (экспорт обратно в GPX —
|
||
out of scope, BRD §3). Профиль высот и статистика — производные расчёты,
|
||
существуют только в UI.
|