Skip to content
Snippets Groups Projects
Select Git revision
  • 9e8d55e7e275d9591cfbc3d757d49de80cc9478c
  • master default
  • 1
  • 2
  • 3
  • 4
  • branche_annexe
  • test
  • Mechanical
  • platypus
  • wiikip
  • arnold
  • laBandaEwen
  • debuging
  • yolo
  • premiere_branche
  • coshyp
  • nvlle_branche
  • Alberich
  • branchpourtoncasser
  • branch_tcd
21 results

index.css

Blame
  • Forked from Thomas Sainrat / formation-git
    Source project has a limited visibility.
    main.py 6.89 KiB
    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], 'ville':troncon[0], 'rue':troncon[1], 'début tronçon': troncon[2], 'fin tronçon':troncon[3]}
                print(i+1)
        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))