import requests from rec.utils import nextMonday from collections import defaultdict API_KEY = "AIzaSyBoBHzeQFgR7O-NlNsuHXQcC1B7ccEHpl8" url = "https://routes.googleapis.com/directions/v2:computeRoutes" def transit_route( origin_lat: float, origin_lon: float, dest_lat: float, dest_lon: float, compute_alternative_routes=True, ): monday9am = nextMonday() header = { "X-Goog-Api-Key": API_KEY, "Content-Type": "application/json", "X-Goog-FieldMask": "routes.distanceMeters,routes.duration,routes.staticDuration,routes.legs.steps.distanceMeters,routes.legs.steps.staticDuration,routes.legs.steps.travelMode", } body = { "origin": { "location": {"latLng": {"latitude": origin_lat, "longitude": origin_lon}} }, "destination": { "location": {"latLng": {"latitude": dest_lat, "longitude": dest_lon}} }, "travelMode": "TRANSIT", # "2023-10-15T15:01:23.045123456Z" "departureTime": monday9am.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), "computeAlternativeRoutes": compute_alternative_routes, # "routeModifiers": { # "avoidTolls": false, # "avoidHighways": false, # "avoidFerries": false # }, "languageCode": "en-US", "units": "METRIC", } r = requests.post(url, json=body, headers=header) if r.status_code == 200: return r.json() raise Exception(r.json()) def extract_time(d, limit: int = 2): res = [] for route in d["routes"]: distance = route["distanceMeters"] duration = int(route["duration"].strip("s")) duration_static = int(route["staticDuration"].strip("s")) steps = route["legs"][0]["steps"] initial_walk_duration = 0 used_transit = False duration_per_transit = defaultdict(lambda: 0) distance_per_transit = defaultdict(lambda: 0) number_of_transit_stops = 0 for step in steps: if used_transit == False and step["travelMode"] == "WALK": initial_walk_duration += int(step["staticDuration"].strip("s")) else: used_transit = True duration_per_transit[step["travelMode"]] += int( step["staticDuration"].strip("s") ) distance_per_transit[step["travelMode"]] += step.get("distanceMeters", 0) if step["travelMode"] == "TRANSIT": number_of_transit_stops += 1 res.append( { "duration": duration, "distance": distance, "duration_static": duration_static, "initial_walk_duration": initial_walk_duration, "duration_per_transit": dict(duration_per_transit), "distance_per_transit": dict(distance_per_transit), "number_of_transit_stops": number_of_transit_stops, } ) return res[:limit] if __name__ == "__main__": import json with open("code/json/routing_routeapi.json", "r") as f: d = json.load(f) extract_time(d) # if __name__ == "__main__": # origin = 51.5635664310333, -0.1107173751570373 # home # dest = 51.50475678313417, 0.04915321000190009 # london city airport # d = travel_time(origin[0], origin[1], dest[0], dest[1]) # import json # with open('code/json/routing_routeapi.json', 'w') as f: # json.dump(d, f)