大地主题解算

该文介绍了一个使用C#编写的多窗口程序,用于进行大地主题计算,包括正算和反算两个窗口。程序中考虑了不同的椭球体参数,如长半轴、短半轴、偏心率等,并采用高斯平均方法进行迭代解算,以确定经纬度坐标。用户可以选择不同的椭球体模型并输入相应的坐标值进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c#高斯平均引数大地主题解算

c#多窗口程序

源项目地址:yitian00/勒让德大地主题解算 (gitee.com)

gitee git clone:

git clone https://gitee.com/yitian00/legendre-earth-theme-solution.git

擅长或喜欢c++语言Qt编程的可以前往c++版本

大地主题计算_进击中的小龙的博客-CSDN博客

主窗口设计

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace homework
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 F2 = new Form2();
            F2.Show();
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form3 F3 = new Form3();
            F3.Show();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

(在右键单击项目名称--添加--Windows窗体--Windows窗体--添加)可设置多窗体

正算窗口设计

算法:

 

 

 

 

 

 代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace homework
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            double  a = 0, b = 0, e_2 = 0, e_dot_2 = 0,B2,L2,A21,rou=206264.806247096355;
            int pp = 0;
            if (radioButton1.Checked)
            {
                a = 6378245;//椭圆长半轴
                b = 6356863.0187730473;//椭圆短半轴
                e_2 = 0.006693421622966;//椭圆第一偏心率e^2
                e_dot_2 = 0.006738525414683;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton2.Checked)//
            {
                a = 6378140;//椭圆长半轴
                b = 6356755.2881575287;//椭圆短半轴
                e_2 = 0.006694384999588;//椭圆第一偏心率e^2
                e_dot_2 = 0.006739501819473;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton3.Checked)//
            {
                a = 6378137;//椭圆长半轴
                b = 6356752.3142;//椭圆短半轴
                e_2 = 0.00669437999013;//椭圆第一偏心率e^2
                e_dot_2 = 0.00673949674227;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton4.Checked)//
            {
                a = 6378137;//椭圆长半轴
                b = 6356752.3141;//椭圆短半轴
                e_2 = 0.00669438002290;//椭圆第一偏心率e^2
                e_dot_2 = 0.00673949677548;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (pp == 0)
            {
                MessageBox.Show("请选择椭球体", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            double c = a * a / b;
            //转化为弧度制
            double B1 = (Convert.ToDouble(textBox1.Text)+ Convert.ToDouble(textBox2.Text) /60+ Convert.ToDouble(textBox3.Text) /3600)/180*Math.PI;
            double L1= (Convert.ToDouble(textBox4.Text) + Convert.ToDouble(textBox5.Text) / 60 + Convert.ToDouble(textBox6.Text) / 3600) / 180 * Math.PI;
            double A1= (Convert.ToDouble(textBox16.Text) + Convert.ToDouble(textBox17.Text) / 60 + Convert.ToDouble(textBox18.Text) / 3600) / 180 * Math.PI;
            double S = Convert.ToDouble(textBox19.Text);

            double W = Math.Sqrt(1 - e_2 * Math.Sin(B1 ) * Math.Sin(B1));
            double V = Math.Sqrt(1 + e_dot_2 * Math.Cos(B1 ) * Math.Cos(B1 ));
            double M1 = a * (1 - e_2) / (W * W * W);
            double N1 = a / W;

            double t1 = Math.Tan(B1);
            //单位秒,循环迭代初始值
            double delta_B = V * V / N1 * rou * S * Math.Cos(A1), delta_L = rou / N1 * S / Math.Cos(B1) * Math.Sin(A1), delta_A = rou / N1 * S * Math.Sin(A1) * t1;
            double chB, chL, chA;
            double Bm = B1 + delta_B / rou / 2, Am = A1 + delta_A / rou / 2;//单位为弧度制
            double tm = Math.Tan(Bm), nm = e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm);
            double Wm = Math.Sqrt(1 - e_2 * Math.Sin(Bm) * Math.Sin(Bm));
            double Vm = Math.Sqrt(1 + e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm));
            double Mm = a * (1 - e_2) / (Wm * Wm * Wm);
            double Nm = a / Wm;
            do//循环
            {
                chB = delta_B;
                chL = delta_L;
                chA = delta_A;
                delta_B = Vm * Vm/ Nm * rou * S * Math.Cos(Am) * (1 + S * S / 24 / Nm / Nm * (Math.Pow(Math.Sin(2 + 3 * tm * tm + 3 * Math.Pow(nm * tm, 2)), 2)) + 3 *
                    nm * nm * Math.Cos(Am) * (tm * tm - 1 - nm * nm - 4 * tm * tm * nm * nm));
                delta_L = rou / Nm * S / Math.Cos(Bm) * Math.Sin(Am) * (1 + S * S / 24 / Nm / Nm * (Math.Sin(Am) * Math.Sin(Am) * tm * tm - Math.Cos(Am) * Math.Cos(Am) *
                    (1 + nm * nm - 9 * tm * tm * nm * nm + Math.Pow(nm, 4))));
                delta_A = rou / Nm * S * Math.Sin(Am) * tm * (1 + S * S / 24 / Nm / Nm * (Math.Cos(Am) * Math.Cos(Am) * (2 + 7 * nm * nm + 9 * tm * tm * nm * nm + 5 * Math.Pow(nm, 4))
                    + Math.Sin(Am) * Math.Sin(Am) * (2 + tm * tm + 2 * nm * nm)));
                Bm = B1 + delta_B / rou / 2;
                Am = A1 + delta_A / rou / 2;
                Wm = Math.Sqrt(1 - e_2 * Math.Sin(Bm) * Math.Sin(Bm));
                Vm = Math.Sqrt(1 + e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm));
                Mm = a * (1 - e_2) / (Wm * Wm * Wm);
                Nm = a / Wm;
                tm = Math.Tan(Bm);
                nm = e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm);
            } while (Math.Abs(chB-delta_B)>1e-4|| Math.Abs(chA - delta_A) > 1e-4|| Math.Abs(chL - delta_L) > 1e-4);

            B2 = (B1 + delta_B / rou) * 180 / Math.PI;
            L2= (L1 + delta_L/ rou) * 180 / Math.PI;
            A21 = (A1 + delta_A / rou) * 180 / Math.PI;
            if (A1 > 180) A21 = A21 + 180;
            else  A21 = A21 - 180;
            if (A21 < 0) A21 += 360;
            //打印纬度
            textBox7.Text = Convert.ToString(Math.Floor(B2));
            textBox8.Text = Convert.ToString(Math.Floor((B2 - Math.Floor(B2)) * 60));
            textBox9.Text = Convert.ToString(((B2 - Math.Floor(B2)) * 60 - Math.Floor((B2 - Math.Floor(B2)) * 60)) * 60);
            //打印经度
            textBox10.Text = Convert.ToString(Math.Floor(L2));
            textBox11.Text = Convert.ToString(Math.Floor((L2 - Math.Floor(L2)) * 60));
            textBox12.Text = Convert.ToString(((L2 - Math.Floor(L2)) * 60 - Math.Floor((L2 - Math.Floor(L2)) * 60)) * 60);
            //打印A21
            textBox13.Text = Convert.ToString(Math.Floor(A21));
            textBox14.Text = Convert.ToString(Math.Floor((A21 - Math.Floor(A21)) * 60));
            textBox15.Text = Convert.ToString(((A21 - Math.Floor(A21)) * 60 - Math.Floor((A21 - Math.Floor(A21)) * 60)) * 60);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = string.Empty;
            textBox2.Text = string.Empty;
            textBox3.Text = string.Empty;
            textBox4.Text = string.Empty;
            textBox5.Text = string.Empty;
            textBox6.Text = string.Empty;
            textBox7.Text = string.Empty;
            textBox8.Text = string.Empty;
            textBox9.Text = string.Empty;
            textBox10.Text = string.Empty;
            textBox11.Text = string.Empty;
            textBox12.Text = string.Empty;
            textBox13.Text = string.Empty;
            textBox14.Text = string.Empty;
            textBox15.Text = string.Empty;
            textBox16.Text = string.Empty;
            textBox17.Text = string.Empty;
            textBox18.Text = string.Empty;
            textBox19.Text = string.Empty;
        }
    }
}

