Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.



  1. #1
    Eox

    Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.


    ------

    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 :

    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));
    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.

    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

    -----

  2. Publicité
  3. #2
    vande545

    Re : Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.

    Bonjour

    J'ai un doute sur la première fonction à propos de l'absence de parenthèse.
    As-tu vérifié si la conversion degrés mn sec en degés décimaux est correcte ?

  4. #3
    Eox

    Re : Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.

    Bonjour

    J'ai un doute sur la première fonction à propos de l'absence de parenthèse.
    As-tu vérifié si la conversion degrés mn sec en degés décimaux est correcte ?
    Normalement elle est bonne. J'ai des résultats similaires sur les deux versions. 48.083333333333336 en latitude, 2.45 en longitute. J'ai une très petite différence sur la latitude en revanche, où le tout dernier chiffre est un 3 sur la version VBScript.

  5. #4
    vande545

    Re : Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.

    La différence est insignifiante et pour la 2e fonction, je ne peux pas t'aider.
    Es-tu dans l'obligation d'écrire le code ? Le recours à une fonction existante est-elle interdite ?
    Car il existe PROJ4JS qui semble répondre à tes besoins mais je n'ai pas testé.

  6. #5
    Eox

    Re : Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.

    J'ai totalement le droit d'utiliser une fonction qui existe déjà. Du coup, ça m'intéresse.

  7. A voir en vidéo sur Futura
  8. #6
    Eox

    Re : Convertir des coordonnées en degrés-minute-seconde vers des coordonnées Lambert 93.

    Du nouveau : j'ai trouvé mon erreur dans mes calculs. A priori j'avais mis un + à la place d'un * dans la fonction de calcul de la latitude isométrique.

    Mon calcule marche parfaitement maintenant. Merci à ceux qui ont essayé d'aider.

  9. Publicité

Sur le même thème :

Discussions similaires

  1. coordonnées Lambert Vs Géographiques
    Par bilinfo dans le forum Géologie et Catastrophes naturelles
    Réponses: 3
    Dernier message: 11/10/2015, 10h52
  2. Réponses: 1
    Dernier message: 11/03/2010, 22h15
  3. Réponses: 4
    Dernier message: 21/02/2009, 08h56
  4. Obtenir l'équivalent des coordonées latitude/longitude en coordonnées Lambert.
    Par Falindor dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 20/02/2009, 22h55
  5. Convertir Latitude et Longitude d une carte en coordonnées
    Par tanglung dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 16/02/2007, 22h03