main
Radio Link Service
Микросервис для расчёта радиосвязи между двумя точками с учётом рельефа (SRTM), крон деревьев (ETH Canopy) и зданий OSM (PostGIS).
Быстрый старт
docker compose up -d --build
Сервис: http://localhost:8000
Документация API: http://localhost:8000/docs
Подготовка данных (офлайн)
После загрузки данных сервис работает полностью офлайн.
1. Рельеф SRTM GL1 (30 м)
python scripts/download_srtm.py --bbox 59.0 30.0 60.0 31.0 --output data/srtm
Для OpenTopography может потребоваться API key:
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 м)
python scripts/download_canopy.py --bbox 59.0 30.0 60.0 31.0 --output data/canopy
3. Здания OSM
Через bbox (онлайн, osmnx):
python scripts/import_buildings.py --bbox 59.0 30.0 60.0 31.0 --truncate
Через локальный PBF:
python scripts/import_buildings.py --pbf data/osm/region.osm.pbf --truncate
Примеры запросов
Health
curl http://localhost:8000/health
Расчёт линка
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).
Профиль высот (только рельеф)
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"
Зона покрытия
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
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 файлы OSMscripts/— загрузка данных и импорт зданийsql/init.sql— схема PostGIS
Алгоритм /v1/link
- Сэмплирование трассы с шагом 30 м (геодезическая линия)
- Для каждой точки: SRTM + canopy + max(building height)
- LOS-линия между антеннами
- Радиус Френеля:
r = 17.3 * sqrt(d1*d2 / (f_ghz * d)) - Clearance:
los_height - total_height - r * fresnel_clearance - FSPL:
20*log10(d_km) + 20*log10(f_mhz) + 27.55
Description
Languages
Python
98.8%
Dockerfile
1.2%