18 votes

Conversion des coordonnées UTM (wsg84) en latitude et longitude

Cela fait un moment que je cherche (ici et sur google évidemment) un moyen efficace de convertir un ensemble de coordonnées UTM en Latitude et Longitude. J'ai les coordonnées et je sais dans quelle zone elles se trouvent, mais comment les convertir en latitude et longitude ? J'espérais qu'il y aurait une sorte de classe qui pourrait faire au moins une partie de la magie pour moi, mais cela ne semble pas être le cas :(

Des suggestions à ce sujet ?

Je sais que c'est possible, car ce convertisseur semble fonctionner parfaitement. Convertisseur de coordonnées géographiques/UTM .

Tous les commentaires sont les bienvenus ! :)

Gracias.

22voto

playful Points 166

Voici :

 public static void ToLatLon(double utmX, double utmY, string utmZone, out double latitude, out double longitude)
    {
        bool isNorthHemisphere = utmZone.Last() >= 'N';

        var diflat = -0.00066286966871111111111111111111111111;
        var diflon = -0.0003868060578;

        var zone = int.Parse(utmZone.Remove(utmZone.Length - 1));
        var c_sa = 6378137.000000;
        var c_sb = 6356752.314245;
        var e2 = Math.Pow((Math.Pow(c_sa,2) - Math.Pow(c_sb,2)),0.5)/c_sb;
        var e2cuadrada = Math.Pow(e2,2);
        var c = Math.Pow(c_sa,2) / c_sb;
        var x = utmX - 500000;
        var y = isNorthHemisphere ? utmY : utmY - 10000000;

        var s = ((zone * 6.0) - 183.0);
        var lat = y / (c_sa * 0.9996);
        var v = (c / Math.Pow(1 + (e2cuadrada * Math.Pow(Math.Cos(lat), 2)), 0.5)) * 0.9996;
        var a = x / v;
        var a1 = Math.Sin(2 * lat);
        var a2 = a1 * Math.Pow((Math.Cos(lat)), 2);
        var j2 = lat + (a1 / 2.0);
        var j4 = ((3 * j2) + a2) / 4.0;
        var j6 = ((5 * j4) + Math.Pow(a2 * (Math.Cos(lat)), 2)) / 3.0;
        var alfa = (3.0 / 4.0) * e2cuadrada;
        var beta = (5.0 / 3.0) * Math.Pow(alfa, 2);
        var gama = (35.0 / 27.0) * Math.Pow(alfa, 3);
        var bm = 0.9996 * c * (lat - alfa * j2 + beta * j4 - gama * j6);
        var b = (y - bm) / v;
        var epsi = ((e2cuadrada * Math.Pow(a, 2)) / 2.0) * Math.Pow((Math.Cos(lat)), 2);
        var eps = a * (1 - (epsi / 3.0));
        var nab = (b * (1 - epsi)) + lat;
        var senoheps = (Math.Exp(eps) - Math.Exp(-eps)) / 2.0;
        var delt  = Math.Atan(senoheps/(Math.Cos(nab) ) );
        var tao = Math.Atan(Math.Cos(delt) * Math.Tan(nab));

        longitude = ((delt * (180.0 / Math.PI)) + s) + diflon;
        latitude = ((lat + (1 + e2cuadrada * Math.Pow(Math.Cos(lat), 2) - (3.0 / 2.0) * e2cuadrada * Math.Sin(lat) * Math.Cos(lat) * (tao - lat)) * (tao - lat)) * (180.0 / Math.PI)) + diflat;
    }

13voto

Gart Points 1276

Jetez un coup d'œil à cette bibliothèque .NET http://projnet.codeplex.com/ . Ceci devrait vous aider dans votre cas

4voto

Nick Points 31

Le code c++ est disponible sur ce site : http://www.gpsy.com/gpsinfo/geotoutm/

Descendez un peu dans la page jusqu'à la rubrique "Code source" et cherchez ces fichiers en bas de page :

Chuck Gantz

Pièces jointes : LatLong-UTMconversion.cpp (voir en ligne comme fichier texte) LatLong-UTMconversion.h (voir en ligne comme fichier texte) UTMConversions.cpp (voir en ligne comme fichier t SwissGrid.cpp (voir en ligne comme fichier texte) constants.h (voir en ligne comme fichier texte)

Par exemple, le premier fichier renvoie à : www.gpsy.com/gpsinfo/geotoutm/gantz/LatLong-UTMconversion.cpp etc

Il existe des fonctions permettant d'aller dans les deux sens : UTM vers Lat Long, et vice versa. Si vous cherchez ailleurs, il existe des versions python de ce code. Par exemple at code.google.com/p/pys60gps/source/browse/trunk/lib/LatLongUTMconversion.py?r=246

Il existe également des versions c# de certaines d'entre elles : à mediakey.dk/~cc/convert-northing-and-east-utm-to-longitude-and-latitude/

Bonne chance.

4voto

oware Points 35

J'ai fait un portage d'une librairie javascript vers C#, je l'ai testé et il fonctionne parfaitement, vous pouvez y jeter un coup d'œil ici .

1voto

Gorpik Points 7276

Si vous souhaitez créer vos propres fonctions, vous trouverez de nombreuses informations utiles sur cette page :

http://www.colorado.edu/geography/gcraft/notes/coordsys/coordsys.html

J'ai quelques fonctions pour convertir entre lat-lon et UTM (dans les deux sens), mais elles sont un peu longues à écrire ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X