# Архитектура проекта

## Обзор

Веб-приложение для визуализации шумового загрязнения от воздушных судов
над Московской областью. Состоит из Flask-бэкенда и браузерного фронтенда.

```
┌─────────────────────────────────────────────────────────────────┐
│  Браузер                                                        │
│  index.html                                                     │
│  ├── OpenLayers (карта, треки, зоны шума, флажки, линейка)      │
│  ├── Turf.js (геометрия буферов в реальных км)                  │
│  └── fetch() → /noisemap/api/*                                  │
└────────────────────────┬────────────────────────────────────────┘
                         │ HTTPS (nginx proxy)
                         ▼
┌─────────────────────────────────────────────────────────────────┐
│  nginx (хост)                                                   │
│  openclaw.mva154.duckdns.org                                    │
│  location /noisemap/ → proxy_pass http://172.19.0.2:5555/       │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────────────┐
│  Flask (контейнер OpenClaw, порт 5555)                          │
│  app.py                                                         │
│  ├── /api/flights      — рейсы с шумовыми данными               │
│  ├── /api/noise-config — параметры модели шума                  │
│  ├── /api/airports     — аэропорты региона                      │
│  ├── /api/stats        — статистика                             │
│  ├── /api/usage        — кредиты FR24 API                       │
│  └── /api/live         — live позиции (prod ключ)               │
│                                                                 │
│  noise_model.py — расчёт шума (теорема Пифагора)               │
│  fr24_client.py — клиент FR24 API с кэшированием               │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────────────────┐
│  data/                                                          │
│  ├── flights_*.json    — загруженные треки по аэропортам        │
│  ├── cache_*/          — кэш треков (экономия кредитов)         │
│  └── sample_flights.json — fallback (синтетика)                 │
└─────────────────────────────────────────────────────────────────┘
```

## Технологический стек

| Компонент | Технология | Причина выбора |
|-----------|------------|----------------|
| Карта | OpenLayers 10 | Canvas2D — WebGL не нужен (sandbox браузер) |
| Геометрия зон | Turf.js 6 | buffer/difference в реальных км |
| Бэкенд | Flask 3 | легковесный, достаточно для прототипа |
| Данные | FR24 Explorer API | единственный источник с историческими треками |
| Тайлы | OpenStreetMap (XYZ) | бесплатно, без токена |

## Поток данных

```
FR24 API
  │
  ├── /historic/flight-positions/full → снимки над МО
  │       ↓
  │   raw_AIRPORT_DATE.json (сырые снимки)
  │
  └── /flight-tracks → полный трек рейса
          ↓
      cache_AIRPORT/track_ID.json (кэш треков)
          ↓
      фильтрация по bbox МО (54–57°N, 35.5–40.5°E)
          ↓
      flights_AIRPORT_DATE.json (финальный датасет)
          ↓
      app.py объединяет все flights_*.json
          ↓
      /api/flights → фронтенд
          ↓
      renderFlights() → OL Vector layers + Turf buffers
```
