"""Isócrona de un punto via Valhalla routing engine.""" from __future__ import annotations import httpx def valhalla_isochrone( lat: float, lon: float, minutes: int, base_url: str = "http://localhost:8002", costing: str = "auto", denoise: float = 0.6, generalize_m: int = 50, polygons: bool = True, timeout_s: float = 120.0, ) -> dict | None: """Calcula la isócrona de un punto usando Valhalla. Args: lat: Latitud del punto de origen. lon: Longitud del punto de origen. minutes: Tiempo de viaje en minutos para el contorno. base_url: URL base del servidor Valhalla. costing: Modelo de coste ('auto', 'bicycle', 'pedestrian', etc.). denoise: Factor de suavizado del contorno (0-1). Por defecto 0.6. generalize_m: Tolerancia de generalización en metros. Por defecto 50. polygons: Si True retorna polígono; si False retorna línea. timeout_s: Timeout en segundos. Por defecto 120. Returns: GeoJSON dict con la isócrona o None si error. """ url = f"{base_url.rstrip('/')}/isochrone" payload = { "locations": [{"lat": lat, "lon": lon}], "costing": costing, "contours": [{"time": minutes}], "polygons": polygons, "denoise": denoise, "generalize": generalize_m, "format": "geojson", } try: r = httpx.post(url, json=payload, timeout=httpx.Timeout(timeout_s)) r.raise_for_status() return r.json() except Exception: return None