--- name: valhalla_isochrone kind: function lang: py domain: geo version: "1.0.0" purity: impure signature: "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" description: "Calcula la isócrona (área alcanzable en N minutos) de un punto usando Valhalla. Retorna GeoJSON dict con el polígono o None si error." tags: [valhalla, isochrone, geo, http, geojson] uses_functions: [] uses_types: [] returns: [] returns_optional: true error_type: "error_go_core" imports: [httpx] params: - name: lat desc: "Latitud del punto de origen en grados decimales (WGS84)." - name: lon desc: "Longitud del punto de origen en grados decimales (WGS84)." - name: minutes desc: "Tiempo de viaje en minutos para el contorno de la isócrona." - name: base_url desc: "URL base del servidor Valhalla. Por defecto http://localhost:8002." - name: costing desc: "Modelo de coste: 'auto', 'bicycle', 'pedestrian', etc." - name: denoise desc: "Factor de suavizado del contorno (0-1). Valores menores dan contornos más fragmentados." - name: generalize_m desc: "Tolerancia de generalización de la geometría en metros." - name: polygons desc: "Si True retorna polígono cerrado; si False retorna línea del contorno." - name: timeout_s desc: "Timeout en segundos para la request HTTP." output: "GeoJSON dict con campo 'features' conteniendo el polígono o línea de la isócrona, o None si el servidor no responde o retorna error." tested: true tests: ["isócrona 10 min Madrid contiene features"] test_file_path: "python/functions/geo/tests/test_valhalla_isochrone.py" file_path: "python/functions/geo/valhalla_isochrone.py" source_repo: "internal:footprint_aurgi" source_license: "internal-aurgi" source_file: "ponderacion_isochronas/src/recomendador_centros.py" --- ## Ejemplo ```python gj = valhalla_isochrone(lat=40.4168, lon=-3.7038, minutes=15) if gj: print(f"{len(gj['features'])} features en la isócrona de 15 min") ``` ## Notas Extraida de `_fetch_isochrone_polygon` en `recomendador_centros.py`. Parametrizada para ser reutilizable (el original usaba constantes globales VALHALLA_URL, CONCURRENCY, TIMEOUT_S). Retorna None ante cualquier excepcion.