大地测量学白塞尔大地主题解算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34069180/article/details/51581831
namespace 大地测量学1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double L1 = 130 + (10 * 60 + 12.2676) / 3600.0, B1 = 41 + (1 * 60 + 35.6874) / 3600.0, A12 = 1 + (49 * 60 + 43) / 3600.0, S = 80000.0;

            double ρ = 206264.806247096355,
            a = 6378245, b = 6356863.0187730473, c = 6399698.9017827110, α = 1 / 298.3, e2 = 0.006693421622966, eΒ = 0.006738525414683;//先BLA是角度,BmLmAm是弧度直接进行运算,可以直接进行三角函数运算,感觉在最上边声明MATH后就不用再一个一个的代用;
            L1 = L1 /180.0 * Math.PI;
            B1 = B1 /180.0 * Math.PI;
            A12 = (A12 / 180.0) * Math.PI;

            //转化为弧度
            double Wm = Math.Sqrt((1 - e2 * (Math.Sin(B1)) * (Math.Sin(B1))));//在此处e2为平方
            double Nm = a / Wm;
            double Mm = a * (1 - e2) / (Wm * Wm * Wm);
            double B02 = ρ / Mm * S * Math.Cos(A12);
            double L02 = ρ / Nm * S * Math.Sin(A12) * (Math.Cos(B1) / Math.Sin(B1));
            double A02 = L02 * Math.Sin(B1);
            L1 = 130 + (10 * 60 + 12.2676) / 3600.0;
            B1 = 41 + (1 * 60 + 35.6874) / 3600.0;
            A12 = 1 + (49 * 60 + 43) / 3600.0;
            double Bm = B1 + 1 / 2.0 * B02 / 3600;
            double Am = A12 + 1 / 2.0 * A02 / 3600;//此时为角度

            Bm = Bm/180*Math.PI;
            Am = Am/180*Math.PI;//此时为弧度

            double L2 = ρ / Nm * S * Math.Sin(Am) * (Math.Cos(Bm) / Math.Sin(Bm)) * (1 + A02 * A02 / (24 * ρ * ρ) - B02 * B02 / (24 * ρ * ρ));
            double B2 = ρ / Mm * S * Math.Cos(Am) * (1 + L02 * L02 / 12 / (ρ * ρ) + A02 * A02 / 24 / (ρ * ρ))/*我用了一个连续相除*/;
            double A2 = ρ / Nm * S * Math.Sin(Am) * Math.Tan(Bm) * (1 + B02 * B02 / 12 / ρ / ρ + L02 * L02 / 12 / ρ / ρ * Math.Cos(Bm) * Math.Cos(Bm) + A02 * A02 / 24 / ρ / ρ);
            double i = 1;
            for (i = 1; (Math.Abs(B2 - B02) > 0.0001); i++)
            {
                Bm = B1 + 1 / 2.0 * B2 / 3600;
                Am = A12 + 1 / 2.0 * A2 / 3600;//此时为角度
                Bm = Bm / 180 * Math.PI;
                Am = Am / 180 * Math.PI;//此时为弧度

                B02 = B2;
                L02 = L2;
                A02 = A2;

                L2 = ρ / Nm * S * Math.Sin(Am) * (Math.Cos(Bm) / Math.Sin(Bm)) * (1 + A02 * A02 / (24 * ρ * ρ) - B02 * B02 / (24 * ρ * ρ));
                B2 = ρ / Mm * S * Math.Cos(Am) * (1 + L02 * L02 / 12 / (ρ * ρ) + A02 * A02 / 24 / (ρ * ρ))/*我用了一个连续相除*/;
                A2 = ρ / Nm * S * Math.Sin(Am) * Math.Tan(Bm) * (1 + B02 * B02 / 12 / ρ / ρ + L02 * L02 / 12 / ρ / ρ * Math.Cos(Bm) * Math.Cos(Bm) + A02 * A02 / 24 / ρ / ρ);
            }

            double B = B1 + B2/3600;//角度
            double L = L1 + L2 / 3600;
            double A21 = A12 + A2/3600+180;


            Console.WriteLine("{0} {1}", i , B);
            textBox1.Text = Convert.ToString(B);
            textBox3.Text = Convert.ToString(L);
            textBox5.Text = Convert.ToString(A21); 
         }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            double L1 = 130 + (10 * 60 + 12.2676) / 3600.0, B1 = 41 + (1 * 60 + 35.6874) / 3600.0;

            double ρ = 206264.806247096355,
            a = 6378245, b = 6356863.0187730473, c = 6399698.9017827110,  e2 = 0.006693421622966, eΒ = 0.006738525414683;//先BLA是角度,BmLmAm是弧度直接进行运算,可以直接进行三角函数运算,感觉在最上边声明MATH后就不用再一个一个的代用;
            double L2 = 130.196203938625;
            double B2 = 41.7465640175246;
            double L = L2 - L1;
            L= L / 180.0 * Math.PI;
            double Bm = (B1 + B2) / 2.0;
            double Lm = (L1 + L2) / 2.0;//此时为角度
            L1 = L1 / 180.0 * Math.PI;
            B1 = B1 / 180.0 * Math.PI;
            //转化为弧度
            L2 = L2 / 180.0 * Math.PI;
            B2 = B2/ 180.0 * Math.PI;
            double W1 = Math.Sqrt(1 - e2 * Math.Sin(B1) * Math.Sin(B1));
            double W2 = Math.Sqrt(1 - e2 * Math.Sin(B2));

            double u1, u2;
            //Math.Sin(u1) = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1;
            //Math.Sin(u2) = Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
            //Math.Cos(u1) = Math.Cos(B1) / W1;
            //Math.Cos(u2) = Math.Cos(B2) / W2;
            double a1 = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1 * Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
            double a2 = Math.Cos(B1) / W1 * Math.Cos(B2) / W2;
            double b1 = Math.Cos(B1) / W1 * Math.Sin(B2) * Math.Sqrt(1 - e2) / W2;
            double b2 = Math.Sin(B1) * Math.Sqrt(1 - e2) / W1 * Math.Cos(B2) / W2;

            double δ = 0.0;
            double λ=L+δ;//这时候sitar为弧度
            double p=Math.Cos(B2)/W2*Math.Sin(λ);
            double q = b1 - b2 * Math.Cos(λ);
            double A1 = Math.Atan(p / q);
            A1 = A1 / Math.PI * 180;//此时为角度
            if (p > 0)
            {
                if (q > 0)
                {
                    A1 = Math.Abs(A1);
                }
                else
                {
                    A1 = 180 - Math.Abs(A1);
                }
            }
            else
            {
                if (q < 0)
                {
                    A1 = 180 + Math.Abs(A1);
                }
                else
                {
                    A1 = 360 - Math.Abs(A1);
                }
            }
            //Math.Sin(δ) = p * Math.Sin(A1) + q * Math.Cos(A1);
            //Math.Cos(δ) = a1 + a2 * Math.Cos(λ);
            double o = Math.Atan(p * Math.Sin(A1) + q * Math.Cos(A1) / a1 + a2 * Math.Cos(λ));//此时为弧度
            o = o / Math.PI * 180;//此时为角度
            if ((a1 + a2 * Math.Cos(λ)) > 0)
            {
                o = Math.Abs(o);
            }
            else
            {
                o = 180 - Math.Abs(o);
            }
            //Math.Cos(A0)
            //把A1化为弧度
            A1=A1/Math.PI*180;
            double zy=Math.Cos(B1) / W1*Math.Sin(A1);
            o=o/180*Math.PI;//化弧
            //Math .Sqrt(1-zy*zy);
            //sin a0=cos u1*sin A1;
            double α = (33523299 - (28189 - 70 *(1-zy*zy)) *(1-zy*zy)) * 0.0000000001;
            double Β1 = (28189 - 94 * (1-zy*zy)) * 0.0000000001;
            double x=2*a1-(1-zy*zy)*Math.Cos(δ);
            double δ1 = (α * o - Β1 * x * Math.Sin(o)) * (Math.Cos(B1) / W1 * Math.Sin(A1));
            ///////////////////////////
            ///////////////////////////
            ///////////////////////////
            double i=1;
            for(i=1;Math.Abs(δ1-δ)>0.000001;i++)
            {
                 δ = δ1;
                 λ = L + δ;
                 p = Math.Cos(B2) / W2 * Math.Sin(λ);
                 q = b1 - b2 * Math.Cos(λ);
                 A1 = Math.Atan(p / q);
                A1 = A1 / Math.PI * 180;//此时为角度
                if (p > 0)
                {
                    if (q > 0)
                    {
                        A1 = Math.Abs(A1);
                    }
                    else
                    {
                        A1 = 180 - Math.Abs(A1);
                    }
                }
                else
                {
                    if (q < 0)
                    {
                        A1 = 180 + Math.Abs(A1);
                    }
                    else
                    {
                        A1 = 360 - Math.Abs(A1);
                    }
                }
                //Math.Sin(δ) = p * Math.Sin(A1) + q * Math.Cos(A1);
                //Math.Cos(δ) = a1 + a2 * Math.Cos(λ);
                o = Math.Atan(p * Math.Sin(A1) + q * Math.Cos(A1) / a1 + a2 * Math.Cos(λ));//此时为弧度
                o = o / Math.PI * 180;//此时为角度
                if ((a1 + a2 * Math.Cos(λ)) > 0)
                {
                    o = Math.Abs(o);
                }
                else
                {
                    o = 180 - Math.Abs(o);
                }
                //Math.Cos(A0)
                //把A1化为弧度
                A1 = A1 /180*Math.PI;
                 zy = Math.Cos(B1) / W1 * Math.Sin(A1);
                o = o / 180 * Math.PI;//化弧
                //Math .Sqrt(1-zy*zy); zy=sin A0 平方  cos  (1 - zy * zy)
                //sin a0=cos u1*sin A1;
                 α = (33523299 - (28189 - 70 * (1 - zy * zy)) * (1 - zy * zy)) * 0.0000000001;
                 Β1 = (28189 - 94 * (1 - zy * zy)) * 0.0000000001;
                 x = 2 * a1 - (1 - zy * zy) * Math.Cos(δ);
                 δ1 = (α * o - Β1 * x * Math.Sin(o)) * (Math.Cos(B1) / W1 * Math.Sin(A1));
            }
            double y = ((1 - zy * zy)*(1 - zy * zy) - 2 * x * x) * Math.Cos(o);
            double A = 6356863.020 + (10708.949 - 13.474 * (1 - zy * zy)) * (1 - zy * zy);
            double B22 = 10708.938 - 17.956 * (1 - zy * zy);
            double C22 = 4.487;
            double S = A * o + (B22 * x + C22 * y) * Math.Sin(o);
            double A2 = Math.Atan(Math.Cos(B1) / W1 * Math.Sin(λ) / (b1 * Math.Cos(λ) - b2));

            textBox2.Text = Convert.ToString(S);
            textBox4.Text = Convert.ToString(A2);
            textBox6.Text = Convert.ToString(y); 
        }
    }
}

程序运行界面

这个实验运用了两次迭代感觉自己已经基本掌握了迭代的用法,但是不知道反算哪里出了问题,伤心。。。不过逐渐搞懂了大一学习C语言时老师教的基础课,需要程序的苦逼测绘人可以联系我,学长帮人到底。
谢谢阅读

猜你喜欢

转载自blog.csdn.net/qq_34069180/article/details/51581831
今日推荐