Skip to content
Snippets Groups Projects
Commit 86b26163 authored by Alexandre Pradeilles's avatar Alexandre Pradeilles
Browse files
parents 429edca8 114bf2c3
No related branches found
No related tags found
No related merge requests found
# 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)
......@@ -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)):
......
......@@ -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:
......
......@@ -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):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment