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

SQL Procédural MySQL Discussion :

Calcule distance sur POINT [MySQL-5.1]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre habitué Avatar de bannik
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2003
    Messages : 191
    Points : 192
    Points
    192
    Par défaut Calcule distance sur POINT
    Bonjour

    Je recherche une méthode de calcul de la distance entre deux point enregistrés en base de donnée (colonnes de type POINT)

    Je connais la méthode a partir des latitudes longitudes:

    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
     
     
    CREATE FUNCTION `Distance`(lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS double
    BEGIN
        DECLARE rlo1 DOUBLE;
        DECLARE rla1 DOUBLE;
        DECLARE rlo2 DOUBLE;
        DECLARE rla2 DOUBLE;
        DECLARE dlo DOUBLE;
        DECLARE dla DOUBLE;
        DECLARE a DOUBLE;
     
        SET rlo1 = RADIANS(lng1);
        SET rla1 = RADIANS(lat1);
        SET rlo2 = RADIANS(lng2);
        SET rla2 = RADIANS(lat2);
        SET dlo = (rlo2 - rlo1) / 2;
        SET dla = (rla2 - rla1) / 2;
        SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
        RETURN (6378.137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
    END
    Je suppose que vu que ce sont des données géo ça devrai être plus simple.

    Quelqu'un connais la méthode?

    Merci

  2. #2
    Membre habitué Avatar de bannik
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2003
    Messages : 191
    Points : 192
    Points
    192
    Par défaut
    Bon, je pense avoir la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT (GLength(LineStringFromWKB(LineString(point1,point2)))) * 111.18957696  as dist
    Pour un retour en Km

    Quelqu'un pour confirmer?

    Merci

  3. #3
    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
    salut,

    la première est une approximation juste la deuxième semble pouvoir engendrer des erreurs assez grossière partout où on en parle...

    après c'est à tester en terme de performance et d'écart de valeur...

    ta première fonction est très mal optimisée et en fait il existe 2 formule à peu près équivalentes...
    moi j'ai choisi l'autre et introduite le support de l'altitude (surtout pour des points espacés de quelques km sinon ça prend évidemment un facteur d'erreur de plus en plus important):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    delimiter $$
    drop function if exists distance$$
    create function distance(la1 double, lo1 double, alt1 double, la2 double, lo2 double, alt2 double)
    returns double
    deterministic
    begin
    	declare rla1,rla2,d,h double;
    	set rla1=radians(la1),rla2=radians(la2);
    	set d=6378137*acos(sin(rla1)*sin(rla2)+cos(rla1)*cos(rla2)*cos(radians(lo2-lo1))),h=alt2-alt1;
    	if h=0 then
    		return d;
    	else
    		return sqrt(d*d+h*h);
    	end if;
    end$$

    radians() ne fait que multiplier une constante à ton nombre donc tu peux mutualiser c'est transformation dans certains cas et ainsi limiter aussi le nombre de variables allouées...
    exemple si tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=radians(a),y=radians(b)
    z=cos(x-y)
    ça équivaut à:
    si a et b ne sont utilisé que pour faire a-b alors tu peux éviter nombre d'opérations comme ça, tu le vois, ou en stockant radians(a-b) s'il apparait à divers endroits par exemple...

  4. #4
    Membre habitué Avatar de bannik
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2003
    Messages : 191
    Points : 192
    Points
    192
    Par défaut
    Ok merci pour la réponse.
    je modifie donc la base de données pour stocker les latitude / longitudes / altitudes pour pouvoir utiliser cette méthode.

  5. #5
    Membre habitué Avatar de bannik
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2003
    Messages : 191
    Points : 192
    Points
    192
    Par défaut
    Petite question, le retour est en mètres? j'ai des chiffres assez énormes en retour.

  6. #6
    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
    oui la mienne est en mètre tu as juste à placé une virgule sur 6378137 et mettre 6378.137 pour avoir des km

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

Discussions similaires

  1. [Google Maps] Calculer une distance sur route avec lat lon
    Par abel.ludba dans le forum APIs Google
    Réponses: 1
    Dernier message: 22/05/2012, 22h49
  2. Calcul de distance entre points
    Par yoshï dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 13/01/2011, 12h35
  3. Calcule distance entre 2 points
    Par abir001 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 08/04/2010, 11h12
  4. Calcul rayon d'une ellipse (distance centre-point sur cercle)
    Par aristeas dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/01/2007, 11h37
  5. calcul d'un point sur la base d'un cone
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/11/2003, 21h18

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