Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将东/北距转换为Lat Lng_C#_Coordinates - Fatal编程技术网

C# 将东/北距转换为Lat Lng

C# 将东/北距转换为Lat Lng,c#,coordinates,C#,Coordinates,我一直在努力在不使用nuget包的情况下将北距/东距转换为纬度/长距。我确信我的UTM区域是30U(英国) 用C#怎么做呢 使用站点手动完成时。它提供了正确的值和位置。 东区:426342北区:505339 横向/纵向应为:54.44277977022131,-1.5953328509040021 我以前有一些关于stackoverflow的代码,但是它给了我错误的值 utmZone=“30U” 参考以下代码并运行LatLonConversions.convertolatlon(42634250

我一直在努力在不使用nuget包的情况下将北距/东距转换为纬度/长距。我确信我的UTM区域是30U(英国)

用C#怎么做呢

使用站点手动完成时。它提供了正确的值和位置。 东区:426342北区:505339 横向/纵向应为:54.44277977022131,-1.5953328509040021

我以前有一些关于stackoverflow的代码,但是它给了我错误的值

utmZone=“30U”


参考以下代码并运行
LatLonConversions.convertolatlon(426342505339)

公共类Latlon转换
{
常数双a=6377563.396;
常数双b=6356256.91;
常数双e2=(a-b)/a;
常数双n0=-100000;
常数双e0=400000;
常数双f0=0.999601272;
常数双φ0=0.855211333;
常数双λ0=-0.034906585;
常数双n=(a-b)/(a+b);
静态双lat,lng;
私有LatLonConversions(){}
专用静态双Deg2Rad(双x)
{
返回x*(Math.PI/180);
}
专用静态双Rad2Deg(双x)
{
返回x*(180/数学π);
}
专用静态双正弦平方(双x)
{
返回Math.Sin(x)*Math.Sin(x);
}
专用静态双TanSquared(双x)
{
返回Math.Tan(x)*Math.Tan(x);
}
专用静态双秒(双x)
{
返回1.0/Math.Cos(x);
}
专用静态无效OSGB36ToWGS84()
{
var airy1830=新参考单元(6377563.396、6356256.909);
var a=airy1830.maj;
var b=airy1830.min;
var eSquared=airy1830.ecc;
var phi=Deg2Rad(lat);
var lambda=Deg2Rad(液化天然气);
var v=a/(数学平方比(1-平方平方误差*平方误差(φ));
var H=0;//高度
变量x=(v+H)*数学Cos(φ)*数学Cos(λ);
变量y=(v+H)*数学Cos(phi)*数学Sin(λ);
var z=((1-平方)*v+H)*数学Sin(φ);
var tx=446.448;
var-ty=-124.157;
var tz=542.060;
var s=-0.0000204894;
var rx=Deg2Rad(0.0000417222);
var ry=Deg2Rad(0.0000686111);
var rz=Deg2Rad(0.00023391666);
var xB=tx+(x*(1+s))+(-rx*y)+(ry*z);
var yB=ty+(rz*x)+(y*(1+s))+(-rx*z);
var zB=tz+(-ry*x)+(rx*y)+(z*(1+s));
var wgs84=新的参考单元(6378137.000,6356752.3141);
a=wgs84.maj;
b=wgs84.min;
eSquared=wgs84.ecc;
var lambdaB=Rad2Deg(数学常数(yB/xB));
var p=Math.Sqrt((xB*xB)+(yB*yB));
var phiN=Math.Atan(zB/(p*(1-eSquared));
对于(变量i=1;i<10;i++)
{
v=a/(数学平方比(1-平方误差*平方误差(phiN));
double phiN1=数学Atan((zB+(eSquared*v*Math.Sin(phiN)))/p);
phiN=phiN1;
}
var phiB=Rad2Deg(phiN);
lat=phiB;
lng=λ;
}
公共静态LatLon ConvertoLatlon(双东距、双北距)
{
RefEll airy1830=新的RefEll(6377563.396、6356256.909);
双OSGB_F0=0.9996012717;
双倍N0=-100000.0;
双E0=400000.0;
双phi0=Deg2Rad(49.0);
双λ0=Deg2Rad(-2.0);
双a=airy1830.maj;
双b=airy1830.min;
双eSquared=airy1830.ecc;
双φ=0.0;
双λ=0.0;
双E=东距;
双N=北距;
双n=(a-b)/(a+b);
双M=0.0;
双φ素数=((N-N0)/(a*OSGB_F0))+φ0;
做
{
M=
(b*OSGB_F0)
*((1+n+((5.0/4.0)*n*n)+(5.0/4.0)*n*n*n))
*(phiPrime-phi0))
-((3*n)+(3*n*n)+(21.0/8.0)*n*n*n))
*数学Sin(phiPrime-phi0)
*数学Cos(phiPrime+phi0))
+(((15.0/8.0)*n*n)+((15.0/8.0)*n*n*n))
*数学Sin(2.0*(phiPrime-phi0))
*Cos(2.0*(phiPrime+phi0)))
-((35.0/24.0)*n*n*n)
*数学Sin(3.0*(phiPrime-phi0))
*Cos(3.0*(phiPrime+phi0));
phiPrime+=(N-N0-M)/(a*OSGB_F0);
}而((N-N0-M)>=0.001);
var v=a*OSGB_F0*Math.Pow(1.0-平方误差*SinSquared(phiPrime),-0.5);
var rho=
A.
*OSGB_F0
*(1.0-eSquared)
*数学功率(1.0-eSquared*SinSquared(phiPrime),-1.5);
方差平方=(v/rho)-1.0;
var VII=数学Tan(φ素数)/(2*rho*v);
第八变种=
(数学Tan(phiPrime)/(24.0*rho*Math.Pow(v,3.0)))
* (5.0
+(3.0*TanSquared(phiPrime))
+埃塔平方
-(9.0*TanSquared(phiPrime)*etaSquared));
var IX=
(数学Tan(phiPrime)/(720.0*rho*Math.Pow(v,5.0)))
* (61.0
+(90.0*TanSquared(phiPrime))
+(45.0*TanSquared(phiPrime)*TanSquared(phiPrime));
var X=秒(phiPrime)/v;
席瓦西
(第二节(phiPrime)/(6.0*v*v*v))
*((v/rho)+(2*TanSquared(phiPrime));
变量XII=
(第(φ)节/(120.0*数学功率(v,5.0)))
* (5.0
+(28.0*TanSquared(phiPrime))
+(24.0*TanSquared(phiPrime)*TanSquared(phiPrime));
变种XIIA=
(第(φ)节/(5040.0*数学功率(v,7.0)))
* (61.0
+(662.0*TanSquared(phiPrime))
+(1320.0*TanSquared(phiPrime)*TanSquared(phiPrime))
+ (720.0
*TanSquared(phiPrime)
*TanSquared(phiPrime)
*TanSquared(phiPrime));
phi=
phiPrime
-(VII*数学功率(E-E0,2.0))
+(VIII*数学功率(E-E0,4.0))
-(IX*数学功率(E-E0,6.0));
兰姆达=
lambda0
+(X*(E-E0))
-(XI*数学功率(E-E0,3.0))
+(XII*数学功率(E-E0,5.0))
-(XIIA*数学功率(E-E0,7.0));
lat=Rad2Deg(φ);
lng=Rad2Deg(λ);
//转换为WGS84
OSGB36ToWGS84();
返回新LatLon(lat、lng);
}
}
公共类RefEll
{
公共双主、最小、ecc;
公共食堂(双大调、双小调)
{
maj=主要;
最小=次要;
ecc=((大调*大调)-(小调*小调))/(大调*大调);
}
}
公共级拉特隆
{
公共双纬度;
公共双经度;
公共厕所()
{
纬度=0;
经度=0;
}
公共车床(双车床,双车床)
{
纬度=纬度;
经度=经度;
}
}
  public static LatLng ToLatLon(double utmX, double utmY, string utmZone)
    {
    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));

    double longitude = ((delt * (180.0 / Math.PI)) + s) + diflon;
    double 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;

    return new LatLng
    {
        Latitude = latitude,
        Longitude = longitude
    };
}