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

119 lines
3.3 KiB
Markdown

# 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`