![]() |
||||||||||
| ||||||||||
![]() |
|
|
Outils de la discussion | Rechercher | Modes d'affichage |
|
(#16)
|
|
(#17)
|
|
|||
|
Bonjour Phiz,
tu indiques //puis on calcule la latitude isométrique L = ln(tan(PI/4 + phi_n/2) * pow(((1-e_n*sin(phi_n))/(1+e_n*sin(phi_n))),(e_n/2))) moi je viens de récupérer un programme de conversion de coordonnées lat/long en degrées où on indique L = 0.5*log((1+sin(Phi))/(1-sin(Phi)))-exc*0.5*log((1+exc*sin(Phi))/(1-exc*sin(Phi))) D'où vient cette différence ? J'ai du mal à suivre entre toutes les formules Merci pour ta réponse |
|
(#18)
|
|
|||
|
Bon, merci les gars c'est du super boulot.
Mais j'effectue un portage en WinDev de la classe java et je dois avouer que j'ai quelques soucis. Je n'obtiens pas les résultats escomptés. Je pense que cela doit venir des fonctions utilisées. J'avais des formules tirées d'une feuille excel venant de l'IGN, mais malheuresement ces formules ne sont pas super précises contrairement à votre code qui donne quasiment les même résultat que le logiciel CIRCE de l'IGN (je considére que 2 chiffres, voire 3 après la virgule suffit amplement). Est ce que quelqu'un pourrait me donner les différentes valeurs des calculs intermédiaires pour que je puisse mettre au point mon programme (avec un jeu d'essai). Merci. _ [EDIT] _ Bon, ca y est j'ai trouvé.... WinDev travaille en degree au niveau des fonctions SIN, COS, ATAN, TAN. Donc ca marche pas.... J'ai implémenté en C et tout fonctionne. Merci à tous. Effectivement, je suis interessé par la formule inverse : Convertir du lambert 2 en WGS84...... A+ |
|
(#19)
|
|
|||
|
Citation:
Ci-dessous, mon implémentation en C# Code:
using System;
using System.Collections.Generic;
using System.Text;
namespace LT2versWGS84
{
class Program
{
static void Main(string[] args)
{
/*
* Quelques constantes ...
*/
double n = 0.7289686274;
double c = 11745793.39; // En mètres
double Xs = 600000; // En mètres
double Ys = 6199695.768; // En mètres
double l0 = 0;// 0.04079234433; // 0 pour Paris, l'autre pour Greenwich, en radians
double e = 0.08248325676;
double eps = Math.Pow(10,-11); // précision
/***********************************************************
* coordonnées dans la projection de Lambert 2 à convertir *
************************************************************/
double X = 300000;
double Y = 245000;
Console.WriteLine("X = " + X);
Console.WriteLine("Y = " + Y);
/*
* Conversion Lambert 2 -> NTF géographique : ALG0004
*/
Console.WriteLine("\n-----------------------------------------------\n");
Console.WriteLine("Conversion Lambert 2 -> NTF géographique");
double l;
double L;
double phi;
double phi0;
double phii;
double phiprec;
double R;
double g;
// Pour test : jeu de test d'ign. Cf. Algo 0004
/*X = 1029705.083;
Y = 272723.849;
n = 0.760405966;
c = 11603796.9767;
Ys = 5657616.674;*/
// fin test
R = Math.Sqrt(Math.Pow((X - Xs),2) + Math.Pow((Y - Ys),2));
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);
phiprec = phi0;
phii= 2 * Math.Atan((Math.Pow(((1 + e * Math.Sin(phiprec)) / (1 - e * Math.Sin(phiprec))), e / 2)
* Math.Exp(L))) - (Math.PI / 2);
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)
* Math.Exp(L))) - (Math.PI / 2);
}
phi = phii;
Console.WriteLine("Lambda = " + l + "rad = " + l * 200 /Math.PI + "gr");
Console.WriteLine("Phi = " + phi + "rad = " + phi * 200 /Math.PI + "gr");
/*
* Conversion NTF géographique -> NTF cartésien : ALG0009
*/
Console.WriteLine("\n-----------------------------------------------\n");
Console.WriteLine("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;
// Pour test : jeu de test d'IGN. Cf. Algo 0009
/*l = 0.01745329248;
phi = 0.02036217457;
h = 100;*/
// fin test
N = a / (Math.Pow((1 - Math.Pow(e, 2) * Math.Pow(Math.Sin(phi), 2)), 1 / 2));
X_cart = (N + h) * Math.Cos(phi) * Math.Cos(l);
Y_cart = (N + h) * Math.Cos(phi) * Math.Sin(l);
Z_cart = ((N * (1 - Math.Pow(e,2))) + h) * Math.Sin(phi);
Console.WriteLine("X cartésien NTF = " + X_cart);
Console.WriteLine("Y cartésien NTF = " + Y_cart);
Console.WriteLine("Z cartésien NTF = " + Z_cart);
/*
* Conversion NTF cartésien -> WGS84 cartésien : ALG0013
*/
Console.WriteLine("\n-----------------------------------------------\n");
Console.WriteLine("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;
Console.WriteLine("X cartésien WGS84 = " + XWGS84);
Console.WriteLine("Y cartésien WGS84 = " + YWGS84);
Console.WriteLine("Z cartésien WGS84 = " + ZWGS84);
/*
* Conversion WGS84 cartésien -> WGS84 géographique : ALG0012
*/
Console.WriteLine("\n-----------------------------------------------\n");
Console.WriteLine("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.8181919106; // On change e pour le mettre dans le système WGS84 au lieu de NTF
// Pour test : jeu de tests d'IGN. Cf. Algo 0012
/*XWGS84 = 6376064.695;
YWGS84 = 111294.623;
ZWGS84 = 128984.725;
l840 = 0;
e = 0.08248325679;*/
// Fin tests
P = Math.Sqrt(Math.Pow(XWGS84, 2) + Math.Pow(YWGS84, 2));
l84 = l840 + Math.Atan(YWGS84 / XWGS84);
phi840 = Math.Atan(ZWGS84 / (P * (1 - ((a * Math.Pow(e, 2))
/ Math.Sqrt(Math.Pow(XWGS84, 2) + Math.Pow(YWGS84, 2) + Math.Pow(ZWGS84, 2))))));
phi84prec = phi840;
phi84i = Math.Atan((ZWGS84 / P) * Math.Pow(1 - ((a * Math.Pow(e, 2) * Math.Cos(phi84prec))
/ (P * Math.Sqrt(1 - Math.Pow(e, 2) * Math.Pow(Math.Sin(phi84prec), 2)))), -1));
while (!(Math.Abs(phi84i - phi84prec) < eps))
{
phi84prec = phi84i;
phi84i = Math.Atan((ZWGS84 / P) * Math.Pow(1 - ((a * Math.Pow(e, 2) * Math.Cos(phi84prec))
/ (P * Math.Sqrt(1 - (Math.Pow(e, 2) * Math.Pow(Math.Sin(phi84prec), 2))))), -1));
}
phi84 = phi84i;
Console.WriteLine("lat WGS84 = " + l84 + "rad = " + l84 * 200 / Math.PI + "gr");
Console.WriteLine("long WGS84 = " + phi84 + "rad = " + phi84 * 200 / Math.PI + "gr");
Console.ReadLine();
}
}
}
|
|
(#20)
|
|
|||
|
Citation:
Au niveau logique, je ne te suis pas : Tu dis que chaque algorithme marche séparement(validé par des tests avec des données IGN), mais quand tu les regroupes, cela ne fonctionne plus ?En traçant chaque variable, tu n'y arrives pas ?Tu essayé de séparer tes quatres étapes en fonction ? ca parait bizarre Citation:
... |
|
(#21)
|
|
|||
|
Bonjour,
Citation:
en utilisant cette valeur, on trouve la bonne latitude. Toutefois, la longitude reste erronée. Si quelqu'un a une idée... _ [EDIT] _ Citation:
[EDIT] FAUX --> on a quelques centaines de mètres d'erreur en latitude |
|
(#22)
|
|
(#23)
|
|
|||
|
Citation:
( http://www.ign.fr/telechargement/MPr...RCE/NTG_71.pdf ) Désolé, je ne vois pas le lien entre nos deux formules et pourtant j'ai retourné la mienne dans tout les sens pour faire apparaitre la tienne et je n'ai retrouvé que la moitié de la formule (-exc*0.5*......) (Anko Jansen) -- Je suis schizophrène et moi aussi. (Thomas Jung) |
|
(#24)
|
|
|||
|
Bonjour tout le monde,
J'ai moi même aussi repris les algos de l'IGN et ai les mêmes problèmes que Bapt. Les algos sont bons avec les jeux d'essai de l'IGN, mais dès que l'on test avec ses propres donnée, les résultats sont... "amusants"... Voici mon code: Citation:
![]() |
|
(#25)
|
|
(#26)
|
|
(#27)
|
|
||||
|
Citation:
la comparaison portait sur l'écart en planimétrie de points observés en wgs 84 et transformés en lambert zone
les écarts étaient tous inférieurs à 10 cm, et la plupart du temps d'environ 5 cm tout porte à croire selon moi que les résultats donnés par Circé sont corrects ils l'ont été en tout cas pour les tests décrits ci-dessus NB : certains gps permettent de stocker les transformations par grille et de les appliquer aux coordonnées wgs 84 observées directement sur le terrain si l'on souhaite travailler dans un lambert zone de très bonne qualité, sans avoir à déterminer les similitudes, c'est vraiment pas mal |
|
(#28)
|
|
||||
|
Bonsoir,
Merci pour vos contribution. Voici ci-dessous de quoi transformer des coordonnées en WGS84 (de google par exemple) en des coordonnées lambert II étendue. La fonction est écrite en php. Y. |
|
(#29)
|
|
(#30)
|
|
|||
|
Citation:
bonjour a tous, je suis complétement débutant en geomatique etc ... je cherche le script php qui fasse la conversion inverse (qqchose du type lambert2wgs84.php) a l'avance merci. ps : j'ai essayé de m'en sortir avec les doc de l'ign mais je nage ... http://www.ign.fr/telechargement/MPr...CE/transfo.pdf http://www.ign.fr/telechargement/FAQ/FAQ1.pdf http://www.ign.fr/telechargement/MPr...RCE/NTG_71.pdf |
![]() |
| Outils de la discussion | Rechercher |
| Modes d'affichage | |
|
|
Discussions similaires
|
||||
| Discussion | Auteur | Forum | Réponses | Dernier message |
| [GPS] Conversion des coordonnées | mattfon | Espace GPS et Solutions Nomades | 1 | 07/07/2006 12h39 |
| [Conversion] Formule mathématique de conversion Lambert2 (Zone) vers Lambert2 Etendu | ftdemo | Assistance Technique | 6 | 28/12/2005 07h55 |
| [MapInfo 6.x] Conversion de coordonnées géographiques | nouss | Assistance Technique | 2 | 03/08/2005 17h56 |
| [MapServer] Conversion coordonnées mapserver to image | celine | Assistance et Programmation | 2 | 23/05/2005 11h33 |
| [Access] Conversion de coordonnées | jhaigron | Assistance et Programmation | 5 | 20/04/2005 17h03 |