research/dfbnet/generate_distances.py
2024-11-30 09:57:00 +01:00

117 lines
3.9 KiB
Python

# %%
import googlemaps
from gmplot import GoogleMapPlotter
import json
import pandas as pd
import ast
import random
import itertools
import time
from math import sqrt, sin, cos, atan2, pi
gmaps = googlemaps.Client(key='AIzaSyB76EhR4OqjdXHQUiTkHZC0Svx_7cPGqyU')
def degreesToRadians(degrees):
""" Convert degrees to radians """
return degrees * pi / 180
def distanceInKmByGPS(lat1, lon1, lat2, lon2):
""" Calculate the distance between two points in km """
earthRadiusKm = 6371
dLat = degreesToRadians(lat2 - lat1)
dLon = degreesToRadians(lon2 - lon1)
lat1 = degreesToRadians(lat1)
lat2 = degreesToRadians(lat2)
a = sin(dLat / 2) * sin(dLat / 2) + sin(dLon / 2) * \
sin(dLon / 2) * cos(lat1) * cos(lat2)
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return int(earthRadiusKm * c)
# %%
with open('data/sachsen.json', 'r', encoding='utf-8') as f:
competitions = json.load(f)
competitions = {ast.literal_eval(k): v for k, v in competitions.items()}
competition_details = {}
color = None
teams_in_competition = {}
for staffel ,attr in competitions.items():
if (staffel[0],staffel[1]) not in competition_details:
competition_details[(staffel[0],staffel[1])] = {
'nStaffeln': 1,
'nTeams': 0,
'distances': {},
'teams': []
}
else:
competition_details[(staffel[0],staffel[1])]['nStaffeln'] += 1
for team in attr['teams']:
if team['MANNSCHAFT'] not in competition_details[(staffel[0],staffel[1])]['teams']:
competition_details[(staffel[0],staffel[1])]['teams'].append(team)
csv_file = 'data/distances.csv'
f = open(csv_file, 'w')
f.write('art,klasse,team1,team2,road_distance,road_duration,flight_distance\n')
for competition, details in competition_details.items():
print(f"Calculating distances for {competition}")
for team1 in details['teams']:
details['distances'][team1['MANNSCHAFT']] = {}
for team2 in details['teams']:
if team1 != team2:
start = team1
end = team2
c = 0
while(c <= 1):
try:
road_distance = gmaps.distance_matrix((start['LATITUDE'],start['LONGITUDE']),(end['LATITUDE'],end['LONGITUDE']))['rows'][0]['elements'][0]['distance']['value']
road_duration = gmaps.distance_matrix((start['LATITUDE'],start['LONGITUDE']),(end['LATITUDE'],end['LONGITUDE']))['rows'][0]['elements'][0]['duration']['value']
c = 3
except:
road_distance = 0
road_duration = 0
print(f"Error with {team1['MANNSCHAFT']} and {team2['MANNSCHAFT']}")
time.sleep(3)
c += 1
road_distance = round(road_distance*0.001)
road_duration = round(road_duration*0.016666)
flight_distance = distanceInKmByGPS(team1['LATITUDE'], team1['LONGITUDE'], team2['LATITUDE'], team2['LONGITUDE'])
# details['distances'][team1['MANNSCHAFT']][team2['MANNSCHAFT']] = {
# 'road_distance': road_distance,
# 'road_duration': road_duration,
# 'flight_distance': flight_distance
# }
# print(f"Distance between {team1['MANNSCHAFT']} and {team2['MANNSCHAFT']} calculated", details['distances'][team1['MANNSCHAFT']][team2['MANNSCHAFT']])
f.write(f"{competition[0]},{competition[1]},{team1['MANNSCHAFT']},{team2['MANNSCHAFT']},{road_distance},{road_duration},{flight_distance}\n")
f.close()
# matrix_str_keys = {str(k): v for k, v in competition_details.items()}
# with open('data/sachsen_matrix.json', 'w', encoding='utf-8') as f:
# json.dump(matrix_str_keys, f, ensure_ascii=False, indent=4, default=str)
# %%
# %%