Ejemplo n.º 1
0
        /// <summary>
        /// 将大地坐标转换为高斯平面坐标
        /// </summary>
        /// <param name="gBLH">大地坐标</param>
        /// <returns>高斯平面坐标</returns>
        private GeoxyH ConvertBLHToxyH(GeoBLH gBLH)
        {
            double _h      = gBLH.gH;
            double X       = GeodeticCalculate.LengthOfMeridian(re, gBLH.gB);
            double N       = GeodeticCalculate.UnitaryCircleRadius(re, gBLH.gB);
            double centerL = (gBLH.gL + 3600 * 360.0) % (3600 * 360.0);
            int    beltNo  = (int)(centerL / (6.0 * 3600)) + 1;

            centerL = 6.0 * 3600 * beltNo - 3.0 * 3600;
            double dl    = gBLH.gL - centerL;
            double sinB  = Math.Sin(gBLH.gB / Angle.Rou);
            double cosB  = Math.Cos(gBLH.gB / Angle.Rou);
            double t2    = Math.Pow(Math.Tan(gBLH.gB / Angle.Rou), 2);
            double yita2 = re.firste2 * cosB * cosB;
            double x1    = N * sinB * cosB * dl * dl / (2.0 * Angle.Rou * Angle.Rou);
            double x2    = N * sinB * Math.Pow(cosB, 3) * (5 - t2 + 9 * yita2 + 4 * yita2 * yita2) * Math.Pow(dl, 4) / (24.0 * Math.Pow(Angle.Rou, 4));
            double x3    = N * sinB * Math.Pow(cosB, 5) * (61 - 58 * t2 + t2 * t2) * Math.Pow(dl, 6) / (720.0 * Math.Pow(Angle.Rou, 6));
            double y1    = N * cosB * dl / Angle.Rou;
            double y2    = N * Math.Pow(cosB, 3) * (1 - t2 + yita2) * Math.Pow(dl, 3) / (6.0 * Math.Pow(Angle.Rou, 3));
            double y3    = N * Math.Pow(cosB, 5) * (5 - 18 * t2 + t2 * t2 + 14 * yita2 - 58 * t2 * yita2) * Math.Pow(dl, 5) / (120.0 * Math.Pow(Angle.Rou, 5));
            double _x    = X + x1 + x2 + x3;
            double _y    = y1 + y2 + y3 + 500000.0 + beltNo * 1000000.0;

            return(new GeoxyH(_x, _y, _h));
        }