1. 程式人生 > >大地測量學白塞爾大地主題解算

大地測量學白塞爾大地主題解算

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語言時老師教的基礎課,需要程式的苦逼測繪人可以聯絡我,學長幫人到底。
謝謝閱讀