119 lines
3.3 KiB
Markdown
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`
|