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 Perl Discussion :

convertion latitude longitude en coordonnees en metres avec Geo::Mercator


Sujet :

Langage Perl

  1. #41
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    2. Les formules ne sont pas en contradiction, elles sont juste adaptées de telle manière à ce que tu utilises directement les angles (en radian) de la latitude et de la longitude, plutôt que de devoir convertir tes angles pour les adapter à ceux utiliser usuellement en coordonnées sphériques.

    5.

    x = r * cos(lat) * cos(long),
    y = r * cos(lat) * sin(long)
    z = r * sin(lat)

    Donc :

    x = ... r * cos(lat) * cos(long)
    --...--------------------------
    y......r * cos(lat) * sin(long)

    y = ... tan (long)
    -- .................................car sin/cos = tan
    x

    =====> long = arctan(y/x)

    Et :


    z = r * sin(lat)

    z = r*sin(lat)*sqrt[cos²(long)*sin²(long)]*cos(lat) ....... car sqrt[cos²(long)*sin²(long)]=1
    .....---------------------------------------------
    ..........................cos(lat)


    z = sin(lat)
    ...--------..* sqrt[r²cos²(lat)cos²(long) + r²cos²(lat)sin²(long)]
    ....cos(lat)
    en utilisant les équations de définition de x et y :


    ............... .........z
    tan (lat) =---------------
    .................sqrt[x²+y²)]


    ............... ............z
    lat = arctan( -------------- )
    ...................sqrt[x²+y²)]

    6.

    Citation Envoyé par byrdo Voir le message
    Au niveau de la précision, je ne suis pas sûr à 100% de l'efficacité. Si je comprends ce que tu expliques, P' et P'' sont confondus ? C'est juste que tu considères que PP' est mesuré en ligne droite, tandis que PP'' est un arc de cercle dont on mesure la longueur ?
    C'était comme ça que je le voyais aussi.

  2. #42
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par byrdo Voir le message
    6.

    Citation Envoyé par byrdo
    Au niveau de la précision, je ne suis pas sûr à 100% de l'efficacité. Si je comprends ce que tu expliques, P' et P'' sont confondus ? C'est juste que tu considères que PP' est mesuré en ligne droite, tandis que PP'' est un arc de cercle dont on mesure la longueur ?
    C'était comme ça que je le voyais aussi.
    P' et P" ne sont pas confondus, ils ont les mêmes coordonnées sphérique angulaires mais pas le même rayon, P" est le projeté de P' sur le globe terrestre.

  3. #43
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Dslee de n'avoir pas poste plus tot, j'etais parvenue au meme raisonnement que vous deux par rapport a utiliser l'arccos plutot que l'arctan...
    C'est du pareille au meme (et heureusement).
    Bon, si j'ai bien compris, j'ai fait trop complique...
    Merci Jedai de m'avoir rappele que le produit scalaire peut etre tres pratique..
    J'ai deja pose la question mais ca me laisse toujours perplexe :
    pourquoi faire
    f = (AB . OP) / ||AB||²
    (au fait le O ne serait pas un A ?)
    au lieu de juste faire le produit scalaire AB.AP et regarder s'il est positif ou negatif.
    Je sais que ca reviens au meme mais dans ce cas la, pourquoi cette division par la norme de AB au carre ?

    Sinon je vais faire mes tests et je vous dis ce que ca donne
    Ps : je ne vous ais pas dit mais pour calculer la distance entre deux ponts lat/long j'utilise la formule d'Haversin :
    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
    sub Haversine { 
     
      my $lat1=shift; 
      my $lon1=shift; 
      my $lat2=shift;  
      my $lon2=shift; 
     
      my $dlon = $lon2 - $lon1 
      $dlat = $lat2 - $lat1 
      $a = (sin($dlat/2))^2 + cos($lat1) * cos($lat2) * (sin($dlon/2))^2
      $c = 2 * atan2( sqrt($a), sqrt(1-$a) ) 
      $d = 6371000 * $c  
     
            return $d; 
    }

  4. #44
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    La division au carré, c'est parce que c'est ainsi que la formule est définie. ^^

  5. #45
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Saita Voir le message
    Dslee de n'avoir pas poste plus tot, j'etais parvenue au meme raisonnement que vous deux par rapport a utiliser l'arccos plutot que l'arctan...
    C'est du pareille au meme (et heureusement).
    Bon, si j'ai bien compris, j'ai fait trop complique...
    Merci Jedai de m'avoir rappele que le produit scalaire peut etre tres pratique..
    J'ai deja pose la question mais ca me laisse toujours perplexe :
    pourquoi faire (au fait le O ne serait pas un A ?)
    au lieu de juste faire le produit scalaire AB.AP et regarder s'il est positif ou negatif.
    Je sais que ca reviens au meme mais dans ce cas la, pourquoi cette division par la norme de AB au carre ?
    Oui, le O était un A, j'avais corrigé un peu avant que tu postes.
    Juste regarder le signe de AB.AP te dit juste de quel côté de A va se trouver P', il ne te dit pas si P' est sur [AB], pour ça il faut diviser par ||AB||² (=xAB²+yAB²+zAB²), ça te donne le rapport AP'/AB (avec un signe), donc P' est sur [AB] si 0 <= AB.AP/||AB||² <= 1, et tu peux juste multiplier AB par ce rapport pour savoir où P' se trouve.

    Citation Envoyé par Saita Voir le message
    Sinon je vais faire mes tests et je vous dis ce que ca donne
    Ps : je ne vous ais pas dit mais pour calculer la distance entre deux ponts lat/long j'utilise la formule d'Haversine
    Bonne solution, mais à ta place j'aurais simplement utilisé l'un des modules qui propose cette formule (entre autres).

    --
    Jedaï

  6. #46
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par byrdo Voir le message
    La division au carré, c'est parce que c'est ainsi que la formule est définie. ^^

    Et comme ça doit faire 1, je crois que ça change rien.
    Bien sûr que non, ||AB||² n'est pas toujours égal à 1... Et quand on met un élément dans une formule en général, ce n'est pas parce qu'il ne sert à rien, ici on a :
    AB . AP = AB . AP' = sign * ||AB|| * ||AP'||
    Donc si tu multiplie ça par le vecteur AB, tu n'obtiens pas le vecteur AP', mais ||AB||² * AP'... D'où la division par ||AB||² pour obtenir le bon point P'.

    --
    Jedaï

    PS: Je conseille d'utiliser Math::VectorReal ou autre module équivalent pour faire les manipulations de vecteurs, ça sera nettement plus confortable et lisible.

  7. #47
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Bien sûr que non, ||AB||² n'est pas toujours égal à 1... Et quand on met un élément dans une formule en général, ce n'est pas parce qu'il ne sert à rien, ici on a :
    AB . AP = AB . AP' = sign * ||AB|| * ||AP'||
    Donc si tu multiplie ça par le vecteur AB, tu n'obtiens pas le vecteur AP', mais ||AB||² * AP'... D'où la division par ||AB||² pour obtenir le bon point P'.

    --
    Jedaï

    PS: Je conseille d'utiliser Math::VectorReal ou autre module équivalent pour faire les manipulations de vecteurs, ça sera nettement plus confortable et lisible.
    Ouep, j'avais édité entre temps

  8. #48
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Par rapport au produit scalaire, le raisonnement que je faisais est le suivant :
    -Si AB.AP<0 alors la distance minimale est PA
    -sinon si AB.PB<0 alors la distance minimale est PB
    -sinon c'est PP''
    L'inconvenient avec cette methode par rapport a la tienne Jedai c'est que je fais deux produit scalaire alors que tu n'en fait qu'un...
    J'espere aussi que mon raisonnement est juste..

    Merci de m'avoir indique ce module Math::VectorReal mais j'ai quasiment finit d'ecrire le code et ca m'embeterait de recommencer... (feignantise quand tu nous tiens.. )
    Je touche presque au but (normalement )

  9. #49
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut

    Ca marche !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    France
    Segment teste : A : 48.418994 , -4.727784  B : 50.962579 , 2.281494
    test :0 lat/long du projete : 50.0718384938755  ,  -0.395723619804447
    P : 49.48 , 0.1 ;  distance : 74.819352069423
    J'ai plus qu'a determiner une marge d'erreur et a voir ce que ca donne quand le bateau en mouvement (serez vous toujours la si j'ai rebesoin d'aide ? )

    En tout cas merci infinniment j'aurais eu beaucoup beaucoup plus de mal sans vous (ya aucun matheux a part moi dans cette entreprise ... Ca fait peur..)
    Encore merci
    A bientot lol

    Post resolu

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Recherche de pays par Latitude/Longitude
    Par ram-0000 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 08/04/2008, 12h42
  2. recherche 1 position (latitude longitude) la + proche
    Par 83stef dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 14/05/2007, 20h52
  3. [CSV] extraire latitude/longitude de google map
    Par arnogef dans le forum Langage
    Réponses: 14
    Dernier message: 30/03/2007, 15h32
  4. Conversion Latitude,Longitude en UTM pour débutant.
    Par Messie dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/04/2006, 18h37
  5. Coordonnées de pixel avec glsl
    Par nodar3 dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/02/2006, 11h23

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