124 lines
4.2 KiB
Markdown
124 lines
4.2 KiB
Markdown
---
|
||
type: trz
|
||
work_item_id: ET-001
|
||
title: "ТЗ: Исключить шлагбаумы и тротуары из OSRM"
|
||
version: 1
|
||
status: approved
|
||
created_at: 2026-05-15
|
||
authors:
|
||
- "agent:stream"
|
||
---
|
||
|
||
# Техническое задание — ET-001
|
||
|
||
## 1. Что менять
|
||
|
||
### Файл: OSRM профиль `enduro.lua`
|
||
|
||
Расположение на сервере: `/home/slin/enduro-trails/osrm/enduro.lua`
|
||
В репо: `infra/osrm/enduro.lua` (скопировать текущий + внести изменения)
|
||
|
||
#### Изменение 1: process_node — блокировка шлагбаумов
|
||
|
||
В функции `process_node` заменить текущую обработку barriers:
|
||
|
||
```lua
|
||
-- Блокируемые типы препятствий (полный запрет проезда)
|
||
local blocked_barriers = {
|
||
gate = true,
|
||
bollard = true,
|
||
lift_gate = true,
|
||
chain = true,
|
||
cycle_barrier = true,
|
||
motorcycle_barrier = true,
|
||
border_control = true,
|
||
block = true,
|
||
}
|
||
|
||
function process_node(profile, node, result)
|
||
local barrier = node:get_value_by_key("barrier")
|
||
if barrier and blocked_barriers[barrier] then
|
||
result.barrier = true
|
||
result.forward_mode = mode.inaccessible
|
||
result.backward_mode = mode.inaccessible
|
||
return
|
||
end
|
||
end
|
||
```
|
||
|
||
#### Изменение 2: process_way — исключение тротуаров
|
||
|
||
В начале функции `process_way`, после получения highway, добавить:
|
||
|
||
```lua
|
||
-- Исключаемые типы дорог (тротуары, пешеходные зоны)
|
||
local excluded_highways = {
|
||
footway = true,
|
||
pedestrian = true,
|
||
steps = true,
|
||
corridor = true,
|
||
}
|
||
|
||
-- В process_way, после local highway = way:get_value_by_key("highway"):
|
||
if excluded_highways[highway] then return end
|
||
```
|
||
|
||
Также удалить `footway`, `pedestrian`, `steps` из таблицы `highway_rate` (если есть).
|
||
|
||
## 2. Пересборка графа
|
||
|
||
После изменения lua-профиля — пересобрать граф:
|
||
|
||
```bash
|
||
cd /home/slin/enduro-trails/osrm
|
||
docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-extract -p /data/enduro.lua /data/enduro.osm.pbf
|
||
docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-partition /data/enduro.osrm
|
||
docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-customize /data/enduro.osrm
|
||
docker restart osrm-osrm-routed-1
|
||
```
|
||
|
||
Время: ~40 мин (extract) + ~5 мин (partition + customize).
|
||
|
||
## 3. Что добавить в репо
|
||
|
||
1. `infra/osrm/enduro.lua` — обновлённый профиль
|
||
2. `scripts/rebuild-osrm.sh` — скрипт пересборки графа
|
||
3. `tests/integration/test_routing_barriers.py` — тесты
|
||
|
||
## 4. Тесты
|
||
|
||
### Unit/Integration тесты (pytest + httpx)
|
||
|
||
```python
|
||
# tests/integration/test_routing_barriers.py
|
||
|
||
import pytest
|
||
from httpx import AsyncClient, ASGITransport
|
||
from src.api.main import app
|
||
|
||
OSRM_URL = "http://172.22.0.1:5559"
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_route_avoids_barrier():
|
||
"""Маршрут через точку с известным шлагбаумом должен обходить его"""
|
||
# Точка с шлагбаумом: 55.7558, 37.6173 (пример)
|
||
# Тест проверяет что маршрут не проходит через эту ноду
|
||
pass # Architect определит конкретные координаты
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_route_no_footway():
|
||
"""Маршрут в городе не должен проходить по тротуарам"""
|
||
pass # Architect определит конкретные координаты
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_route_allows_cattle_grid():
|
||
"""Маршрут через cattle_grid должен работать (не заблокирован)"""
|
||
pass
|
||
```
|
||
|
||
## 5. Ограничения
|
||
- НЕ менять веса существующих дорог (только добавить блокировку)
|
||
- НЕ трогать scenic/link/recon логику
|
||
- cattle_grid и ford — НЕ блокировать
|
||
- Пересборка графа — отдельный ручной шаг (не в CI)
|