大地测量实习报告(武汉大学版本)

课程编号:               课程性质:专业必修

大地测量课程设计 

总 结 报 告

学院:   测绘学院 

专业:   测绘工程  

地点:   武汉大学  

班级:20##级xx班

组号:    17     

姓名:   xxx  

学号:    xxxxx     

教师: 

20##年06月27日 至 20##年07月15日

 目录

封面... 1

技术报告... 3

1.      实习目的和意义... 3

2.      实习任务... 3

3.      测区概况... 3

4.      已知高程... 3

5.      作业依据(包括各种限差和要求)... 4

6.  踏勘、选点... 4

7.  使用的仪器和仪器检验... 4

8.  精密二等水准数据采集和外业概算过程中的有关情况... 4

9.  精密二等水准测量外业高程概算成果... 4

10. 大地测量计算所采用的编程语言、各个任务的框图和编程思想以及基本数学模型等... 4

11. 大地测量计算成果汇总... 8

实习报告

1.1    技术报告

1.1.1实习的目的和意义

  本次《大地测量计算与实习》是在我们完成《大地测量学》课程的基础上进行的,通过这次实习,我们锻炼并提高了仪器操作能力、实际动手能力和团队协作能力,同时巩固了在课堂上学到理论知识。同时在后期的编程计算过程中,提升了我们发现问题、提出问题、解决问题的能力,将学到的知识进一步发散,提升自己的计算机能力,加强创新能力,为后期的工作打下基础。

1.1.2 实习任务

本次实习共有两项任务

(1) 二等精密水准测量外业观测与概算

(2) 大地测量

1.1.3 测区概况

本次我们17小组抽取的测区是珞珈山测区,这段水准线路环绕武汉大学文理学部珞珈山一周,较大二上学期进行的三、四等水准测量线路较短,整个测段除了从教务部至珞珈山庄和教务部至校医院地势起伏较大外,其余测段都较为平坦,地质为混凝土和柏油马路,由于部分测段在居民生活区,来往车辆较多,道路为典型的盘山公路。下图标注的是我的测段。

1.1.4已知高程

本次我组使用的已知高程点为教务部高程点,高程为126.157m

1.1.5 作业依据

国家测绘局,国家一、二等水准测量规范20##-05-24 测绘出版社,2010仪器的检验

 (1)水准仪的i角限差为15″(2)标尺的零点不等差为0.10mm

观测方式    。

1.1.6 踏勘、选点

本次实习的路线已经确定,踏勘选点的过程比较简单,最后我们组选取了教务部、政管院、研究总院指示牌、校区警务室、老同志干休所以及校医院六个点。

1.1.7使用的仪器和检验

本次我组使用的仪器是Trimble的DiNi电子水准仪以及配套水准尺,精度很高。我们进行了水准仪i角检验和水准尺零点差检验(结果另附),完全符合测量规范要求。

1.1.8精密二等水准数据采集与数据概算

水准线路图已在测绘概况中绘出,观测日期与观测时段在观测记录薄中记载详细,数据记录规范、清晰。

1.1.9详见附录6

1.1.10程序部分

本次大地测量采用的是C#语言,C#是一种安全的、稳定的、简单的、优雅的语言,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言,并且C#成为ECMA与ISO标准规范。C#看似基于C++写成,但又融入其它语言如Pascal、Java、VB等。与C++不一样的是C#不支持对指针的访问,保证了程序的健壮性,但是不适应于对于指针的操作。此次程序共有四个窗体,一个类组成,类是白塞尔大地主题解算的算法。

第一个窗体为总窗体,其余的分别是高斯正反算和实测斜距归算至高斯平面和白塞尔大地主题结算和一个GaussCaculate的类。

程序主体

一、高斯投影正反算

正算是指:由大地坐标(L, B)求得高斯平面坐标(x, y)的过程。

反算是指:由高斯平面坐标(x, y)求得大地坐标(L, B)的过程。

正算:高斯投影必须满足的三个条件:

(1),中央子午线投影后为直线。

(2),中央子午线投影后长度不变。

(3),投影具有正性性质,即正性投影条件。

由第一个条件可知,中央子午线东西两侧的投影必然对称于中央子午线。设在托球面上有P1 ,P2,且对称于中央子午线。其大地坐标为(l, B),(-l, B)则投影后的平面坐标一定为P1(x, y),P2(x,-y).

