#!/bin/python3
from urllib.request import urlopen
from urllib.parse import quote
from concurrent.futures import ThreadPoolExecutor # Permet de le multi calcul
from multiprocessing import cpu_count # Indique le nombre de cpu
# Variables
TotalDistance = 0
TotalTemps = 0
Villes = []
VillesInconnues = set()
Stop=False
StopMessage=""
Cle="AIzaSyD5UNZCB4zhybm0f8Kf1vxOhsprKCFVIyE"
#Cle="AIzaSyB3mt5IkwuxFVS2H7pcdy4aqrkDGhsi_ao"
Fichier = "ListeVilles.txt" # La 1ere ville est celle de départ
Sortie = "VillesTriees.txt"
def Internet(Arrive):
global Depart
global Stop
if Depart in VillesInconnues or Arrive in VillesInconnues or Stop:
return
# On ajoute les infos sur le trajet
print(Depart, "<=>", Arrive)
for Ligne in urlopen("https://maps.googleapis.com/maps/api/distancematrix/json?origins={}&destinations={}&language=fr&key={}".format(quote(Depart.replace(" ", "+")), quote(Arrive.replace(" ", "+")), Cle)).read().decode('UTF-8').split("\n"):
if '"value" :' in Ligne:
BigDico[Depart][Arrive].append(Ligne.split(' : ')[1])
BigDico[Arrive][Depart].append(Ligne.split(' : ')[1])
elif '"destination_addresses" : [ "" ],' in Ligne:
VillesInconnues.add(Arrive)
elif '"origin_addresses" : [ "" ],' in Ligne:
VillesInconnues.add(Depart)
elif '"error_message" :' in Ligne:
Stop=True
global StopMessage
StopMessage = ":".join(Ligne.split(":")[1:])
# Fonction qui regarde la ville la plus proche en temps
def Tri(Depart, VillesVisitees):
try:
x = []
for Ville, Values in BigDico[Depart].items():
if Ville not in VillesVisitees:
x.append((int(Values[1]), int(Values[0]), Ville))
x.sort()
global TotalDistance
TotalDistance += x[0][1]
global TotalTemps
TotalTemps += x[0][0]
return(x[0][2])
except:
print("La fonction tri n'a pas bien fonctionnée avec", Depart, VillesVisitees)
print(BigDico[Depart])
with open(Fichier, "r") as ListeVilles:
for Ville in ListeVilles:
Villes.append(Ville.strip())
VillesVisitees = [Villes[0]] # Ville de départ
# Dictionnaire qui contiendra les infos
BigDico = {}
# 1ere boucle travaillant sur les villes
for Depart in Villes:
# Ajoute la ville à la liste
if Depart not in BigDico.keys():
BigDico[Depart] = {}
Caca = []
# 2e boucle traitant les villes
for Arrive in Villes:
# Si les 2 villes sont les mêmes, on saute ce calcul
if Depart == Arrive:
continue
# Pour eviter de calculer plusieurs fois les mêmes trajets
if Arrive not in BigDico.keys():
BigDico[Arrive] = {}
# On ajoute la nouvelle destination à la ville de départ
if Arrive not in BigDico[Depart].keys():
BigDico[Depart][Arrive] = []
BigDico[Arrive][Depart] = []
Caca.append(Arrive)
with ThreadPoolExecutor(max_workers=cpu_count()) as executor:
for City in Caca:
executor.submit(Internet, City)
# Supprime les villes iconnues
for Ville in VillesInconnues:
print("Impossible de trouver la ville", Ville)
try:
del(BigDico[Ville])
except:
pass
popo = dict(BigDico)
for MiniDict in popo:
try:
del(BigDico[MiniDict][Ville])
except:
pass
if Stop:
print("Une erreur est survenue :", StopMessage)
exit()
for Ville, Values in BigDico[Depart].items():
print(Ville, Values)
# Tri les temps d'acces par ordre
Trajet = [Villes[0]]
NextVille = Tri(Villes[0], VillesVisitees)
Trajet.append(NextVille)
VillesVisitees.append(NextVille)
# Boucle traitant toutes les villes
while len(Villes) != len(VillesVisitees) + len(VillesInconnues):
NextVille = Tri(NextVille, VillesVisitees)
Trajet.append(NextVille)
VillesVisitees.append(NextVille)
# Écriture dans le fichier de sortie
with open(Sortie, "w") as VillesTriees:
for Ville in Trajet:
if Ville:
VillesTriees.write(Ville + '\n')
# informations
print("Les trajets les plus rapides seraient :", " => ".join(Trajet))
print("Cela fait un total de {}km et {} heures de trajet".format(int(TotalDistance/1000), int(TotalTemps/3600)))
Les trajets les plus rapides seraient : Bordeaux => Léognan => Toulouse => Narbonne => Marseille => Paris => Lille
Cela fait un total de 1668km et 16 heures de trajet
Va te falloir te mettre à python 🙂