# Radio Link Service Микросервис для расчёта радиосвязи между двумя точками с учётом рельефа (SRTM), крон деревьев (ETH Canopy) и зданий OSM (PostGIS). ## Быстрый старт ```bash docker compose up -d --build ``` Сервис: http://localhost:8000 Документация API: http://localhost:8000/docs ## Подготовка данных (офлайн) После загрузки данных сервис работает полностью офлайн. ### 1. Рельеф SRTM GL1 (30 м) ```bash python scripts/download_srtm.py --bbox 59.0 30.0 60.0 31.0 --output data/srtm ``` Для OpenTopography может потребоваться API key: ```bash python scripts/download_srtm.py --bbox 59.0 30.0 60.0 31.0 --api-key YOUR_KEY ``` ### 2. Высота крон ETH Global Canopy Height 2020 (10 м) ```bash python scripts/download_canopy.py --bbox 59.0 30.0 60.0 31.0 --output data/canopy ``` ### 3. Здания OSM Через bbox (онлайн, osmnx): ```bash python scripts/import_buildings.py --bbox 59.0 30.0 60.0 31.0 --truncate ``` Через локальный PBF: ```bash python scripts/import_buildings.py --pbf data/osm/region.osm.pbf --truncate ``` ## Примеры запросов ### Health ```bash curl http://localhost:8000/health ``` ### Расчёт линка ```bash curl -X POST http://localhost:8000/v1/link \ -H "Content-Type: application/json" \ -d '{ "from": {"lat": 59.93, "lng": 30.33, "antenna_height_m": 2.0}, "to": {"lat": 59.95, "lng": 30.40, "antenna_height_m": 2.0}, "frequency_mhz": 433.5, "fresnel_clearance": 0.6 }' ``` Опциональные параметры link budget: `tx_power_dbm` (default 20), `rx_sensitivity_dbm` (default -137). ### Профиль высот (только рельеф) ```bash curl "http://localhost:8000/v1/elevation-profile?from_lat=59.93&from_lng=30.33&to_lat=59.95&to_lng=30.40&step_m=30" ``` ### Зона покрытия ```bash curl -X POST http://localhost:8000/v1/coverage \ -H "Content-Type: application/json" \ -d '{ "origin": {"lat": 59.93, "lng": 30.33, "antenna_height_m": 10.0}, "frequency_mhz": 433.5, "radius_m": 5000, "resolution_m": 100 }' ``` Лимит сетки: `MAX_GRID_POINTS=10000` (env). При превышении — HTTP 400. ## Локальный запуск без Docker ```bash pip install -r requirements.txt export DATABASE_URL=postgresql://radio:radio@localhost:5432/radio uvicorn app.main:app --reload ``` ## Структура - `app/` — FastAPI приложение - `data/srtm/` — GeoTIFF тайлы рельефа - `data/canopy/` — GeoTIFF тайлы крон - `data/osm/` — PBF файлы OSM - `scripts/` — загрузка данных и импорт зданий - `sql/init.sql` — схема PostGIS ## Алгоритм `/v1/link` 1. Сэмплирование трассы с шагом 30 м (геодезическая линия) 2. Для каждой точки: SRTM + canopy + max(building height) 3. LOS-линия между антеннами 4. Радиус Френеля: `r = 17.3 * sqrt(d1*d2 / (f_ghz * d))` 5. Clearance: `los_height - total_height - r * fresnel_clearance` 6. FSPL: `20*log10(d_km) + 20*log10(f_mhz) + 27.55`