107 lines
3.4 KiB
Python
107 lines
3.4 KiB
Python
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)
|