---
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.
