public static double[] Convert(double x, double y, LambertVersion version) { int index = (int) version; double[] ntabs = {0.7604059656, 0.7289686274, 0.6959127966, 0.6712679322, 0.7289686274, 0.7256077650}; double[] ctabs = {11603796.98, 11745793.39, 11947992.52, 12136281.99, 11745793.39, 11754255.426}; double[] Xstabs = {600000.0, 600000.0, 600000.0, 234.358, 600000.0, 700000.0}; double[] Ystabs = {5657616.674, 6199695.768, 6791905.085, 7239161.542, 8199695.768, 12655612.050}; double n = ntabs[index]; double c = ctabs[index]; // En mètres double Xs = Xstabs[index]; // En mètres double Ys = Ystabs[index]; // En mètres double l0 = 0.0; //correspond à la longitude en radian de Paris (2°20'14.025" E) par rapport à Greenwich double e = 0.08248325676; //e du NTF (on le change après pour passer en WGS) double eps = Math.Pow(10, -10); // précision /*********************************************************** * coordonnées dans la projection de Lambert 2 à convertir * ************************************************************/ double X = x; double Y = y; Output("X = " + X); Output("Y = " + Y); /* * Conversion Lambert 2 -> NTF géographique : ALG0004 */ Output("\n-----------------------------------------------\n"); Output("Conversion Lambert 2 -> NTF géographique"); double l; double L; double phi; double phi0; double phii; double phiprec; double R; double g; R = Math.Sqrt(((X - Xs) * (X - Xs)) + ((Y - Ys) * (Y - Ys))); g = Math.Atan((X - Xs) / (Ys - Y)); l = l0 + (g / n); L = -(1 / n) * Math.Log(Math.Abs(R / c)); phi0 = 2 * Math.Atan(Math.Exp(L)) - (Math.PI / 2.0); phiprec = phi0; phii = 2 * Math.Atan((Math.Pow(((1 + e * Math.Sin(phiprec)) / (1 - e * Math.Sin(phiprec))), e / 2.0) * Math.Exp(L))) - (Math.PI / 2.0); while (!(Math.Abs(phii - phiprec) < eps)) { phiprec = phii; phii = 2 * Math.Atan((Math.Pow(((1 + e * Math.Sin(phiprec)) / (1 - e * Math.Sin(phiprec))), e / 2.0) * Math.Exp(L))) - (Math.PI / 2.0); } phi = phii; Output("Lambda = " + l + "rad = " + l * 200 / Math.PI + "gr"); Output("Phi = " + phi + "rad = " + phi * 200 / Math.PI + "gr"); /* * Conversion NTF géographique -> NTF cartésien : ALG0009 */ Output("\n-----------------------------------------------\n"); Output("Conversion NTF géographique -> NTF cartésien"); double N; double X_cart; double Y_cart; double Z_cart; double a = 6378249.2; double h = 100; // En mètres double XWGS84; double YWGS84; double ZWGS84; N = a / (Math.Pow((1 - (e * e) * (Math.Sin(phi) * Math.Sin(phi))), 0.5)); X_cart = (N + h) * Math.Cos(phi) * Math.Cos(l); Y_cart = (N + h) * Math.Cos(phi) * Math.Sin(l); Z_cart = ((N * (1 - (e * e))) + h) * Math.Sin(phi); Output("X cartésien NTF = " + X_cart); Output("Y cartésien NTF = " + Y_cart); Output("Z cartésien NTF = " + Z_cart); /* * Conversion NTF cartésien -> WGS84 cartésien : ALG0013 */ Output("\n-----------------------------------------------\n"); Output("Conversion NTF cartésien -> WGS84 cartésien"); // Il s'agit d'une simple translation XWGS84 = X_cart - 168; YWGS84 = Y_cart - 60; ZWGS84 = Z_cart + 320; Output("X cartésien WGS84 = " + XWGS84); Output("Y cartésien WGS84 = " + YWGS84); Output("Z cartésien WGS84 = " + ZWGS84); /* * Conversion WGS84 cartésien -> WGS84 géographique : ALG0012 */ Output("\n-----------------------------------------------\n"); Output("Conversion WGS84 cartésien -> WGS84 géographique"); double P; double phi840; double phi84prec; double phi84i; double phi84; double l840 = 0.04079234433; // 0.04079234433 pour passer dans un référentiel par rapport au méridien // de Greenwich, sinon mettre 0 double l84; e = 0.08181919106; // On change e pour le mettre dans le système WGS84 au lieu de NTF a = 6378137.0; P = Math.Sqrt((XWGS84 * XWGS84) + (YWGS84 * YWGS84)); l84 = l840 + Math.Atan(YWGS84 / XWGS84); phi840 = Math.Atan(ZWGS84 / (P * (1 - ((a * e * e)) / Math.Sqrt((XWGS84 * XWGS84) + (YWGS84 * YWGS84) + (ZWGS84 * ZWGS84))))); phi84prec = phi840; phi84i = Math.Atan((ZWGS84 / P) / (1 - ((a * e * e * Math.Cos(phi84prec)) / (P * Math.Sqrt(1 - e * e * (Math.Sin(phi84prec) * Math.Sin(phi84prec))))))); while (!(Math.Abs(phi84i - phi84prec) < eps)) { phi84prec = phi84i; phi84i = Math.Atan((ZWGS84 / P) / (1 - ((a * e * e * Math.Cos(phi84prec)) / (P * Math.Sqrt(1 - ((e * e) * (Math.Sin(phi84prec) * Math.Sin(phi84prec)))))))); } phi84 = phi84i; Output("lat WGS84 = " + l84 + "rad = " + l84 * 180.0 / Math.PI + " deg"); Output("long WGS84 = " + phi84 + "rad = " + phi84 * 180.0 / Math.PI + " deg"); return new double[] { phi84 * 180.0 / Math.PI, l84 * 180.0 / Math.PI }; }
public static double[] Convert(double x, double y, LambertVersion version) { int index = (int)version; double[] ntabs = { 0.7604059656, 0.7289686274, 0.6959127966, 0.6712679322, 0.7289686274, 0.7256077650 }; double[] ctabs = { 11603796.98, 11745793.39, 11947992.52, 12136281.99, 11745793.39, 11754255.426 }; double[] Xstabs = { 600000.0, 600000.0, 600000.0, 234.358, 600000.0, 700000.0 }; double[] Ystabs = { 5657616.674, 6199695.768, 6791905.085, 7239161.542, 8199695.768, 12655612.050 }; double n = ntabs[index]; double c = ctabs[index]; // En mètres double Xs = Xstabs[index]; // En mètres double Ys = Ystabs[index]; // En mètres double l0 = 0.0; //correspond à la longitude en radian de Paris (2°20'14.025" E) par rapport à Greenwich double e = 0.08248325676; //e du NTF (on le change après pour passer en WGS) double eps = Math.Pow(10, -10); // précision /*********************************************************** * coordonnées dans la projection de Lambert 2 à convertir * ************************************************************/ double X = x; double Y = y; Output("X = " + X); Output("Y = " + Y); /* * Conversion Lambert 2 -> NTF géographique : ALG0004 */ Output("\n-----------------------------------------------\n"); Output("Conversion Lambert 2 -> NTF géographique"); double l; double L; double phi; double phi0; double phii; double phiprec; double R; double g; R = Math.Sqrt(((X - Xs) * (X - Xs)) + ((Y - Ys) * (Y - Ys))); g = Math.Atan((X - Xs) / (Ys - Y)); l = l0 + (g / n); L = -(1 / n) * Math.Log(Math.Abs(R / c)); phi0 = 2 * Math.Atan(Math.Exp(L)) - (Math.PI / 2.0); phiprec = phi0; phii = 2 * Math.Atan((Math.Pow(((1 + e * Math.Sin(phiprec)) / (1 - e * Math.Sin(phiprec))), e / 2.0) * Math.Exp(L))) - (Math.PI / 2.0); while (!(Math.Abs(phii - phiprec) < eps)) { phiprec = phii; phii = 2 * Math.Atan((Math.Pow(((1 + e * Math.Sin(phiprec)) / (1 - e * Math.Sin(phiprec))), e / 2.0) * Math.Exp(L))) - (Math.PI / 2.0); } phi = phii; Output("Lambda = " + l + "rad = " + l * 200 / Math.PI + "gr"); Output("Phi = " + phi + "rad = " + phi * 200 / Math.PI + "gr"); /* * Conversion NTF géographique -> NTF cartésien : ALG0009 */ Output("\n-----------------------------------------------\n"); Output("Conversion NTF géographique -> NTF cartésien"); double N; double X_cart; double Y_cart; double Z_cart; double a = 6378249.2; double h = 100; // En mètres double XWGS84; double YWGS84; double ZWGS84; N = a / (Math.Pow((1 - (e * e) * (Math.Sin(phi) * Math.Sin(phi))), 0.5)); X_cart = (N + h) * Math.Cos(phi) * Math.Cos(l); Y_cart = (N + h) * Math.Cos(phi) * Math.Sin(l); Z_cart = ((N * (1 - (e * e))) + h) * Math.Sin(phi); Output("X cartésien NTF = " + X_cart); Output("Y cartésien NTF = " + Y_cart); Output("Z cartésien NTF = " + Z_cart); /* * Conversion NTF cartésien -> WGS84 cartésien : ALG0013 */ Output("\n-----------------------------------------------\n"); Output("Conversion NTF cartésien -> WGS84 cartésien"); // Il s'agit d'une simple translation XWGS84 = X_cart - 168; YWGS84 = Y_cart - 60; ZWGS84 = Z_cart + 320; Output("X cartésien WGS84 = " + XWGS84); Output("Y cartésien WGS84 = " + YWGS84); Output("Z cartésien WGS84 = " + ZWGS84); /* * Conversion WGS84 cartésien -> WGS84 géographique : ALG0012 */ Output("\n-----------------------------------------------\n"); Output("Conversion WGS84 cartésien -> WGS84 géographique"); double P; double phi840; double phi84prec; double phi84i; double phi84; double l840 = 0.04079234433; // 0.04079234433 pour passer dans un référentiel par rapport au méridien // de Greenwich, sinon mettre 0 double l84; e = 0.08181919106; // On change e pour le mettre dans le système WGS84 au lieu de NTF a = 6378137.0; P = Math.Sqrt((XWGS84 * XWGS84) + (YWGS84 * YWGS84)); l84 = l840 + Math.Atan(YWGS84 / XWGS84); phi840 = Math.Atan(ZWGS84 / (P * (1 - ((a * e * e)) / Math.Sqrt((XWGS84 * XWGS84) + (YWGS84 * YWGS84) + (ZWGS84 * ZWGS84))))); phi84prec = phi840; phi84i = Math.Atan((ZWGS84 / P) / (1 - ((a * e * e * Math.Cos(phi84prec)) / (P * Math.Sqrt(1 - e * e * (Math.Sin(phi84prec) * Math.Sin(phi84prec))))))); while (!(Math.Abs(phi84i - phi84prec) < eps)) { phi84prec = phi84i; phi84i = Math.Atan((ZWGS84 / P) / (1 - ((a * e * e * Math.Cos(phi84prec)) / (P * Math.Sqrt(1 - ((e * e) * (Math.Sin(phi84prec) * Math.Sin(phi84prec)))))))); } phi84 = phi84i; Output("lat WGS84 = " + l84 + "rad = " + l84 * 180.0 / Math.PI + " deg"); Output("long WGS84 = " + phi84 + "rad = " + phi84 * 180.0 / Math.PI + " deg"); return(new double[] { phi84 * 180.0 / Math.PI, l84 * 180.0 / Math.PI }); }