反算窗口设计

算法 

 

 

 

 

代码 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace homework
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double a = 0, b = 0, e_2 = 0, e_dot_2 = 0,A1,S, A21, rou = 206264.806247096355;
            int pp = 0;
            if (radioButton1.Checked)
            {
                a = 6378245;//椭圆长半轴
                b = 6356863.0187730473;//椭圆短半轴
                e_2 = 0.006693421622966;//椭圆第一偏心率e^2
                e_dot_2 = 0.006738525414683;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton2.Checked)//
            {
                a = 6378140;//椭圆长半轴
                b = 6356755.2881575287;//椭圆短半轴
                e_2 = 0.006694384999588;//椭圆第一偏心率e^2
                e_dot_2 = 0.006739501819473;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton3.Checked)//
            {
                a = 6378137;//椭圆长半轴
                b = 6356752.3142;//椭圆短半轴
                e_2 = 0.00669437999013;//椭圆第一偏心率e^2
                e_dot_2 = 0.00673949674227;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (radioButton4.Checked)//
            {
                a = 6378137;//椭圆长半轴
                b = 6356752.3141;//椭圆短半轴
                e_2 = 0.00669438002290;//椭圆第一偏心率e^2
                e_dot_2 = 0.00673949677548;//椭圆第二偏心率e'^2 
                pp = 1;
            }
            else if (pp == 0)
            {
                MessageBox.Show("请选择椭球体", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            double c = a * a / b;
            //转化为弧度制
            double B1 = (Convert.ToDouble(textBox1.Text) + Convert.ToDouble(textBox2.Text) / 60 + Convert.ToDouble(textBox3.Text) / 3600) / 180 * Math.PI;
            double L1 = (Convert.ToDouble(textBox4.Text) + Convert.ToDouble(textBox5.Text) / 60 + Convert.ToDouble(textBox6.Text) / 3600) / 180 * Math.PI;
            double B2 = (Convert.ToDouble(textBox7.Text) + Convert.ToDouble(textBox8.Text) / 60 + Convert.ToDouble(textBox9.Text) / 3600) / 180 * Math.PI;
            double L2 = (Convert.ToDouble(textBox10.Text) + Convert.ToDouble(textBox11.Text) / 60 + Convert.ToDouble(textBox12.Text) / 3600) / 180 * Math.PI;
            

            double Bm = (B1 + B2) / 2,Lm = (L1 + L2) / 2;
            double tm = Math.Tan(Bm), nm = e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm);
            double Wm = Math.Sqrt(1 - e_2 * Math.Sin(Bm) * Math.Sin(Bm));
            double Vm = Math.Sqrt(1 + e_dot_2 * Math.Cos(Bm) * Math.Cos(Bm));
            double Mm = a * (1 - e_2) / (Wm * Wm * Wm);
            double Nm = a / Wm;
            double r01 = Nm / rou * Math.Cos(Bm);
            double r21 = Nm * Math.Cos(Bm) / 24 / Math.Pow(Vm, 4) / Math.Pow(rou, 3) * (1 + nm * nm - 9 * Math.Pow(nm * tm * nm * nm, 2));
            double r03 = -Nm / 24 / Math.Pow(rou, 3) * Math.Pow(Math.Cos(Bm), 3) * tm * tm;
            double S10 = Nm / rou / Vm / Vm;
            double S12 = Nm * Math.Cos(Bm) * Math.Cos(Bm) / 24 / Math.Pow(Vm, 2) / Math.Pow(rou, 3) * (2 + 3 * tm * tm + 2 * nm * nm);
            double S30 = Nm / 8 / Math.Pow(rou, 3) / Math.Pow(Vm, 6) * (nm * nm - tm * tm * nm * nm);
            double delta_B = (B2 - B1) * rou, delta_L = (L2 - L1) * rou;
            double SsinAm = r01 * delta_L + r21 * delta_B * delta_B * delta_L + r03 * Math.Pow(delta_L, 3);
            double ScosAm = S10 * delta_B + S12 * delta_B * delta_L * delta_L + S30 * Math.Pow(delta_B, 3);

            double t01 = tm * Math.Cos(Bm);
            double t21 = Math.Cos(Bm) * tm * (2 + 7 * nm * nm + 9 * tm * tm * nm * nm + 5 * Math.Pow(nm, 4)) / 24 / rou / rou / Math.Pow(Vm, 4);
            double t03 = Math.Pow(Math.Cos(Bm), 3) * tm * (2 + tm * tm + 2 * nm * nm) / 24 / rou / rou;
            double delta_A = t01 * delta_L + t21 * delta_B * delta_B * delta_L + t03 * Math.Pow(delta_L, 3);//单位秒
            double Am = Math.Atan(SsinAm / ScosAm);
            if (Am < 0) Am = Am + 2*Math.PI;
            
            A1 = Am - delta_A / 2 /rou;
            A21 = Am + delta_A / 2/rou ;
            if (A1 > Math.PI) A21 = A21 - Math.PI;
            if (A1 < Math.PI) A21 = A21 + Math.PI;
            S = ScosAm / Math.Cos(Am);
            textBox13.Text = Convert.ToString(S);
            //打印A12
            A1 = A1 * 180 / Math.PI;
            textBox19.Text = Convert.ToString(Math.Floor(A1));
            textBox18.Text = Convert.ToString(Math.Floor((A1 - Math.Floor(A1)) * 60));
            textBox17.Text = Convert.ToString(((A1 - Math.Floor(A1)) * 60 - Math.Floor((A1 - Math.Floor(A1)) * 60)) * 60);
            //打印A21
            A21 = A21 * 180 / Math.PI;
            textBox16.Text = Convert.ToString(Math.Floor(A21));
            textBox15.Text = Convert.ToString(Math.Floor((A21 - Math.Floor(A21)) * 60));
            textBox14.Text = Convert.ToString(((A21- Math.Floor(A21)) * 60 - Math.Floor((A21 - Math.Floor(A21)) * 60)) * 60);


        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = string.Empty;
            textBox2.Text = string.Empty;
            textBox3.Text = string.Empty;
            textBox4.Text = string.Empty;
            textBox5.Text = string.Empty;
            textBox6.Text = string.Empty;
            textBox7.Text = string.Empty;
            textBox8.Text = string.Empty;
            textBox9.Text = string.Empty;
            textBox10.Text = string.Empty;
            textBox11.Text = string.Empty;
            textBox12.Text = string.Empty;
            textBox13.Text = string.Empty;
            textBox14.Text = string.Empty;
            textBox15.Text = string.Empty;
            textBox16.Text = string.Empty;
            textBox17.Text = string.Empty;
            textBox18.Text = string.Empty;
            textBox19.Text = string.Empty;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值