30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
"""Routing: holt eine Fahrtroute zwischen zwei Punkten.
|
|
|
|
Bewusst hinter einer einzigen Funktion gekapselt. Für die Demo nutzen wir den
|
|
öffentlichen OSRM-Demo-Server (kein API-Key). Für Produktion lässt sich hier
|
|
problemlos OpenRouteService oder ein self-hosted OSRM einhängen, ohne dass der
|
|
Rest der App es merkt.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import requests
|
|
|
|
OSRM_BASE = "https://router.project-osrm.org"
|
|
Point = tuple[float, float] # (lat, lng)
|
|
|
|
|
|
def route_geojson(start: Point, end: Point) -> dict | None:
|
|
"""Route Start→Ziel als GeoJSON-LineString. None bei Fehler/Offline.
|
|
|
|
Die Karte fällt in dem Fall auf eine gestrichelte Luftlinie zurück.
|
|
"""
|
|
s_lat, s_lng = start
|
|
e_lat, e_lng = end
|
|
url = f"{OSRM_BASE}/route/v1/driving/{s_lng},{s_lat};{e_lng},{e_lat}"
|
|
try:
|
|
resp = requests.get(url, params={"overview": "full", "geometries": "geojson"}, timeout=8)
|
|
resp.raise_for_status()
|
|
return resp.json()["routes"][0]["geometry"]
|
|
except (requests.RequestException, KeyError, IndexError, ValueError):
|
|
return None
|