由第二个条件可知,位于中央子午线上的点,投影后的纵坐标x应该等于投影前从赤道量至该点的子午弧长。

计算公式:

1.当将克拉索夫斯基椭球带入计算式,可得到正算公式:

其中:

     

     

     

     

     

     

2.反算公式为:

其中:

这道题目由于已经给出了相当精确地电算公式,因此过程比较简单,

二、实测斜距化算到高斯平面距离

假设1、2两个大地点在椭球面上沿法线的投影点1’和2’间的大地线的长度为S,由于在椭球面上两点间大地线长度与相应法截线长度之差是极微小的,可以忽略不计,则可以将两点间的发截线长度认为是该两点间的大地线长度。并且,两点间的发截线的长度与半径等于其起始点曲率半径的圆弧长相差也很小,则所求的大地线长度可以认为是半径。其计算如下:

S·=D*{[1-(h2-h1)/D*(h2-h1)/D]/[(1+h1/Ra)*(1+h2/Ra)]}

这个题目的思想是先利用题目所给的X\Y坐标求出其大地纬度和大地经度,具体投影可以用三度带和六度带,即先利用高斯投影正反算求出经纬度,再利用第三题白塞尔大地主题结算求出在一号的大地方位角,具体流程图如下。

 

三  大地主题正反算

   大地主题解算:知道某些大地元素推求另一些大地元素的过程。

   正解是指:已知某点P1的大地坐标(L2,B2),且知该点到另一点P2(L2,B2)的大地线长及其大地方位角A12,计算P2点的大地坐标(L2,B2)和大地线在P2点的反方位角A21.的过程。

   反解是指:已知P1和P2的大地坐标(L1,B1)和P2(L2,B2)计算P1至P2的大地线长,正反方位角A12、A21的过程。

   大地主题解算的基本思想:将椭球面上的大地元素按照白塞尔投影条件投影到辅助球面上,继而在球面上进行大地主题解算,最后在将球面上的计算结果换算到椭球面上。其关键问题是找出椭球面上的大地元素与球面上相应元素之间的关系式,同时解决在球面上进行大地主题解算的方法。

   白塞尔的三个投影条件:

(1)椭球面大地线投影到球面上为大圆弧;

(2)大地线和大圆弧上相应点的方位角相等;

(3)球面上任意一点的纬度等于球面上相应点的归化纬度。

   大地主题解算的步骤:

(1)按椭球面上的已知值计算球面相应值,即实现椭球面向球面的过渡;

(2)在球面上解算大地问题;

(3)按球面上得到的数值计算椭球面上的相应数值,即实现从圆球向椭球的过渡。

此次选用的是白塞尔大地主题解算。

白塞尔大地主题正算公式:

中间量:

辅助函数:

球面长度:

经差改正数:

终点大地坐标及大地方位角:

白塞尔大地主题反算公式:

辅助计算:

采用迭代法同时计算起点大地方位角、球面长度及经差

第一次趋近,取

将计算得到的  再带回计算经差,直到最后两次相同或小于给定的允许值。

大地线长

反方位角

三、大地测量计算成果

(1)高斯投影正反算计算结果(采用第38组数据):

(2)实测斜距化算至高斯投影平面边长计算结果(采用克拉索夫斯基椭球):

D12 = 578.8683m。

(3)大地主题解算计算结果(采用第17组第7号数据):

(4)实测数据外业高差与概略高程表计算结果:

每公里往返高差中数的偶然中误差 M = 0.04mm,各个小测段的概略高程结果见附录6。

附录1

i角的检校

仪器:TRIMBLE DINi方法:       观测者:xxx

日期:2011/6/28        标尺:            记录者:xxx

时间:8:30   am       呈像:清晰         检查者:xxx

附录2

一对水准尺零点差测定

标尺:条码式铟瓦尺N0.1 NO.2                       观测者:xxx

仪器: Trimble DiNi   NO.09008524                  记录者:xxx

日期:  20##年6月8日                            检查者:xxx

附录3

_二_ 等 水 准 点 之 记

           线                                         点名:

附录5

