from request import requete_osm from coord_to_intersections import coord_to_inter from request2 import search_osm, all_intersect from ordre_arbres import ordre_arbre from research import circular_research_2 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 tuple_c_begin=(coord_begin[0],coord_begin[1]) tuple_c_end=(coord_end[0],coord_end[1]) return {'lat':lat, 'lon':lon, 'ville':city, 'rue':main_street, 'début tronçon': begin, 'fin tronçon':end, 'coordonnées début tronçon': tuple_c_begin, 'coordonnées fin tronçon': tuple_c_end} def trees_positions(liste_coord): #ATTENTION mettre la longitude en premier #on classe les arbres afin de les regrouper par tronçon commun, on obtient un dictionnaire #ayant en clé les caractéristique du troncon, et en valeur les coordonnées des arbres de ce troncon classement=classement_arbres(liste_coord) new_classement=classement_reduit(classement) dict={} #pour chaque troncon, on cherche l'ordre des arbres for troncon in new_classement: print('troncon') dict[troncon]={} # ce dictionnaire contiendra, pour chaque arbre du troncon, toutes les informations demandées ordre=ordre_arbre(new_classement[troncon],troncon[-2]) #troncon[-2] est la coordonnée du début de troncon à partir de laquelle on classe les arbres #ordre est le dictionnaire qui contient à la clé i les coordonnées du ième arbre du troncon for i in range(len(ordre)): dict[troncon][i+1]={'lat':ordre[i][1], 'lon':ordre[i][0]} return dict def classement_arbres(liste_coord): info=[tree_position(coord[1], coord[0]) for coord in liste_coord] dict={} #dictionnaire ayant en clés la ville, la rue, le troncon de début et de fin et pour valeur une liste avec les coordonnées des arbres for i in info: #si le troncon n'est pas encore dans le dictionnaire, on le créé #NB : peu importe si fin et début de troncon sont inversés, on choisit arbitrairement un début de troncon commun à tous les arbres du troncon, quitte a devoir les inverser dans les infos de l'arbre if (i['ville'],i['rue'],i['début tronçon'],i['fin tronçon'],i['coordonnées début tronçon'],i['coordonnées fin tronçon']) not in dict and (i['ville'],i['rue'],i['fin tronçon'],i['début tronçon'],i['coordonnées fin tronçon'],i['coordonnées début tronçon']) not in dict : dict[(i['ville'],i['rue'],i['début tronçon'],i['fin tronçon'],i['coordonnées début tronçon'],i['coordonnées fin tronçon']) ]=[(i['lon'],i['lat'])] print(i) elif (i['ville'],i['rue'],i['début tronçon'],i['fin tronçon'],i['coordonnées début tronçon'],i['coordonnées fin tronçon']) not in dict: dict[(i['ville'],i['rue'],i['fin tronçon'],i['début tronçon'],i['coordonnées fin tronçon'],i['coordonnées début tronçon']) ].append((i['lon'],i['lat'])) print(i) else: dict[(i['ville'],i['rue'],i['début tronçon'],i['fin tronçon'],i['coordonnées début tronçon'],i['coordonnées fin tronçon'])].append((i['lon'],i['lat'])) return dict def classement_reduit(classement): #fonction pour l'objectif 3 qui rassemble les troncons d'une même rue rue_princ={} #on créé un dictionnaire ayant pour clé la rue principale et pour valeur ds couples avec les # coordonnées de fin et début de troncon des arbres de cette rue ainsi que le nom de ces rues new_classement={} #on créé un dictionnaire qui contiendra la même chose que classement, mais avec les nouveau début et fin for troncon in classement : if troncon[1] in rue_princ: rue_princ[troncon[1]].append((troncon[4],troncon[2])) 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 coord_deb=(0,0) coord_fin=(0,0) nom_deb='' nom_fin='' for i in range(len(liste_coord)): for j in range(i, len(liste_coord)): x1=liste_coord[i][0][0] y1=liste_coord[i][0][1] x2=liste_coord[j][0][0] y2=liste_coord[j][0][1] d=(x1-x2)**2+(y1-y2)**2 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: new_classement[(troncon[0],rue,nom_deb,nom_fin,coord_deb,coord_fin)]+=classement[troncon] else : new_classement[(troncon[0],rue,nom_deb,nom_fin,coord_deb,coord_fin)]=classement[troncon] return new_classement if __name__=="__main__": '''t1 = time.time() lat, lon = 48.892046, 2.249319 #print(tree_position(lat, lon)) t2 = time.time() #print(t2-t1) lat = 48.89227652 lon = 2.253773690 print(tree_position(lat, lon)) ''' liste=[(2.24697,48.89535),(2.24705,48.89529),(2.2472,48.89518)] #liste=[(2.246212,48.896523),(2.247038,48.895916)] print(trees_positions(liste))