⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 GPS系统接收数据坐标转换 GPS接收的数据往往是三维坐标
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//------------------------------说明--------------------------------//

/*                     GPS系统接收数据坐标转换
GPS接收的数据往往是三维坐标,而在科学研究中我们通常用二维坐标。因此必须
进行坐标转换,下面我们介绍一种坐标转换,即把WGS84坐标转换为高斯—克吕
格坐标系。数字地图投影的方法很多,而我国采用了高斯—克吕格投影,它是一
种横轴椭园柱面等角投影,用一个椭球柱面与地球椭球在某一子午圈L0上相切,
这条子午线通常称做投影轴子午线。也就是高斯-克吕格投影直角坐标系的x 轴,
地球的赤道与椭圆柱面相交, 成一直线,这条直线与轴子午线正交,就是平面直角坐
标系的y轴,把椭球柱面展开,就得到以(x,y)为坐标的平面直角坐标系。为减少
投影变形,按经度把椭球分为许多带,各带分别投影,经常采用的是3度和6度带。
为使y值不为负值,通常在y轴上加上500km。
已知WGS84坐标(B,L),B为GPS定位输出成果的纬度,L为GPS定位输出成果的经度。
由WGS84到高斯-克吕格坐标(x,y)的转换成高斯投影正算,其计算方法如下:
*/

//------------------------------------------------------------------//


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

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Trim() != "" && textBox2.Text.Trim() != "")
            {
                try
                {
                    //-------------------输入要转换的(度.分)---------------------//
                    //经度(度.分)
                    double L = double.Parse(textBox1.Text.Trim());
                    //纬度(度.分)
                    double B = double.Parse(textBox2.Text.Trim());
                    //-----------------------------------------------------------//

                    //椭球参数
                    double a = 6378245.0;
                    double f = 1 / 298.3;

                    //第一偏心率
                    double ee = Math.Sqrt(0.00669342162297);
                    double E0 = 0.00673852541468;
                    double P0 = 0.017453292519943;

                    //中央子午线
                    double L0 = 117.07;

                    //转换为度
                    //L: ddd.ddddd
                    L = L / 100;
                    //B: dd.ddddd
                    B = B / 100;

                    //转换为弧度
                    double b = B * P0;
                    double l = (L - 117.07) * P0;

                    double A = 1 + 3 * (Math.Pow(ee, 2)) / 4 + 45 * (Math.Pow(ee, 4)) / 64 + 175 * (Math.Pow(ee, 6)) / 256 + 11025 * (Math.Pow(ee, 8)) / 16384 + 43659 * (Math.Pow(ee, 10)) / 65536;
                    double BB = 3 * (Math.Pow(ee, 2)) / 4 + 15 * (Math.Pow(ee, 4)) / 16 + 525 * (Math.Pow(ee, 6)) / 512 + 2206 * (Math.Pow(ee, 8)) / 2048 + 72765 * (Math.Pow(ee, 10)) / 65536;
                    double C = 15 * (Math.Pow(ee, 4)) / 64 + 105 * (Math.Pow(ee, 6)) / 256 + 2205 * (Math.Pow(ee, 8)) / 4096 + 10395 * (Math.Pow(ee, 10)) / 16384;
                    double D = 35 * (Math.Pow(ee, 6)) / 512 + 315 * (Math.Pow(ee, 8)) / 2048 + 31185 * (Math.Pow(ee, 10)) / 131072;
                    double E = 315 * (Math.Pow(ee, 8)) / 16384 + 3465 * (Math.Pow(ee, 10)) / 65536;
                    double F = 693 * (Math.Pow(ee, 10)) / 131072;

                    //大地坐标为(B,L)的点到赤道的子午线弧长
                    double X0 = a * (1 - (Math.Pow(ee, 2))) * (A * b - BB * (Math.Sin(4 * b)) / 4 - D * (Math.Sin(6 * b)) / 6 + E * (Math.Sin(8 * b)) / 8 - F * (Math.Sin(10 * b)) / 10);

                    //高斯投影正算参数
                    double g = (Math.Sqrt(E0)) * Math.Cos(b);
                    double t = Math.Tan(b);
                    double m0 = l * Math.Cos(b);
                    double N = a / (Math.Sqrt(1 - (Math.Pow(ee, 2)) * (Math.Pow((Math.Sin(b)), 2))));

                    double X = X0 + N * t * m0 / 2 + N * t * (5 - (Math.Pow(t, 2)) + 9 * (Math.Pow(g, 2)) + 4 * (Math.Pow(g, 4))) * (Math.Pow(m0, 4)) / 24 + N * t * (61 - 58 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 270 * (Math.Pow(g, 2)) - 330 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 6)) / 720;
                    double Y = 500000 + N * m0 + N * (1 - (Math.Pow(t, 2)) + (Math.Pow(g, 2))) * (Math.Pow(m0, 3)) / 6 + N * (5 - 18 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 14 * (Math.Pow(g, 2)) - 58 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 5)) / 120;
                    textBox3.Text = X.ToString();
                    textBox4.Text = Y.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("请输入正确的数值!");
                }
            }
            else
            {
                MessageBox.Show("请输入数值");
            }
        }

        private void textBox1_MouseUp(object sender, MouseEventArgs e)
        {
            textBox1.SelectAll();
        }

        private void textBox2_MouseUp(object sender, MouseEventArgs e)
        {
            textBox2.SelectAll();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -