using System;
namespace ToLatLon_Test
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("UTM to LatLon test");
string input;
double utmX, utmY;
string Zone;
try {
// Console.Write("Enter utmX: ");
// input = Console.ReadLine();
// utmX = double.Parse(input);
// Console.Write("Enter utmY: ");
// input = Console.ReadLine();
// utmY = double.Parse(input);
// Console.Write("Enter UTM Zone: ");
// Zone = Console.ReadLine();
// Console.WriteLine();
// ToLatLon(utmX, utmY, Zone);
ToLatLon(451602.19, 4519076.99, "33N");
} catch(Exception e) {
Console.Write("Error: ");
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
public static void ToLatLon(double utmX, double utmY, string utmZone)
{
double latitude = 0;
double longitude = 0;
bool isNorthHemisphere = utmZone[utmZone.Length-1] >= 'N';
Console.WriteLine(isNorthHemisphere );
var diflat = -0.00066286966871111111111111111111111111;
var diflon = -0.0003868060578;
var zone = int.Parse(utmZone.Remove(utmZone.Length - 1));
Console.Write("zone\t");
Console.WriteLine(zone);
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;
Console.Write("e2\t");
Console.WriteLine(e2);
var e2cuadrada = Math.Pow(e2, 2);
Console.Write("e2cuadrada\t");
Console.WriteLine(e2cuadrada);
var c = Math.Pow(c_sa, 2) / c_sb;
Console.Write("c\t");
Console.WriteLine(c);
var x = utmX - 500000;
Console.Write("x\t");
Console.WriteLine(x);
var y = isNorthHemisphere ? utmY : utmY - 10000000;
Console.Write("y\t");
Console.WriteLine(y);
var s = ((zone * 6.0) - 183.0);
Console.Write("s\t");
Console.WriteLine(s);
var lat = y / (6366197.724 * 0.9996); // Change c_sa for 6366197.724
Console.Write("lat\t");
Console.WriteLine(lat);
var v = (c / Math.Pow(1 + (e2cuadrada * Math.Pow(Math.Cos(lat), 2)), 0.5)) * 0.9996;
Console.Write("v\t");
Console.WriteLine(v);
var a = x / v;
Console.Write("a\t");
Console.WriteLine(a);
var a1 = Math.Sin(2 * lat);
Console.Write("a1\t");
Console.WriteLine(a1);
var a2 = a1 * Math.Pow((Math.Cos(lat)), 2);
Console.Write("a2\t");
Console.WriteLine(a2);
var j2 = lat + (a1 / 2.0);
Console.Write("j2\t");
Console.WriteLine(j2);
var j4 = ((3 * j2) + a2) / 4.0;
Console.Write("j4\t");
Console.WriteLine(j4);
var j6 = (5 * j4 + a2 * Math.Pow((Math.Cos(lat)), 2)) / 3.0; // saque a2 de multiplicar por el coseno de lat y elevar al cuadrado
Console.Write("j6\t");
Console.WriteLine(j6);
var alfa = (3.0 / 4.0) * e2cuadrada;
Console.Write("alfa\t");
Console.WriteLine(alfa);
var beta = (5.0 / 3.0) * Math.Pow(alfa, 2);
Console.Write("beta\t");
Console.WriteLine(beta);
var gama = (35.0 / 27.0) * Math.Pow(alfa, 3);
Console.Write("gama\t");
Console.WriteLine(gama);
var bm = 0.9996 * c * (lat - alfa * j2 + beta * j4 - gama * j6);
Console.Write("bm\t");
Console.WriteLine(bm);
var b = (y - bm) / v;
Console.Write("b\t");
Console.WriteLine(b);
var epsi = ((e2cuadrada * Math.Pow(a, 2)) / 2.0) * Math.Pow((Math.Cos(lat)), 2);
Console.Write("epsi\t");
Console.WriteLine(epsi);
var eps = a * (1 - (epsi / 3.0));
Console.Write("eps\t");
Console.WriteLine(eps);
var nab = (b * (1 - epsi)) + lat;
Console.Write("nab\t");
Console.WriteLine(nab);
var senoheps = (Math.Exp(eps) - Math.Exp(-eps)) / 2.0;
Console.Write("senoheps\t");
Console.WriteLine(senoheps);
var delt = Math.Atan(senoheps / (Math.Cos(nab)));
Console.Write("delt\t");
Console.WriteLine(delt);
var tao = Math.Atan(Math.Cos(delt) * Math.Tan(nab));
Console.Write("tao\t");
Console.WriteLine(tao);
longitude = (delt / Math.PI) * 180 + s;
Console.Write("longitude\t");
Console.WriteLine(longitude);
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))) / Math.PI) * 180; // era incorrecto el calculo
Console.Write("latitude\t");
Console.WriteLine(latitude);
Console.WriteLine("Latitud: " + latitude.ToString() + "\nLongitud: " + longitude.ToString());
}
}
}