第一题

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace 大地课程设计3

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            if (radioButton1.Checked ==true)

            {

                double x = 0, y = 0;

                double B0, B, B1, l, l1, N, a0, a3, a4, a5, a6, π, ρ, T1, T2, T3;

                //l = 1078.3596;

                l1 = (Convert.ToDouble(textBox4.Text) - Convert.ToDouble(textBox7.Text)) * 3600 + (Convert.ToDouble(textBox5.Text) - Convert.ToDouble(textBox8.Text)) * 60 +

                    (Convert.ToDouble(textBox6.Text) - Convert.ToDouble(textBox9.Text));//经差化为秒

                π = 3.141592654;

                ρ = 180.0 * 3600.0 / π;

                l = l1 / ρ;//经差化成弧度

                T1 = Convert.ToDouble(textBox1.Text); //度

                T2 = Convert.ToDouble(textBox2.Text);//分

                T3 = Convert.ToDouble(textBox3.Text);//秒

                B = T1 * 3600 + T2 * 60 + T3;//化成秒

                B1 = T1 + T2 / 60.0 + T3 / 3600.0;//化成度

                B0 = B / ρ;//化为弧度

                double m = Math.Pow(Math.Cos(B0), 2);

                N = 6399698.902 - (21562.267 - (108.973 - 0.612 * m ) *m ) *m ;

                a0 = 32140.404 - (135.3302 - (0.7092 - 0.0040 *m ) *m ) *m ;

                a3 = (0.3333333 + 0.001123 * m ) *m  - 0.1666667;

                a4 = (0.25 + 0.00252 *m ) *m  - 0.04166;

                a5 = 0.0083 - (0.1667 - (0.1968 + 0.0040 * m ) * m ) * m ;

                a6 = (0.166 *m  - 0.084) * m ;

                double n = Math.Pow(l, 2);

                x = 6367558.4969 * B0 - (a0 - (0.5 + (a4 + a6 * n ) *n ) * n  * N) * Math.Sin(B0) * Math.Cos(B0);

                y = (1 + (a3 + a5 *n ) * n ) * l * N * Math.Cos(B0)+500000;

                textBox10.Text =x.ToString("0.0000");

                textBox11.Text =y.ToString("0.0000");

                /*MessageBox.Show(" B:" + B + "\n" + " B0:" + B0 + "\n" + " B1:" + B1 + "\n" + " cosB0" + Math.Cos(B0) + "\n" + " sinB0" + Math.Sin(B0) + "\n" +

                "N:" + N + "\n" + "l:" + l + " \n " + " a0: " + a0 + "\n" + " a4: " + a4 + " \n" + " a3 :" + a3 + " \n" + " a6:" + a6 + " \n" + " a5:" + a5 + " \n");

                */  }

            else

            {

                double Bf, B, B3, L, L0, L3, l, β, Z, Nf, b2, b3, b4, b5, ρ, π;

                int B1, B2, L1, L2;

                π = 3.141592654;

                ρ = 180.0 * 3600.0 / π;

                L0 = 126;

                β = Convert.ToDouble(textBox10.Text)  / 6367558.4969;//单位是弧度

                double m = Math.Pow(Math.Cos(β), 2);

                Bf = β + (50221746 + (293662 + (2350 + 22 * m ) * m ) * m ) * Math.Pow(10, -10) * Math.Sin(β) * Math.Cos(β) ;

                double n = Math.Pow(Math.Cos(Bf), 2);//单位是弧度

                Nf = 6399698.902 - (21562.267 - (108.973 - 0.612 *n ) * n ) * n ;

                Z =( Convert.ToDouble(textBox11.Text)-500000) / (Nf * Math.Cos(Bf));

                b2 = (0.5 + 0.003369 * n ) * Math.Sin(Bf) * Math.Cos(Bf);

                b3 = 0.333333 - (0.166667 - 0.001123 *n ) *n ;

                b4 = 0.25 + (0.16161 + 0.00562 *n ) * n ;

                b5 = 0.2 - (0.1667 - 0.0088 *n ) * n ;

                B = Bf - (1 - (b4 - 0.12 * Z * Z) * Z * Z) * Z * Z * b2 ;//弧度

                B = B * 180.0 / π;//度

                B1 = (int)B;//度

                B2 = (int)((B - B1) * 60);//分

                B3 = B * 3600 - B1 * 3600 - B2 * 60;//秒

                l = (1 - (b3 - b5 * Z * Z) * Z * Z) * Z * ρ;//秒

                l = l / 3600.0;//度

                L = L0 + l;

                L1 = (int)L;

                L2 = (int)((L - L1) * 60);

                L3 = L * 3600 - L1 * 3600 - L2 * 60;

                textBox1.Text = Convert.ToString(B1); textBox4.Text =Convert.ToString (L1);

                textBox2.Text = Convert.ToString(B2); textBox5.Text = Convert.ToString(L2);

                textBox3.Text =B3 .ToString ("0.00"); textBox6.Text = L3 .ToString ("0.00");

                /*MessageBox.Show(" Bf:" + Bf + "\n" + " β ;" + β + "\n " + " Nf ;" + Nf + "\n " + "cos(Bf) ;" + Math.Cos(Bf) + "\n " + "sin( Bf)  ;" + Math.Sin(Bf) + "\n "

                    + "b2  ;" + b2 + "\n " + "b3 ;" + b3 + "\n " + "b4 ;" + b4 + "\n " + "b5;" + b5 + "\n " + "Z ;" + Z + "\n " + " 反算的大地坐标B:" + B1 + "°" + B2 + "′" + B3 + "″" + "\n" +" L:" + L1 + "°" + L2 + "′" + L3 + " ″" + "\n");*/

            }

        }

 }

}

