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 :

creer une fonction et coordonnees geographiques


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2012
    Messages : 64
    Points : 37
    Points
    37
    Par défaut creer une fonction et coordonnees geographiques
    Bonjour je dois creer une fonction pour calculer des distances entre deux points ayant des coordonnées géographiques .
    J'ai trouvé ces formules :
    -d=R*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
    d=R*2*asin(sqrt((sin((lat1-lat2)/2))^2 + cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
    avec des latitudes longitudes en radian . Est ce que qqun peut confirmer ces formules déja?

    Ensuite j'ai trouvé une fonction pour faire cela :
    CREATE FUNCTION get_distance_metres (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
    DETERMINISTIC
    NO SQL
    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 (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
    END|
    DELIMITER ;

    qui calcule la deuxième formule (sauf le return mais ca doit etre une formule équivalente). Cependant mysql dit qu'il y a des erreurs au niveau des declare et return!
    qu'est ce qui ne va pas??
    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Il te manque juste DELIMITER | au début.


    La première formule est probablement suffisante (et surtout plus simple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELIMITER |
    DROP FUNCTION IF EXISTS get_distance_metres|
    CREATE FUNCTION get_distance_metres (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
    DETERMINISTIC
    NO SQL
    BEGIN
    RETURN 6366000 * ACOS(SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) * COS(RADIANS(lat2))* COS(RADIANS(lng1)-RADIANS(lng2)));
    END|
    DELIMITER ;
    Le résultat a l'air assez correct puisque en faisant
    select get_distance_metres (43.592631,3.849873,43.593435,3.849313)J'ai obtenu 100,05. ( J'ai pris sur google map des coordonnées d'un terrain de rugby.

    En prenant 6378137 comme rayon de la terre ça donne 100,24.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2012
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    merci!
    ca marche bien

  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 296
    Points
    3 296
    Billets dans le blog
    1
    Par défaut
    salut,

    pour info, la même fonction tenant compte de la hauteur des points et optimisée en terme de code...
    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
    16
    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$$
    delimiter ;
    en factorisant les conversion et minimisant les variables nécessaires
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

Discussions similaires

  1. MySQL 4.1 ou 5, creer une fonction
    Par polopollo dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/08/2011, 14h16
  2. Créer une fonction Excel
    Par Robert G dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/08/2007, 21h57
  3. Réponses: 8
    Dernier message: 30/08/2006, 11h08
  4. creer une fonction avec arguments
    Par niglo dans le forum ASP
    Réponses: 3
    Dernier message: 03/06/2005, 09h04
  5. [langage] Creer une fonction qui met en majuscule ?
    Par Cyber@l dans le forum Langage
    Réponses: 6
    Dernier message: 04/12/2003, 19h44

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