diff --git a/README.md b/README.md index dccb8dedaff19d74109990c1053b9a81a81f29aa..835f7068bce3005b4cc90ec1f3f1256ee35fc284 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # EBEC 2021 - +Une fois le docker téléchargé, executer le fichier main +un input vous est demandé, rentrer la liste des coordonnées des arbres sous la forme +(longitude,latitude) +Un dictionnaire récapitulant les informations demandées vous est renvoyé. ## ATTENTION ENTRER LES COORDONNEES SOUS LA FORME (LONG,LAT) diff --git a/coord_to_intersections.py b/coord_to_intersections.py index 92b37ce74b365098e5c6aec6f0cda18df999ff71..61e7da8fba9f1cc9d2810222e37f5e3b31211989 100644 --- a/coord_to_intersections.py +++ b/coord_to_intersections.py @@ -24,7 +24,7 @@ def coord_to_inter(liste_coord,lat,long,main_street): #On regarde si cette intersection correspond bien au croisement avec une autre rue, on trouve le nom de cette autre rue nom_de_rue=circular_research(candidat[1], candidat[0], main_street) if nom_de_rue== None : - #Si on ne trouve pas d'autre rue a cette intersection on écarte cette intersection + #Si on ne trouve pas d'autre rue a cette intersection on écarte cette intersection indice=dist.index(min(dist)) dist.pop(indice) liste_coord.pop(indice) @@ -85,6 +85,7 @@ def coord_to_inter(liste_coord,lat,long,main_street): print(inter_street) #On souhaite ensuite s'asssurer que l'on à le couple début/fin de tronçon le plus rapproché possible pour #réduire la zone de recherche + #on va donc réitérer l'étape précédente mais en prenant comme point de départ le dernier point d'inserction trouvé liste_coord_admissibles2 = [] d_2_1 = [] for i in range(len(liste_coord)): diff --git a/main.py b/main.py index 12e9b0ac1931333c893b10056ea15bf0a09f48fb..b43988170489469922eb3e8a4d582bb3c1d78762 100644 --- a/main.py +++ b/main.py @@ -7,17 +7,22 @@ import time def tree_position(lat, lon): req = requete_osm(lat, lon) + #on recupere les infos disponibles sur l'arbre try: main_street = req['address']['road'] except KeyError: + #si on ne trouve pas de nom de rue on fait une recherche autour main_street = circular_research_2(lat, lon) + #si on trouve un nom de rue vide (rare) on fait une recherche autour if main_street == '': main_street = circular_research_2(lat, lon) print(main_street) city = req['address']['town'] country = req['address']['country'] + #on fait une recherche sur la rue complète pour avoir toutes les intersections de la rue json = search_osm(main_street, city, country) intersections = all_intersect(json) + #on sélectionne le début et fin de troncon tel que le troncon soit de taille minimale [begin,end,coord_begin, coord_end] = coord_to_inter(intersections, lat, lon, main_street) #pour la suite, on a besoin de stocker le couple début et fin de troncon sous frome de tuple # et non de liste car on va s'en servir comme clé d'un dictionnaire @@ -71,6 +76,8 @@ def classement_reduit(classement): #fonction pour l'objectif 3 qui rassemble les rue_princ[troncon[1]].append((troncon[5],troncon[3])) else: rue_princ[troncon[1]]=[(troncon[4],troncon[2]),(troncon[5],troncon[3])] + #pour toutes les rues, on sélectionne les deux intersections les plus éloignées, + # ce sont elles qu'on appelera début et fin de troncon for rue in rue_princ: liste_coord=rue_princ[rue] dist_max=0 @@ -85,12 +92,15 @@ def classement_reduit(classement): #fonction pour l'objectif 3 qui rassemble les x2=liste_coord[j][0][0] y2=liste_coord[j][0][1] d=(x1-x2)**2+(y1-y2)**2 - if d>dist_max: + if d>=dist_max: dist_max=d coord_deb=liste_coord[i][0] coord_fin=liste_coord[j][0] nom_deb=liste_coord[i][1] nom_fin=liste_coord[j][1] + #une fois ces deux intersections sélectionnées, on copie dans new_classement les informations de + # classement mais en regroupant les troncons de meme rue et en modifiant les noms et coordonnées + # des débuts et fin de classement for troncon in classement: if troncon[1]==rue: if (troncon[0],rue,nom_deb,nom_fin,coord_deb,coord_fin) in new_classement: diff --git a/research.py b/research.py index 4fa73a03f2e64a5d76a7f797a5b6f1f5de58f36c..db22dc58547da4f142afb9bc94d4f9fb1dad1f40 100644 --- a/research.py +++ b/research.py @@ -9,19 +9,28 @@ def circular_research(lat, lon, main_street): street = requete_osm(lat, lon)['address']['road'] except KeyError: street = '' + #si on trouve une rue qui convient if not(street == main_street) and not(street == ''): return street + #sinon, on cherche autour de ce point step = 5*10**(-5) + #on limite la taille du "cercle" de recherche pour ne pas tomber sur des rues trop éloignées while step < 6*10**(-5): for i in range(8): street = check_position(lat, lon, step, main_street, i) if not(street == main_street) and not(street == ''): return street step += 4*10**(-5) + #si on n'a toujours rien trouvé, c'est que le point d'intersection ne correspond pas + # à une intersection avec une rue différente de main street return None def circular_research_2(lat, lon, main_street=''): - #Recherche un rue autre que main_street par recherche circulaire autour du point d'intersection + #Recherche une rue autre que vide par recherche circulaire autour du point d'intersection + #cette fonction est appelée lorsqu'on ne trouve pas de rue associée à un arbe + #la seule différence avec la fonction précédente est donc qu'ici on impose de renvoyer une rue + #quitte à s'éloigner énormément de l'arbre, il n'y a donc pas ici de limite pour la taille du "cercle" + #on peut donc traiter le cas où l'arbre est au milieu d'un parc par exemple step = 2*10**(-5) found = False while not(found): @@ -33,7 +42,9 @@ def circular_research_2(lat, lon, main_street=''): return street def check_position(lat, lon, step, main_street, i): - #Calcul les positions autour du point centrale et récupère la rue associée à cette position + #i compris entre 0 et 7 + #Calcul les positions autour du point central et récupère la rue associée à cette position + #cette fonction peut être appelée jusqu'à 8 fois street = '' step_diag = step/sqrt(2) if i == 0: @@ -80,6 +91,8 @@ def check_position(lat, lon, step, main_street, i): def multi_position(lat, lon, step): + #test de multrithreading mais cela n'améliore pas énormément la vitesse de calcul + #donc pas utilisé finalement latitude = [] longitude = [] for j in range(1,4):