第二题

  private void button2_Click(object sender, EventArgs e)

        {

            double X1, X2, Y1, Y2, Ym, Y12, Hm, H12, Rm, R1, Bm;

            double D, S;//斜距和大地线长

            double V;

            double a = 6378245.000, b = 6356863.019, c, e1, e2;

            double k, l,m;

            //k = Math.Sin(A1);

            //l = Math.Cos(A1);

            const double d = 579.5888, π = 3.141592654, B1 = (41 + 40 / 60) * π / 180,B2 =(41+40/60+16/3600)*π / 180;

            const int H1 = 250, H2 = 280;

        

            X1 = Convert.ToDouble(textBox3.Text);

            Y1 = Convert.ToDouble(textBox4.Text);

            X2 = Convert.ToDouble(textBox5.Text);

            Y2 = Convert.ToDouble(textBox6.Text);

           

            c = a * a / b;

            e1 = Math.Sqrt(a * a - b * b) / a;

            e2 = Math.Sqrt(a * a - b * b) / b;

            //W = Math.Sqrt(1 - e1 * e1 * Math.Sin(B)*Math .Sin(B));

            Bm =(B1 + B2)/2;

            V =Math .Sqrt (1+e2 *e2 *Math .Cos(Bm)*Math .Cos(Bm));

          //  M = a * (1 - e * e) / W * W * W;

            Ym = (Y1 + Y2) / 2;

            Y12 = Y2 - Y1;

            Rm = c /( V * V);

            H12 = H1 - H2;

            Hm = (H1 + H2) / 2;

          //  m = Y12 / (X2 - X1);

            l = Math.Sqrt(1 / (m * m + 1));

            k = l * m;

           // k = Math.Cos(B2) * Math.Sqrt(1 + e2 * e2 * Math.Cos(B1) * Math.Cos(B1)) / (Math.Cos(B1) * Math.Sqrt(1 + e2 * e2 * Math.Cos(B2) * Math.Cos(B2)));

           //A1 =Math .Asin( k) ;

          // l  = Math.Sqrt(1 - k *k );

           R1 = c / (Math.Sqrt(1 + e2 * e2 * Math.Cos(B1) * Math.Cos(B1)) * (1 + e2 * e2 * Math.Cos(B1) * Math.Cos(B1) * l * l));

           S = d - H12 * H12 /( 2*d) - d * Hm / R1 + d * d * d /( 24 * R1 * R1 * R1);//大地线长

            D = (1 + Ym * Ym /( 2 * Rm * Rm) + Y12 * Y12 / (24 * Rm * Rm) + Ym * Ym * Ym * Ym / (24 * Rm * Rm * Rm * Rm)) * S;//由大地线求的的斜距

            MessageBox.Show("R1="+R1 +"\n"+"k="+k +"\n"+"Bm="+Bm+"\n"+"Rm="+Rm +"\n"+"s="+S +"\n"+"归算后的距离为D="+ D);

        }

第三题

