Tout d'abord, j'espère vraiment poster ça dans la bonne section parce que ça traite de trois sujets à la fois : math, géographie et programmation.
On m'a récemment demandé de créer un petit outil en javascript qui permet de convertir des coordonnées en degré-minute-seconde vers des coordonnées Lambert 93. J'y connais pas grand chose en conversion pour ce genre de données, mais les types qui m'ont demandé ça on prévu le coup : pour ça on m'a filé un petit document excel qui contiens toutes les formules don't j'ai besoin en VBScript. J'ai donc repris les formules que j'ai adapté dans le code suivant :
Pour la conversion, j'ai d'abord dû tout convertir depuis des coordonnées en degré-minute-secondes vers des coordonnées WGS84, puis de WGS84 vers du Lambert 93. C'était juste comme ça que c'était fait dans le VBscript donc je me suis pas trop posé de question.Code:function decimalToWGS84(nDeg, nMin, nSec, eDeg, eMin, eSec) { let coordWGS84 = []; let n = nDeg + nMin/60 + nSec/3600; let e = eDeg + eMin/60 + eSec/3600; coordWGS84.push(n); coordWGS84.push(e); console.log(coordWGS84); return coordWGS84; } function WGS84toLambert93(nWGS, eWGS) { /*Initialisation des constantes*/ //Constantes Ellipsoïde GRS80 let Ga = 6378137; let f = 1/298.257222101; let Exc = Math.sqrt(f * (2-f)); //Constantes Lambert93 let Xs = 700000; let Ys = 12655612.049876; let n = 0.725607765053267; let c = 11754255.42601; let LngO = 3 * (Math.PI/180); //3 en radian ici. let nWGSRad = nWGS * (Math.PI/180); //Pareil : c'est du radian. let eWGSRad = eWGS * (Math.PI/180); //Idem. let lamb93 = []; let x = Xs + c * Math.exp(-n * latitudeIso(nWGSRad, Exc)) * Math.sin(n * (eWGSRad - LngO)); let y = Ys - c * Math.exp(-n * latitudeIso(nWGSRad, Exc)) * Math.cos(n * (eWGSRad - LngO)); lamb93.push(x); lamb93.push(y); return lamb93; } function latitudeIso(lat, exc) { let latIso = Math.log(Math.tan(Math.PI / 4 + lat / 2)) - exc / 2 * Math.log((1 + exc + Math.sin(lat)) / (1 - exc * Math.sin(lat))); console.log("latISO : " + latIso); return latIso; } function decimalToLambert93(nDeg, nMin, nSec, eDeg, eMin, eSec) { let wgs = decimalToWGS84(nDeg, nMin, nSec, eDeg, eMin, eSec); return WGS84toLambert93(wgs[0], wgs[1]); } console.log(decimalToLambert93(48, 5, 0, 2, 27, 0));
Puis viens le moment des tests. J'utilise en entrée les coordonnées suivantes : 48° 5' 0" N, 2° 27' 0" E
Sur la fiche excel, après conversion, j'obtiens les coordonnées suivantes : 659583,829705313 N, 6776023,02301664 E
Sur mon javascript par contre, j'obtiens ces coordonnées là : 658380.6015193916 N, 6680489.777794514 E
Je pensez que vous voyez où est le problème : mon résultat est pas identique sur les deux versions. J'ai passé déjà trois jours à essayé de comprendre là où j'ai fais une erreur mais j'ai pas trouvé grand chose.
Du coup, plusieurs questions :
1 - Est-ce que mes calculs sont corrects ?
2 - Si mes calculs sont corrects, mon résultat l'est-il ?
3 - Si mon résultat est incorrect, où est le problème ? Est-ce un soucis de virgule flottante ?
Merci d'avance pour votre aide.
PS : voilà le code en VBScript que j'ai utilisé pour trouver les calculs, si vous voulez comparer :
Code:Private Sub CommandButton1_Click() Lat = Radians(Val(Lat_deg)) Lng = Radians(Val(Long_deg)) If Lg.Text = "W" Or Lg.Text = "w" Then Lng = -Lng Call Lambert_93(Ga, Exc, Xs, Ys, n, c, LngO) Valeur_x.Value = Format(Xs + c * Exp(-n * Lat_Iso(Lat, Exc)) * Sin(n * (Lng - LngO)), "#0.0000") Valeur_y.Value = Format(Ys - c * Exp(-n * Lat_Iso(Lat, Exc)) * Cos(n * (Lng - LngO)), "#0.0000") End Sub Public Sub Lambert_93(Ga, Exc, Xs, Ys, n, c, LngO) 'Constantes Ellipsoïde GRS 80 Ga = 6378137 f = 1 / 298.257222101 Exc = Sqr(f * (2 - f)) 'Constantes Lambert 93 Xs = 700000 Ys = 12655612.049876 n = 0.725607765053267 c = 11754255.42601 LngO = Radians(3) End Sub Public Function Radians(x) Radians = x * (4 * Atn(1) / 180) End Function Public Function Lat_Iso(Lat, Exc) Lat_Iso = Log(Tan(PI / 4 + Lat / 2)) - Exc / 2 * Log((1 + Exc * Sin(Lat)) / (1 - Exc * Sin(Lat))) End Function
-----