auto-sync: 2026-05-04 14:30:01
This commit is contained in:
@@ -502,32 +502,48 @@ async def post_route(req: RouteRequest):
|
||||
raise HTTPException(503, f"OSRM недоступен: {e}")
|
||||
|
||||
# OSRM возвращает TooBig когда маршрут слишком длинный для N альтернатив
|
||||
# Retry-цепочка: alternatives=5 → 3 → 1, ВСЕГДА с radiuses (snap radius критичен для длинных маршрутов)
|
||||
if data.get("code") == "TooBig":
|
||||
# Пробуем с меньшим числом альтернатив
|
||||
url_retry3 = (
|
||||
f"{OSRM_URL}/route/v1/driving/{coords_str}"
|
||||
f"?alternatives=3&overview=full&geometries=geojson&annotations=false"
|
||||
f"&radiuses={radiuses_str}"
|
||||
)
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=30) as client:
|
||||
async with httpx.AsyncClient(timeout=60) as client:
|
||||
resp = await client.get(url_retry3)
|
||||
data = resp.json()
|
||||
except Exception as e:
|
||||
raise HTTPException(503, f"OSRM недоступен: {e}")
|
||||
|
||||
if data.get("code") == "TooBig":
|
||||
# Всё ещё TooBig — пробуем совсем без альтернатив
|
||||
url_retry1 = (
|
||||
f"{OSRM_URL}/route/v1/driving/{coords_str}"
|
||||
f"?overview=full&geometries=geojson&alternatives=false"
|
||||
f"&radiuses={radiuses_str}"
|
||||
)
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=30) as client:
|
||||
async with httpx.AsyncClient(timeout=60) as client:
|
||||
resp = await client.get(url_retry1)
|
||||
data = resp.json()
|
||||
except Exception as e:
|
||||
raise HTTPException(503, f"OSRM недоступен: {e}")
|
||||
|
||||
# Если NoSegment — пробуем с увеличенным radius (10 км вместо 5)
|
||||
if data.get("code") == "NoSegment":
|
||||
radiuses_wide = ";".join(["10000"] * len(req.waypoints))
|
||||
url_wide = (
|
||||
f"{OSRM_URL}/route/v1/driving/{coords_str}"
|
||||
f"?overview=full&geometries=geojson&alternatives=false"
|
||||
f"&radiuses={radiuses_wide}"
|
||||
)
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=60) as client:
|
||||
resp = await client.get(url_wide)
|
||||
data = resp.json()
|
||||
except Exception as e:
|
||||
raise HTTPException(503, f"OSRM недоступен: {e}")
|
||||
|
||||
if data.get("code") != "Ok" or not data.get("routes"):
|
||||
osrm_code = data.get("code", "Unknown")
|
||||
osrm_msg = data.get("message", "")
|
||||
|
||||
Reference in New Issue
Block a user