public partial class Form4 : Form

    {

       public Form4()

        {

            InitializeComponent();

            ae[0].a = 6378245.0000000;//个即是克拉苏夫斯基

            ae[0].e = 0.006693421622966;

          

        }

       public struct canshu

       {

           public double a, e;

       }

      public canshu[] ae = new canshu[1];

          GeomaticsCalculate gc = new GeomaticsCalculate();

        int flag = 0;

         private void button1_Click_1(object sender, EventArgs e)

        {

                OpenFileDialog op = new OpenFileDialog();                      

                op.Filter = "正算文件(*.BLAS)|*.BLAS";

                op.Title = "打开正算文件:";

                if (op.ShowDialog() == DialogResult.OK)

                {

                    gc = new GeomaticsCalculate(op.FileName, flag);

                    gc.a = ae[0].a;

                    gc.e = ae[0].e;

                    this.textBox1.Text = gc.filepath;

                }           

        }

        private void button3_Click(object sender, EventArgs e)

        {

            OpenFileDialog op = new OpenFileDialog();

            op.Filter = "反算文件(*.BL2)|*.BL2";

            op.Title = "打开反算文件:";

            if (op.ShowDialog() == DialogResult.OK)

            {

                gc = new GeomaticsCalculate(op.FileName, flag);

                gc.a = ae[0].a;

                gc.e = ae[0].e;

                this.textBox2.Text = gc.filepath;

            }

        }

        private void button2_Click(object sender, EventArgs e)//正算

        {

            flag = 1;

         

                gc.Calculate1();

                List result1 = new List();

            for (int i=0;i< gc.C1 .Count ;i++)

            {

                result1.Add(gc.Rt1[i].B2);

                MessageBox.Show("B2=" + result1[i]);

            }

        }

        private void button4_Click(object sender, EventArgs e)//反算

        {

            flag = 2;

            gc.Calculate();

           // for (int i = 0; i < gc.C2.Count; i++)

            //{

             //   MessageBox.Show("A1:" + gc.hudu2jiaodu(gc.Rt2[i].A1) + "/n" +"A2:"+gc.hudu2jiaodu (gc .Rt2 [i ].A2 )+"/n"+ "S:" + gc.hudu2jiaodu(gc.Rt2[i].S) + "/n");

          //  }

        }

  class GeomaticsCalculate

    {

        public struct Collect2

        {

            public string qidian, zhongdian;

            public double B1, B2, L1, L2;//,H1,H2;

            //public double S;

        }

        public struct Collect1

        {

            public string pname1, pname2;

            public double B1, L1, A1, S;

        }

        public struct Result1

        {

            public double B2, L2, A2;

        }

        public struct Result2

        {

            public double S, A1, A2;

        }

        public string filepath;

        public List C1 = new List();

       public Result1 []Rt1;

        public List C2 = new List();

        public Result2[] Rt2;

        public double a = 0, e = 0;

        public GeomaticsCalculate()

        { }

        public double hudu2jiaodu(double hudu)

        {

            double t = 0, t1 = 0, t2;

            if (hudu >= 0)

            {

                t1 = t = hudu * 180 / Math.PI;

                t = Math.Floor(t1);//整度

                t1 = t1 - t;

                t2 = t1 = t1 * 60;

                t1 = Math.Floor(t1);//整分

                t2 = t2 - t1;

                t2 = Math.Round(t2 * 60, 4);//保留4位的秒

                t = t + t1 / 100 + t2 / 10000;

                return t;

            }

            else

            {

                double temp = Math.Abs(hudu);

                t1 = t = temp * 180 / Math.PI;

                t = Math.Floor(t1);//整度

                t1 = t1 - t;

                t2 = t1 = t1 * 60;

                t1 = Math.Floor(t1);//整分

                t2 = t2 - t1;

                t2 = Math.Round(t2 * 60, 4);//保留4位的秒

                t = t + t1 / 100 + t2 / 10000;

                return -t;

            }

        }

        public double du2hudu(double du)

        {

            double t = 0, t1 = 0, t2 = 0;

            if (du >= 0)

            {

                t = Math.Floor(du);///正度

                t1 = Math.Floor((du - t) * 100);///整分

                t2 = du * 10000 - t * 10000 - t1 * 100;///秒为单位

                return (t + t1 / 60 + t2 / 3600) / 180 * Math.PI;

            }

            else

            {

                double temp = -du;

                t = Math.Floor(temp);///正度

                t1 = Math.Floor((temp - t) * 100);///整分

                t2 = temp * 10000 - t * 10000 - t1 * 100;///秒为单位

                return -(t + t1 / 60 + t2 / 3600) / 180 * Math.PI;

            }

        }

        public GeomaticsCalculate(string path, int flag)

        {

            ////////////////////flag=1 白赛尔正算 flag=2 白赛尔反算

            filepath = path;

            if (flag == 1)

            {

                FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);

                StreamReader sr = new StreamReader(fs, Encoding.Default);

                while (sr.Peek() != -1)

                {

                    string[] temp = sr.ReadLine().Trim().Split(',');

                    Collect1 c1;

                    c1.pname1 = temp[0];

                    c1.pname2 = temp[1];

                    c1.B1 = du2hudu(Convert.ToDouble(temp[2]));

                    c1.L1 = du2hudu(Convert.ToDouble(temp[3]));

                    c1.A1 = du2hudu(Convert.ToDouble(temp[4]));

                    c1.S = Convert.ToDouble(temp[5]);

                    C1.Add(c1);

                }

                sr.Close();

            }

            if (flag == 2)

            {

                FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);

                StreamReader sr = new StreamReader(fs, Encoding.Default);

                while (sr.Peek() != -1)

                {

                    string[] temp = sr.ReadLine().Trim().Split(',');

                    Collect2 c2;

                    c2.qidian = temp[0];

                    c2.B1 = du2hudu(Convert.ToDouble(temp[1]));

                    c2.L1 = du2hudu(Convert.ToDouble(temp[2]));

                    string[] temp1 = sr.ReadLine().Trim().Split(',');

                    c2.zhongdian = temp1[0];

                    c2.B2 = du2hudu(Convert.ToDouble(temp1[1]));

                    c2.L2 = du2hudu(Convert.ToDouble(temp1[2]));

                    C2.Add(c2);

                }

                sr.Close();

            }

        }

        public double JudgeAtan(double dy, double dx)//判断tan的正负

        {

            double A = Math.Atan(dy / dx);

            if (dy > 0 && dx > 0)

                A = Math.Abs(A);

            else if (dy < 0 && dx > 0)

                A = A + 2 * Math.PI;

            else if (dx < 0 && dy < 0)

                A = Math.PI + A;

            else if (dx < 0 && dy > 0)

                A = Math.PI + A;

            else if (dx == 0 && dy > 0)

                A = Math.PI / 2;

            else if (dy < 0 && dx == 0)

                A = 3 * Math.PI / 2;

            return A;

        }

        public void  Calculate1()//白塞尔大地主题正算

        {

          

             Rt1    = new Result1 [C1.Count];

            for (int i = 0; i < C1.Count; i++)

            {

                double W1 = Math.Sqrt(1 - e * Math.Pow(Math.Sin(C1[i].B1), 2));

                double sinu1 = Math.Sin(C1[i].B1) * Math.Sqrt(1 - e) / W1;

                double cosu1 = Math.Cos(C1[i].B1) / W1;

                double sinA0 = cosu1 * Math.Sin(C1[i].A1);

                double cotct1 = cosu1 * Math.Cos(C1[i].A1) / sinu1;

                double sin2ct1 = 2 * cotct1 / (Math.Pow(cotct1, 2) + 1);

                double cos2ct1 = (Math.Pow(cotct1, 2) - 1) / (Math.Pow(cotct1, 2) + 1);

                double cosA02 = 1 - Math.Pow(sinA0, 2);

                double e1 = e / (1 - e);///e1实则为e'的平方

                double b = a * Math.Sqrt(1 - e);

                double k2 = e1 * cosA02;

                double A = b * (1 + k2 / 4 - 3.0 * k2 * k2 / 64 + 5.0 / 256.0 * k2 * k2 * k2);

                double B = b * (k2 / 8 - k2 * k2 / 32 + 15.0 / 1024.0 * k2 * k2 * k2);

                double C = b * (k2 * k2 / 128 - 3.0 / 512.0 * k2 * k2 * k2);

                double arf = (e / 2 + Math.Pow(e, 2) / 8 + Math.Pow(e, 3) / 16) - (Math.Pow(e, 2) / 16 + Math.Pow(e, 3) / 16) * cosA02

                    + (3.0 / 128.0 * Math.Pow(e, 3)) * cosA02 * cosA02;

                double beta = (Math.Pow(e, 2) / 32 + Math.Pow(e, 3) / 32) * cosA02 - Math.Pow(e, 3) / 64 * cosA02 * cosA02;

                double ct0 = (C1[i].S - (B + C * cos2ct1) * sin2ct1) / A;

                double sin2 = sin2ct1 * Math.Cos(2 * ct0) + cos2ct1 * Math.Sin(2 * ct0);

                double cos2 = cos2ct1 * Math.Cos(2 * ct0) - sin2ct1 * Math.Sin(2 * ct0);

                double ct = ct0 + (B + 5 * C * cos2) * sin2 / A;

                double dt = (arf * ct + beta * (sin2 - sin2ct1)) * sinA0;

                double sinu2 = sinu1 * Math.Cos(ct) + cosu1 * Math.Cos(C1[i].A1) * Math.Sin(ct);

                Rt1[i].B2 = Math.Atan(sinu2 / (Math.Sqrt(1 - e) * Math.Sqrt(1 - sinu2 * sinu2)));

                double lamuda = Math.Atan(Math.Sin(C1[i].A1) * Math.Sin(ct) / (cosu1 * Math.Cos(ct) - sinu1 * Math.Sin(ct) * Math.Cos(C1[i].A1)));

                if (Math.Sin(C1[i].A1) > 0 && Math.Tan(lamuda) > 0)

                {

                    lamuda = Math.Abs(lamuda);

                }

                if (Math.Sin(C1[i].A1) > 0 && Math.Tan(lamuda) < 0)

                {

                    lamuda = Math.PI - Math.Abs(lamuda);

                }

                if (Math.Sin(C1[i].A1) < 0 && Math.Tan(lamuda) < 0)

                {

                    lamuda = -Math.Abs(lamuda);

                }

                if (Math.Sin(C1[i].A1) < 0 && Math.Tan(lamuda) > 0)

                {

                    lamuda = Math.Abs(lamuda) - Math.PI;

                }

                Rt1[i].L2 = C1[i].L1 + lamuda - dt;

                Rt1[i].A2 = Math.Atan(cosu1 * Math.Sin(C1[i].A1) / (cosu1 * Math.Cos(ct) * Math.Cos(C1[i].A1) - sinu1 * Math.Sin(ct)));

                if (Math.Sin(C1[i].A1) < 0 && Math.Tan(Rt1[i].A2) > 0)

                {

                    Rt1[i].A2 = Math.Abs(Rt1[i].A2);

                }

                if (Math.Sin(C1[i].A1) < 0 && Math.Tan(Rt1[i].A2) < 0)

                {

                    Rt1[i].A2 = Math.PI - Math.Abs(Rt1[i].A2);

                }

                if (Math.Sin(C1[i].A1) > 0 && Math.Tan(Rt1[i].A2) > 0)

                {

                    Rt1[i].A2 = Math.PI + Math.Abs(Rt1[i].A2);

                }

                if (Math.Sin(C1[i].A1) > 0 && Math.Tan(Rt1[i].A2) < 0)

                {

                    Rt1[i].A2 = 2 * Math.PI - Math.Abs(Rt1[i].A2);

                }     

            }    

        }

        public void Calculate()/////////////////////反算

        {

           Rt2 = new Result2[C2.Count];

            for (int i = 0; i < C2.Count; i++)

            {

                double W1 = Math.Sqrt(1 - e * Math.Sin(C2[i].B1) * Math.Sin(C2[i].B1));

                double W2 = Math.Sqrt(1 - e * Math.Sin(C2[i].B2) * Math.Sin(C2[i].B2));

                double sinu1 = Math.Sin(C2[i].B1) * Math.Sqrt(1 - e) / W1;

                double cosu1 = Math.Cos(C2[i].B1) / W1;

                double sinu2 = Math.Sin(C2[i].B2) * Math.Sqrt(1 - e) / W2;

                double cosu2 = Math.Cos(C2[i].B2) / W2;

                double l = C2[i].L2 - C2[i].L1;

                double a1 = sinu1 * sinu2;

                double a2 = cosu1 * cosu2;

                double b1 = cosu1 * sinu2;

                double b2 = sinu1 * cosu2;

                double arf = 0, beta = 0;

                double dt1 = 0, dt2 = 0;

                double p, q;

                double lamd = l + dt1;

                p = cosu2 * Math.Sin(lamd);

                q = b1 - b2 * Math.Cos(lamd);

                Rt2[i].A1 = JudgeAtan(p, q);

                double sinct = p * Math.Sin(Rt2[i].A1) + q * Math.Cos(Rt2[i].A1);

                double cosct = a1 + a2 * Math.Cos(lamd);

                double ct = Math.Atan(sinct / cosct);

                if (cosct > 0)

                {

                    ct = Math.Abs(ct);

                }

                if (cosct < 0)

                {

                    ct = Math.PI - Math.Abs(ct);

                }

                double sinA0 = cosu1 * Math.Sin(Rt2[i].A1);

                double cosA02 = 1 - sinA0 * sinA0;

                double x = 2 * a1 - cosA02 * cosct;

                arf = (e / 2 + Math.Pow(e, 2) / 8 + Math.Pow(e, 3) / 16) - (Math.Pow(e, 2) / 16 + Math.Pow(e, 3) / 16) * cosA02

                    + (3.0 / 128.0 * Math.Pow(e, 3)) * cosA02 * cosA02;

                beta = (Math.Pow(e, 2) / 32 + Math.Pow(e, 3) / 32) * cosA02 - Math.Pow(e, 3) / 64 * cosA02 * cosA02;

                double beta1 = 2 * beta;

                dt2 = (arf * ct - beta1 * x * sinct) * sinA0;

                while (Math.Abs(dt2 - dt1) > 0.000000001)

                {

                    dt1 = dt2;

                    lamd = l + dt1;

                    p = cosu2 * Math.Sin(lamd);

                    q = b1 - b2 * Math.Cos(lamd);

                    Rt2[i].A1 = JudgeAtan(p, q);

                    sinct = p * Math.Sin(Rt2[i].A1) + q * Math.Cos(Rt2[i].A1);

                    cosct = a1 + a2 * Math.Cos(lamd);

                    ct = Math.Atan(sinct / cosct);

                    if (cosct > 0)

                    {

                        ct = Math.Abs(ct);

                    }

                    if (cosct < 0)

                    {

                        ct = Math.PI - Math.Abs(ct);

                    }

                    sinA0 = cosu1 * Math.Sin(Rt2[i].A1);

                    cosA02 = 1 - sinA0 * sinA0;

                    x = 2 * a1 - (1 - sinA0 * sinA0) * cosct;

                    arf = (e / 2 + Math.Pow(e, 2) / 8 + Math.Pow(e, 3) / 16) - (Math.Pow(e, 2) / 16 + Math.Pow(e, 3) / 16) * cosA02

                    + (3.0 / 128.0 * Math.Pow(e, 3)) * cosA02 * cosA02;

                    beta = (Math.Pow(e, 2) / 32 + Math.Pow(e, 3) / 32) * cosA02 - Math.Pow(e, 3) / 64 * cosA02 * cosA02;

                    beta1 = 2 * beta;

                    dt2 = (arf * ct - beta1 * x * sinct) * sinA0;

                }

                double e1 = e / (1 - e);///e1实则为e'的平方

                double b = a * Math.Sqrt(1 - e);

                double k2 = e1 * cosA02;

                double A = b * (1 + k2 / 4 - 3.0 * k2 * k2 / 64 + 5.0 / 256.0 * k2 * k2 * k2);

                double B = b * (k2 / 8 - k2 * k2 / 32 + 15.0 / 1024.0 * k2 * k2 * k2);

                double C = b * (k2 * k2 / 128 - 3.0 / 512.0 * k2 * k2 * k2);

                double B11 = 2 * B / cosA02;

                double C11 = 2 * C / (cosA02 * cosA02);

                double y = (cosA02 * cosA02 - 2 * x * x) * cosct;

                Rt2[i].S = A * ct + (B11 * x + C11 * y) * sinct;

                Rt2[i].A2 = JudgeAtan(cosu1 * Math.Sin(lamd), b1 * Math.Cos(lamd) - b2);

            }

        }

实习成绩评定表

相关推荐