Files
enduro-trails/docs/work-items/ET-007/08-data-requirements.md
claude-bot 231c99c045
All checks were successful
CI / lint (push) Successful in 3s
CI / test (push) Successful in 6s
CI / build (push) Successful in 1s
docs(ET-007): architecture - ADR, infra-requirements, data-requirements, tech-risks
2026-05-31 20:01:06 +00:00

136 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: data-requirements
work_item_id: ET-007
title: "Требования к данным — ET-007: Спутниковая карта (Схема / Спутник)"
version: 1
status: approved
created_at: 2026-05-31
authors:
- "agent:architect"
---
# Требования к данным — ET-007
## 1. Резюме
ET-007 не вводит и не изменяет ни одной серверной структуры данных.
Единственные «данные» фичи на стороне приложения — пользовательский
UI-выбор подложки в `localStorage`. На стороне внешнего источника —
бесконтекстные растровые плитки PNG/JPEG, потребляемые браузером.
## 2. Серверные данные
| Аспект | Требование |
|--------|------------|
| Изменения схемы SQLite / Spatialite | Нет |
| Новые таблицы / колонки / индексы | Нет |
| Миграции (`migrations/`) | Нет |
| Изменения контракта API `/api/*` | Нет |
| Серверное логирование выбора подложки | Нет — выбор остаётся в браузере |
## 3. Внешние входные данные (спутниковые тайлы)
| Параметр | Значение |
|----------|----------|
| Источник | Esri World Imagery (см. ADR-004 §1) |
| URL-шаблон | `https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}` |
| Протокол | HTTPS, без авторизации |
| Формат | растровый PNG / JPEG, 256 × 256 px |
| Размер плитки | ≈ 3080 КБ |
| Диапазон z | 0 … 19 |
| Привязка | Web Mercator (EPSG:3857) — совместима с MapLibre по умолчанию |
| Атрибуция (обязательна) | `"Source: Esri, Maxar, Earthstar Geographics, and the GIS User Community"` |
| Содержимое запроса | `{z}`, `{y}`, `{x}` — обезличенные координаты тайла; больше ничего не передаётся |
| Cookies / заголовки авторизации | Не отправляются |
Изменение MapLibre source при будущей смене провайдера локализовано
одним объектом source-spec в `applyBaseLayer()` — это единственная
точка системы, знающая URL Esri (см. ADR-004 §1 «точка расширения»).
## 4. Клиентское хранилище
| Параметр | Значение |
|----------|----------|
| Механизм | `localStorage` |
| Ключ | `map-base-layer` |
| Допустимые значения | `"schematic"` \| `"satellite"` |
| Значение по умолчанию | `"schematic"` (при отсутствии ключа или некорректном значении) |
| Объём полезной нагрузки | ≤ 16 байт на браузер |
| Запись | в `onBaseLayerToggle(base)` при изменении выбора |
| Чтение | в `restoreBaseLayerState()` — при старте приложения и в каждом вызове `rebuildMapOverlays()` (после `map.setStyle()`) |
| Миграция со старых значений | Не требуется — ключ новый, конфликта нет |
Имя ключа `map-base-layer` соответствует сложившейся в проекте
конвенции UI-настроек в `localStorage` (`enduro-theme-mode`,
`distance_unit`, `terrain-*`, `trails-*`, `poi-visible`,
`MARKERS_KEY`). Префиксации проектом не предусмотрено.
## 5. Внутреннее состояние модуля
Дополнительные неперсистентные данные, удерживаемые в памяти браузера
в течение сессии:
| Поле | Тип | Назначение |
|------|-----|------------|
| текущий базовый слой | `'schematic' \| 'satellite'` | проекция `localStorage['map-base-layer']` |
| baseline-значения paint POI (text-halo, circle-stroke) | объекты per-layer | референсы для возврата с «Спутник» на «Схему» |
| baseline-значения `background-color` для тёмной/светлой темы | две строковые константы | `#f0ede6` (light), `#1a1a1a` (dark) — задублированы из `style*.json`, см. ADR-004 §6 |
| флаг «satellite source уже добавлен в стиль» | bool | оптимизация: при повторном входе в «Спутник» в той же сессии стиля не добавляем повторно |
baseline POI-значения и `background-color` — единственные
**задублированные** значения между `style*.json` и `app.js`. Их
рассинхрон ловится UI-тестами AC-04 и AC-06.
## 6. Halo-слои в `style.json`
В обоих `src/web/style.json` и `src/web/style-dark.json` добавляются
парные «underlay»-слои halo для линий грунтовок/троп, например:
| Базовый слой | Halo-слой | Назначение |
|--------------|-----------|------------|
| `trails-grade1` | `trails-grade1-halo-satellite` | широкая полупрозрачная белая обводка под основной линией |
| `trails-grade2` | `trails-grade2-halo-satellite` | то же |
| ... | ... | для каждой grade и для paths/bridleway |
| `paths-bridleway` | `paths-bridleway-halo-satellite` | то же |
Параметры halo-слоёв (ширина, цвет, opacity) — на этапе разработки;
дизайн уточняется визуальной проверкой на тёмных снимках. У всех
halo-слоёв `layout.visibility = "none"` по умолчанию; включаются в
`applyBaseLayer('satellite')` через `setLayoutProperty`. Точные
численные значения halo — данные дизайна, не данные домена; их
изменение не требует миграции пользовательского состояния.
## 7. Персональные данные
| Канал | PII |
|-------|-----|
| `localStorage['map-base-layer']` | нет (обезличенный UI-флаг) |
| Запросы к `tile.openstreetmap.org` (уже существуют) | IP пользователя становится виден OSM при использовании «Схемы» |
| Запросы к `server.arcgisonline.com` (новые) | IP пользователя становится виден Esri **только** при активном режиме «Спутник» (лениво — см. ADR-004 §3) |
| Передача координат поездок / маршрутов на сторонние сервисы | Нет — координаты в URL не передаются, передаётся только `{z}/{y}/{x}` тайл-сетки |
Это **не регрессия** относительно текущего состояния (OSM-tile
уже работает на тех же условиях), но — расширение списка третьих
сторон, к которым обращается клиент. Пользователи, никогда не
включающие «Спутник», ни одного запроса в Esri не отправляют — это
прямое следствие ленивого создания source (ADR-004 §3). См. также
`10-tech-risks.md`, R-3.
Серверных обязательств по хранению / удержанию / удалению PII
ET-007 **не порождает** — на mva154 никаких новых данных не оседает.
## 8. Резервное копирование и ретенция
Не применимо — серверных данных у ET-007 нет. Клиентский
`localStorage['map-base-layer']` не подлежит резервному копированию
(пользовательская UI-настройка, утрата которой безболезненна).
## 9. Вывод
Серверная модель данных, схемы и контракты API ET-007 **не
затрагивает**. Единственное персистентное данное — обезличенный
клиентский флаг `localStorage['map-base-layer']` (≤ 16 байт).
Внешний источник предоставляет публичные растровые тайлы; никакие
данные пользователя в запросах к нему не передаются помимо штатной
для HTTP-клиента информации (IP, User-Agent).