File size: 1,270 Bytes
c317d66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""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()