radeln/rides/services.py
steffen1971 5d967c68b5 Add Radeln ohne Alter ride-coordination demo (Django + HTMX + Leaflet)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:20:17 +02:00

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