|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
import yaml
|
|
|
|
|
from geopy.distance import geodesic
|
|
|
|
|
from math import sin, cos, sqrt, atan2, radians
|
|
|
|
|
|
|
|
|
|
import constants
|
|
|
|
|
|
|
|
|
|
@@ -8,6 +8,7 @@ with constants.OPTIMIZER_PARAMETERS_PATH.open('r') as f:
|
|
|
|
|
DETOUR_FACTOR = parameters['detour_factor']
|
|
|
|
|
AVERAGE_WALKING_SPEED = parameters['average_walking_speed']
|
|
|
|
|
|
|
|
|
|
EARTH_RADIUS_KM = 6373
|
|
|
|
|
|
|
|
|
|
def get_time(p1: tuple[float, float], p2: tuple[float, float]) -> int:
|
|
|
|
|
"""
|
|
|
|
|
@@ -22,16 +23,28 @@ def get_time(p1: tuple[float, float], p2: tuple[float, float]) -> int:
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Compute the straight-line distance in km
|
|
|
|
|
if p1 == p2:
|
|
|
|
|
return 0
|
|
|
|
|
else:
|
|
|
|
|
dist = geodesic(p1, p2).kilometers
|
|
|
|
|
# Compute the distance in km along the surface of the Earth
|
|
|
|
|
# (assume spherical Earth)
|
|
|
|
|
# this is the haversine formula, stolen from stackoverflow
|
|
|
|
|
# in order to not use any external libraries
|
|
|
|
|
lat1, lon1 = radians(p1[0]), radians(p1[1])
|
|
|
|
|
lat2, lon2 = radians(p2[0]), radians(p2[1])
|
|
|
|
|
|
|
|
|
|
# Consider the detour factor for average cityto deterline walking distance (in km)
|
|
|
|
|
walk_dist = dist*DETOUR_FACTOR
|
|
|
|
|
dlon = lon2 - lon1
|
|
|
|
|
dlat = lat2 - lat1
|
|
|
|
|
|
|
|
|
|
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
|
|
|
|
|
c = 2 * atan2(sqrt(a), sqrt(1 - a))
|
|
|
|
|
|
|
|
|
|
distance = EARTH_RADIUS_KM * c
|
|
|
|
|
|
|
|
|
|
# Consider the detour factor for average an average city
|
|
|
|
|
walk_distance = distance * DETOUR_FACTOR
|
|
|
|
|
|
|
|
|
|
# Time to walk this distance (in minutes)
|
|
|
|
|
walk_time = walk_dist/AVERAGE_WALKING_SPEED*60
|
|
|
|
|
walk_time = walk_distance / AVERAGE_WALKING_SPEED * 60
|
|
|
|
|
|
|
|
|
|
return round(walk_time)
|
|
|
|
|
|