Calcul de distance

lojaynaboalwafa Messages postés 4 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 13 mai 2014 - Modifié par KX le 13/04/2014 à 14:13
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 20 avril 2014 à 18:38
on veut de calculer la distance entre deux points géographiques A(la1,lg2)et B(la1,lg2) en utilisant la formule suivante :
String value1=la.getText();
 String value2=lon.getText();
 String value3=lat.getText();
 String value4=log.getText();
 String value5=tx1.getText();
 String value6=tx2.getText();
 double X1=Double.parseDouble(value1);
 double Y1=Double.parseDouble(value2);
 double X2=Double.parseDouble(value3);
 double Y2=Double.parseDouble(value4);
  X1=X1*Math.PI%180;
            X2=X2*Math.PI%180;
            Y1=Y1*Math.PI%180;
            Y2=Y2*Math.PI%180;

 double  dx =X1-X2;
double dy =Y1-Y2;
double dz=Math.cos((Y1+Y2)% 2) * dy*dy;
 double distance=6371* Math.sqrt(dx+dz);
dis.setText(Double.toString(distance ));

il donner une valeur si on prend de valeurs quelconques
mais lorsque on veut tester les resultats ne donner pas un valeur si on entrer de valeur de google earth exactement on avoir NAN pour resultat pouvez -vous m'aider :)

4 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
13 avril 2014 à 17:58
Bonsoir,

ta formule est fausse, les latitudes et longitudes ne peuvent pas être considérées comme un plan orthonormés.
Même à toute petite échelle.

Il faut calculer une orthodromie.
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
13 avril 2014 à 18:18
Quoi !!?? La distance la plus courte c'est pas toujours la ligne droite !?
On m'aurait donc menti ?

Ceci dit, s'il pouvait commencer par bien faire ses divisions par 2, ce serait déjà un bon début. Au pire, il aura la distance à "vol de taupe", ce qui à petite échelle n'est pas plus faux que de considérer la Terre comme étant ronde...

Quoi !!?? La Terre n'est pas ronde !? On m'aurait donc menti ? ^^
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
13 avril 2014 à 20:33
s'il pouvait commencer par bien faire ses divisions par 2, ce serait déjà un bon début
C'est sûr!

Quoi !!?? La Terre n'est pas ronde !? On m'aurait donc menti ? ^^
Et non http://fr.wikipedia.org/wiki/WGS_84

Les demi axes a et b correspondent aux deux "rayons" de référence de l'ellipsoïde choisi.
Pour le GRS80, on voit une différence de 21 km, soit 42 km sur le diamètre.
Sur 12 000 km ça peut paraître peu, mais si on calculait les coordonnées en se basant sur une sphère, un bateau naviguant près du pôle aurait une hauteur sur l'ellipsoïde de -21 km, pas très parlant.
Mais bon, vu le ton te le savais déjà ;-).

il aura la distance à "vol de taupe", ce qui à petite échelle n'est pas plus faux que de considérer la Terre comme étant ronde
là je ne suis pas d'accord, les différences se font rapidement voir, ça dépend bien sûr de la précision attendue.
Mais par exemple, en tenant compte d'un ellipsoïde qui colle parfaitement à l'Europe , c-a-d celui de Clarke, en calculant la bonne orthodromie, en arrondissant le pouce d'une décimale de trop (on dit que c'est 2,54 cm, mais ça n'est pas tout à fait exact) et bien les deux foreuses qui creusaient le tunnel sous la manche sont passées à coté l'une de l'autre.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
13 avril 2014 à 20:41
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
14 avril 2014 à 08:03
la distance à "vol de taupe", ce qui à petite échelle n'est pas plus faux que de considérer la Terre comme étant ronde

Ce que je voulais dire par là c'est que si l'on prend un arc de cercle (R.θ) ou la corde associée 2R.sin(θ/2), pour de petites valeurs de θ les distances seront proches.

Pour une distance calculée en arc de cercle à 100 km, la ligne droite fera 99.999 km. Pour 1000 km effectivement on commence à avoir une perte de précision puisqu'on calculerait 998.974 km mais ce n'est déjà plus la petite échelle dont je parlais.

Sachant que la distance réelle n'est évidemment ni l'arc de cercle, ni la corde (mais l'orthodromie), ma remarque disait juste que ce n'était pas plus faux de considérer l'une ou l'autre de ces deux approximations.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
13 avril 2014 à 11:37
Salut,
NaN signifie "Not a Number"

Je ne sais pas ce que tu entres à ton programme mais il doit y avoir un soucis dans les données.

Tu as peut être un dépassement de capacité des tes variables si ce que tu entre est très grand, ca peut arriver. Dans ce cas, il faudra que tu passes par la classe BigInteger pour t'en sortir.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
13 avril 2014 à 14:25
Bonjour,

Tu as un problème avec tes divisions !
L'opérateur
%
donne le reste d'une division, or ce que tu devrais utiliser à chaque fois c'est l'opérateur
/
qui donne le quotient de la division.

Par exemple la moyenne de Y1 et Y2, c'est
(Y1+Y2)/2
, pas
(Y1+Y2)%2
!
Du coup tout tes calculs sont faux, à commencer par tes conversions degrés → radians.

Et pour revenir à ta question, tu obtiendras
NaN
si tu fais
Math.sqrt(dx+dz)
avec
dx+dz<0
...
0
lojaynaboalwafa Messages postés 4 Date d'inscription dimanche 13 avril 2014 Statut Membre Dernière intervention 13 mai 2014
20 avril 2014 à 12:08
salut , j'essaye de travail avec vos conseils ;mais cette fois le probleme qui je n'avoir pas le valeur exacte de distance.
NB: c'est la fonction qui j'utilise.

double dist ( double la1,double lg1,double la2,double lg2)
{
la1 = la1 * Math.PI / 180;
la2 = la2 * Math.PI / 180;
lg1 = lg1 * Math.PI / 180;
lg2 = lg2 * Math.PI / 180;
double dis = 6366*Math.acos(Math.cos(la1) *Math.cos(la2)* Math.cos(lg1-lg2) +Math.sin(la1)*Math.sin(la2));
return dis;
}
mais je sais pas quelle est l'erreur !!!
ou bien est ce que n'est pas la formule juste ???
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
Modifié par KX le 20/04/2014 à 23:38
Bonsoir,

La formule semble plutôt correcte, si ce n'est ton 6366. Je ne sais pas d'où il sort, mais le rayon de la Terre est de 6371 km...

De plus on ne peut pas totalement exclure que tu ne te sois pas trompé ailleurs dans ton code et que les valeurs de la1, lg1, la2 et lg2 soient fausses avant même d'entrer dans la méthode, ce qui expliquerait du coup pourquoi le résultat est faux.

Remarque : comme on le rappelait avec Whismeril, la Terre n'est pas parfaitement sphérique mais légèrement aplatie. Donc ta formule, qui s'applique à une sphère, ne donnera qu'une approximation du résultat, avec une marge d'erreur de 0.5% sur les latitudes et 0.2% sur les longitudes.
0
Rejoignez-nous