IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

voisins les plus proches


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ngénieur d'etat en science géodésique et travaux topographique
    Inscrit en
    Septembre 2016
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : ngénieur d'etat en science géodésique et travaux topographique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2016
    Messages : 152
    Par défaut voisins les plus proches
    J'ai besoin d'aide pour établir un script python qui est peremte de trouver et sur une dataframe df=["point_name","x","y"] tous les points voisins les plus proches à une distance spécifique comme l'exmple sur l'image en dessous (distance <= 30)

    Nom : Capture.PNG
Affichages : 325
Taille : 14,8 Ko

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Vous pouvez le faire "brute force" en calculant les distances entre chaque point... ou chercher un algorithme qui va limiter le nombre de distances à calculer.

    Dans tous les cas, choisir l'algo. n'est pas un sujet Python et lorsque vous l'aurez choisi, postez comment vous avez essayé de le traduire serait un plus pour montrer que vous ne voulez pas qu'on réfléchisse et code à votre place.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 214
    Par défaut
    hello,
    une piste ici : Recherche_des_deux_points_les_plus_rapprochés
    Avec du code en python ici
    A Voir si cela est adapté pour chercher plusieurs valeurs relatives à une condition.
    ​Ami calmant, J.P

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Peut-être avec numpy ?

    https://codereview.stackexchange.com...points#tab-top

    Après je méconnais grandement numpy donc à prendre avec des pincettes. Le code pourrait correspondre après il faut le comprendre

    np.asarray : https://numpy.org/doc/stable/referen...y.asarray.html
    np.einsum : https://numpy.org/doc/stable/referen...py.einsum.html
    https://www.drgoulu.com/2016/01/17/einsum/
    np.argmin : https://numpy.org/doc/stable/referen...py.argmin.html

    Ne pas me demander d'explications, stp !



    Dernière modification par Invité ; 14/03/2022 à 23h39.

  5. #5
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Sinon scikit-learn propose directement l'algo knn
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    from sklearn.neighbors import KNeighborsClassifier

    Mais tu n'as pas besoin de ça. Un algo possible:
    Faire un sort sur x de la liste des points
    Puis boucler sur chaque point
    Pour chaque point x,y,
    - extraire la sous liste des points xi,yi qui ont xi dans l'intervalle [x-d, x+d]
    - pour chaque point de la sous-liste:
    tester la distance avec le point x,y

    Mais comme le dit Wiztricks, ici c'est un forum Python où on t'aidera surtout pour trouver la bonne compréhension de liste pour extraire les sous-listes

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 214
    Par défaut
    Hello,
    pour travailler sur un cas concret, voilà ce que j'ai "bricolé" :
    Grâce à la fonction Overpass du module overpy je vais chercher par internet sur Openstreetmap les coordonnées de toutes les stations de métro en France. J'utilise aussi le module haversine pour calculer la distance entre deux coordonnées. Ensuite je dessine tous ces points dans matplotlib. Le module mplcursors quand à lui permet d'annoter les points dans matplotlib. Pour l'instant je recherche "bestialement" toutes les stations de métro qui sont éloignées entre elles de 400 mètres à 450 mètres et je trace une ligne rouge entre ces stations.
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import numpy as np
    import matplotlib.pyplot as plt
    import overpy
    import mplcursors
    from haversine import haversine, Unit
    import time
    start = time.time()
    api = overpy.Overpass()
    r = api.query("""
    area["ISO3166-1"="FR"][admin_level=2];
    (node["station"="subway"](area););
    out center;
    """)
    end = time.time()
    print("temps de récupération des coordonnées : " + str(end-start) + " secondes")
    start = time.time()
    noms = []
    coords  = []
    coords += [(float(node.lon), float(node.lat))
               for node in r.nodes]
    noms += [node.tags['name'] for node in r.nodes]
    X = np.array(coords)
    plt.plot(X[:, 0], X[:, 1], 'o')
    plt.title('Stations de métro en France')
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    plt.axis('equal')
    mplcursors.cursor(hover=True).connect("add", lambda sel: sel.annotation.set_text(noms[sel.index]))
    end = time.time()
    print("temps de tracé des coordonnées : " + str(end-start) + " secondes")
    resultat=[]
    start = time.time()
    for pt1 in coords:
        for pt2 in coords:
            res = haversine(pt1, pt2, unit='m')
            if 400 < res < 450:
                plt.plot([pt1[0],pt2[0]],[pt1[1],pt2[1]],color = 'red', linestyle = 'solid')
                resultat.append(res)
    end = time.time()
    print("temps de calcul des distances  : " + str(end-start) + " secondes")
    plt.show()
    Voici ce que cela donne :
    Nom : PyMetroFr1.PNG
Affichages : 251
Taille : 31,2 Ko
    Comme on peut le constater il y a 6 zones qui correspondent aux six métros actuels (Paris, Marseille, Lyon, Lille, Toulouse, Rennes)
    Et pour les stations dont l'éloignement est entre 400m et 450m dans la zone de Paris :
    Nom : PyMetroFr.gif
Affichages : 244
Taille : 254,9 Ko

    Voici les temps des différentes parties du programme sur mon ordinateur :
    temps de récupération des coordonnées : 69.56823968887329 secondes
    temps de tracé des coordonnées : 0.031241655349731445 secondes
    temps de calcul des distances : 0.7185783386230469 secondes
    Comme on peut le constater il faut plus d'une minute pour récupérer les coordonnées chez OpenStreetmap.




    Le but du jeu est d'optimiser la partie recherche des stations par éloignement . Déjà éliminer les redondances -> ex p1,p1 (p1,p2 p2,p1) etc... et puis trouver le meilleur algorithme.
    A vous de jouer !

    Ami calmant, J.P

  7. #7
    Membre confirmé
    Homme Profil pro
    ngénieur d'etat en science géodésique et travaux topographique
    Inscrit en
    Septembre 2016
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : ngénieur d'etat en science géodésique et travaux topographique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2016
    Messages : 152
    Par défaut
    Merci beaucoup pour tout le monde ; le probleme est résolu par l'utilisation de spatial.cKDTree

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/09/2015, 10h32
  2. Les plus proches voisins
    Par kobeddl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/06/2012, 09h09
  3. Trouver les X nombres les plus proche d'un nombre donné
    Par pyrou dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/07/2007, 08h53
  4. [Algo] Les K voisins les plus proches
    Par GyZmoO dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/05/2007, 11h33
  5. [MySQL] Extraire les 50 valeurs les plus proches d'un entier
    Par denis.ws dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/01/2007, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo