first commit
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# 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`
|
||||
Reference in New Issue
Block a user