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

Langage SQL Discussion :

Latitude et longitude les plus proches


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 19
    Points
    19
    Par défaut Latitude et longitude les plus proches
    bonjour,

    J'ai une base de données contenant environ 37000 communes.
    Je souhaiterais etre capable de determiner la commune la plus proche a partir de coordonnées GPS.
    Mes champs de base de données: longitude et latitude.

    Quelqu'un pourrais t-il m 'orienté?


    Pour info, j'en suis là:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ville,(6366*acos(cos(radians(47.9742104))*cos(radians(latitude))*cos(radians(longitude)-radians(-1.4814908))+sin(radians(47.9742104))*sin(radians(latitude)))) as Proximite 
    from communes 
    order by Proximite limit 1,5

    ou 47.9742104 est la longitude et -1.4814908 la latitude.
    Cela me sort bien des villes mais pas pas du tout les bonnes !

    merci.

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    normal, faut comparer le résultat à ta distance ou au range de distance que tu veux...

    ta formule ne calcule que la distance entre la ville en cours et la vile cible...

    je serais de toi je me ferais une fonction stockée qui contiendrait ta formule et la comparaison...

    ça serait plus lisible...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Merci de ta réponse mais je ne suis pas sur de compendre.

    Comme tu le dis, ma formule calcule la distance entre la ville en cours et la ville cible. Dans la requete, je lui demande d'afficher les 5 villes par ordre de proximité, donc les 5 villes ayant la plus petites distances entre elles, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je serais de toi je me ferais une fonction stockée qui contiendrait ta formule et la comparaison
    Peux tu être plus explicite stp?

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    l'idée c'est qu'une fonction stockée rend ta requête plus visible et te permet de maintenir les 2 plus facilement et indépendamment...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    delimiter $$
    drop function if exists `distance terrestre`$$
    create function `distance terrestre`(lo_target float,la_target float,lo_ref float,la_ref float)
    returns float
    deterministic
    begin
      return (6366*acos(cos(radians(la_ref))*cos(radians(la_target))*cos(radians(lo_target)-radians(lo_ref))+sin(radians(la_ref))*sin(radians(la_target))));
    end$$
    delimiter ;
     
    select ville,`distance terrestre`(longitude,latitude,-1.4814908,47.9742104) as proximite from communes where `distance terrestre`(longitude,latitude,-1.4814908,47.9742104)<5 order by proximite;
    je pense pas que ça apporte la moindre accélération à l'exécution par contre

    j'ai déjà aidé un mec qui avait le même problème sur le forum, regarde et compare la formule, elle est peut-être fausse...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 34
    Points : 19
    Points
    19
    Par défaut
    Parfait ! cela fonctionne très bien.

    Merci beaucoup

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

Discussions similaires

  1. Latitude / longitude la plus proche dans une BD
    Par _cheval_ dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/09/2010, 01h46
  2. Clients les plus proches
    Par doudoubapt dans le forum SAS STAT
    Réponses: 9
    Dernier message: 19/01/2009, 19h29
  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, 09h53
  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, 12h33
  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, 09h42

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