6.1 KiB
6.1 KiB
Фаза 2, Шаг 2: Витрина данных — объединение FR24 API + табло + RTL-SDR
Статус
🔲 Не начат (зависит от Шага 1)
Цель
Спроектировать и реализовать витрину данных (data mart) которая объединяет три источника:
- FR24 API — треки и рейсы из внешнего API (схема
fr24_ext) - Онлайн табло — расписание и статусы рейсов (схема
fr24_ext) - RTL-SDR dongle — локально принятые ADS-B треки (схема
fr24)
Витрина — это набор материализованных представлений и таблиц в схеме fr24_mart, которые склеивают данные из всех источников в единую модель для визуализации и анализа.
Бизнес-требования
BR-1: Единая модель рейса
- Рейс идентифицируется по callsign + дата
- Один рейс может иметь данные из нескольких источников одновременно
- Приоритет данных: RTL-SDR (наиболее точный) > FR24 API > табло
- Витрина должна показывать из какого источника взяты данные
BR-2: Обогащение данных
- К треку из RTL-SDR добавлять данные из табло (авиакомпания, маршрут, тип ВС)
- К треку из FR24 API добавлять данные из табло (статус, фактическое время)
- Если рейс есть в табло но нет трека — показывать как "нет данных о треке"
BR-3: Покрытие источников
- Метрика: % рейсов из табло для которых есть трек (RTL-SDR или FR24)
- Метрика: % рейсов с треком из RTL-SDR vs только FR24
- Метрика: среднее качество трека (кол-во точек, покрытие маршрута)
BR-4: Шумовая модель
- Витрина должна содержать поле
noise_scoreдля каждой точки трека - Расчёт: на основе высоты, скорости, типа ВС (упрощённая модель из прототипа)
- Агрегация: суммарный шум по сетке 0.01° × 0.01° за период
Технические требования
Схема fr24_mart
-- Единая таблица рейсов (объединение источников)
fr24_mart.flights_unified (
unified_id, callsign, flight_date,
origin_iata, destination_iata, airline_iata, aircraft_type,
scheduled_dep, actual_dep, status,
has_rtlsdr_track BOOL, has_fr24_track BOOL,
rtlsdr_points INT, fr24_points INT,
source_priority TEXT, -- 'rtlsdr' | 'fr24' | 'schedule_only'
updated_at
)
-- Единые точки трека (лучший доступный источник)
fr24_mart.track_points_unified (
point_id, unified_id, observed_at,
lat, lon, altitude_m, speed_kt, heading_deg,
source TEXT, -- 'rtlsdr' | 'fr24'
noise_score FLOAT
)
-- Шумовая сетка (агрегат)
fr24_mart.noise_grid (
grid_id, grid_lat FLOAT, grid_lon FLOAT,
period_date DATE,
flight_count INT, total_noise_score FLOAT,
avg_altitude_m FLOAT,
updated_at
)
-- Покрытие источников (метрики)
fr24_mart.source_coverage (
coverage_date DATE,
total_schedule INT,
with_rtlsdr INT, with_fr24 INT, schedule_only INT,
rtlsdr_pct FLOAT, fr24_pct FLOAT
)
Обновление витрины
- Отдельный контейнер
fr24-martили cron внутри существующего - Обновление каждые 10 минут
- Инкрементальное (только новые данные)
ТЗ для Dev-агента
Файлы для создания
tasks/flightradar24/ingest/mart/
Dockerfile
main.py # планировщик обновления витрины
build_unified.py # логика объединения источников
noise_model.py # расчёт noise_score (перенос из прототипа)
requirements.txt
tasks/flightradar24/db/init/004_schema_mart.sql # DDL схемы fr24_mart
Обновить
tasks/flightradar24/compose/docker-compose.yml— добавить сервисmart
Тест-кейсы
TC-1: Объединение источников
- Рейс с треком из RTL-SDR и записью в табло — объединяется корректно
- Рейс только в табло — создаётся запись с
source_priority = 'schedule_only' - Рейс только в RTL-SDR (нет в табло) — создаётся с
source_priority = 'rtlsdr'
TC-2: Приоритет источников
- При наличии RTL-SDR трека — используется он, не FR24
- При отсутствии RTL-SDR — используется FR24
TC-3: Шумовая модель
- noise_score рассчитывается для каждой точки трека
- noise_grid обновляется после добавления новых точек
- Агрегация по сетке 0.01° корректна
TC-4: Метрики покрытия
- source_coverage обновляется ежедневно
- % покрытия считается корректно
TC-5: Производительность
- Обновление витрины за 10 минут занимает < 60 сек
- Запрос noise_grid за 1 день < 500 мс
Зависимости
- Шаг 1 (схема fr24_ext должна быть заполнена)
- Схема fr24 (RTL-SDR данные)
- Модель шума из прототипа (tasks/flightradar24/prototype/docs/NOISE_MODEL.md)