c# - 将 UTM (wsg84) 坐标转换为纬度和经度

标签 c# bing-maps latitude-longitude utm

我已经搜索了一段时间(显然是在这里和谷歌上)寻找一种将一组 UTM 坐标转换为纬度和经度的巧妙方法。我有坐标并且我知道它们在哪个区域,但我如何将其转换为纬度和经度?我希望有某种类至少可以为我带来一些魔力,但它似乎并非如此:(

对此有什么建议吗?

我知道这是可以做到的,因为这个转换器似乎工作得很好 Geographic/UTM Coordinate Converter .

非常感谢任何输入! :)

谢谢!

最佳答案

这里是:

 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;
    }

关于c# - 将 UTM (wsg84) 坐标转换为纬度和经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2689836/

相关文章:

c# - Visual Studio 2012/2013 使用鼠标向后/向前导航与鼠标插件冲突

c# - ActiveReports 和 RichTextBox 的问题

c# - 为什么我不应该有一个单一的整体实用程序库?

javascript - mouse click event.pagex 在移动版 chrome 浏览器 (v30.0.1599.92) 中为 NaN

php - 使用 IP 地址查找纬度和经度

mysql - 在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地方

android - 未检索到纬度和经度

mysql - 纬度和经度 mysql 列 FLOAT(10,6) 与 DECIMAL(10,6)

c# - 终结器在其对象仍在使用时启动

windows-phone-7 - 如何使用Windows Phone 7的Bing Maps将图钉内部的用户控件居中