2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00
2026-06-17 13:26:35 +03:00

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 файлы OSM
  • scripts/ — загрузка данных и импорт зданий
  • sql/init.sql — схема PostGIS
  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
S
Description
No description provided
Readme 41 KiB
Languages
Python 98.8%
Dockerfile 1.2%