"""Mapbox client - geocoding, directions/routing, geofencing (via tilesets).""" import os import requests BASE = os.getenv("MAPBOX_API_BASE", "https://api.mapbox.com") TOKEN = os.getenv("MAPBOX_ACCESS_TOKEN") def _p(**params): if not TOKEN: raise RuntimeError("MAPBOX_ACCESS_TOKEN not set") params["access_token"] = TOKEN return params def geocode(query, limit=5, types=None, **kwargs): p = _p(limit=limit, **kwargs) if types: p["types"] = types return requests.get(f"{BASE}/geocoding/v5/mapbox.places/{query}.json", params=p, timeout=60).json() def reverse_geocode(lng, lat, limit=1): return requests.get(f"{BASE}/geocoding/v5/mapbox.places/{lng},{lat}.json", params=_p(limit=limit), timeout=60).json() def directions(coordinates, profile="driving-traffic", alternatives=False, **kwargs): coords = ";".join(f"{lng},{lat}" for lng, lat in coordinates) p = _p(alternatives=str(alternatives).lower(), **kwargs) return requests.get(f"{BASE}/directions/v5/mapbox/{profile}/{coords}", params=p, timeout=60).json() def isochrone(lng, lat, minutes=10, profile="driving"): return requests.get(f"{BASE}/isochrone/v1/mapbox/{profile}/{lng},{lat}", params=_p(contours_minutes=str(minutes)), timeout=60).json()