117 lines
4.0 KiB
Python
117 lines
4.0 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_2.csv'
|
|
|
|
|
|
f = open(csv_file, 'w')
|
|
f.write('art,klasse,team1,team2,road_distance,road_duration,flight_distance\n')
|
|
|
|
|
|
for competition, details in sorted(competition_details.items(), key=lambda x:x[0], reverse=True):
|
|
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)
|
|
# %%
|
|
# %%
|