一、代码界面展示


整个界面控件为tabControl,groupBox,label,textbox,comboBox,button,richTextBook。

二、代码运算结果展示

  1. 数据结果采用国家统一坐标(横坐标上加上500000m,在坐标前面冠以带号)。
  2. 内置了4种椭球参数(CGCS200,WGS84,西安80,克拉索夫斯基椭球体)。
  3. 可以计算三度带和六度带。
  4. 计算曲率半径功能是我用来做大地测量学作业用的,顺便写在这里的。

2.1 数据相互转换验证

相互转换的结果肯定是一样的(我自己测试了10几次不同的数据,是没有问题的)。

2.2 数据结果正确性验证

2.2.1 高斯正算

数据结果的正确性需要使用其他的软件进行验证。
这里我选取的是https://blog.csdn.net/starmings/article/details/123034189计算的数据进行验证。

软件结果如下:
采用西安80椭球参数,高斯正算的结果与软件的结果是一致的。

2.2.2 高斯反算

软件结果如下:

采用西安80椭球参数,高斯反算的结果与软件的结果是一致的。(我只保留了0.01,已经可以了。)

三、源代码

3.1 变量设置

        //大地经度 度分秒public double L;public double Ld;public double Lf;public double Lm;//大地纬度 度分秒public double B;public double Bd;public double Bf;public double Bm;double L0;//中央子午线度数double N1;//带号double a;//长半轴double b;//短半轴double e1;//第一偏心率平方double e2; //第二偏心率平方double m0,m2,m4,m6,m8;double a0, a2, a4, a6, a8;int i ;

3.2 高斯正算

             //m0-m8的值m0 = a * (1 - e1);m2 = 1.5 * m0 * e1;m4 = 1.25 * m2 * e1;m6 = (7.0 / 6) * m4 * e1;m8 = (9.0 / 8) * m6 * e1;//a0-a8的值a0 = m0 + m2 / 2.0 + (3.0 / 8) * m4 + (5.0 / 16) * m6 + (35.0 / 128) * m8;a2 = (1.0 / 2) * (m2 + m4) + (15.0 / 32) * m6 + (7.0 / 16) * m8;a4 = (1.0 / 8) * m4 + (3.0 / 16) * m6 + (7.0 / 32) * m8;a6 = (1.0 / 32) * m6 + (1.0 / 16) * m8;a8 = (1.0 / 128) * m8;//将大地经度转化为度数Ld = double.Parse(textBox1.Text);Lf = double.Parse(textBox2.Text);Lm = double.Parse(textBox3.Text);L = Ld + Lf / 60 + Lm / 3600;//将大地纬度转化为度数Bd = double.Parse(textBox4.Text);Bf = double.Parse(textBox5.Text);Bm = double.Parse(textBox6.Text);B = Bd + Bf / 60 + Bm / 3600;if (comboBox2.Text == "三度带"){N1 = Math.Truncate((L + 1.5) / 3);//带号L0 = 3 * N1;}if (comboBox2.Text == "六度带"){N1 = Math.Truncate(L / 6) + 1;L0 = 6 * N1 - 3;}//求椭球面上某点到赤道的子午线弧长,精度至0.001mdouble radB = (Math.PI / 180) * B; //将纬度转换为弧度double Δ1, Δ2, Δ3, Δ4, Δ5;Δ1 = a0 * radB;Δ2 = (a2 / 2) * Math.Sin(2 * radB);Δ3 = (a4 / 4) * Math.Sin(4 * radB);Δ4 = (a6 / 6) * Math.Sin(6 * radB);Δ5 = (a8 / 8) * Math.Sin(8 * radB);double X =Math.Round(Δ1 - Δ2 + Δ3 - Δ4 + Δ5, 8);//卯酉圈曲率半径Ndouble N = a / Math.Sqrt(1 - e1 * Math.Sin(radB) * Math.Sin(radB));// tan(B)的值double t = Math.Tan(radB);// η的值double η =Math.Sqrt(e2) * Math.Cos(radB) ;//l的值double ρm = 180 * 60 * 60 / Math.PI;double l = ((L - L0) * 3600) / ρm;//高斯坐标中的x值和y值double x = Math.Round( X + (N / 2) * t * Math.Cos(radB) * Math.Cos(radB) * l * l + (N / 24) * t * (5 - t * t + 9 * η* η + 4 * Math.Pow(η,4)) * Math.Pow(Math.Cos(radB), 4) * Math.Pow(l, 4) + (N / 720) * t * (61 - 58 * t * t + Math.Pow(t, 4)) * Math.Pow(l, 6) * (Math.Pow(Math.Cos(radB), 6)),4);double y = Math.Round( N * Math.Cos(radB) * l + (N / 6.0) * (1 - t * t + η* η) * Math.Pow(Math.Cos(radB), 3) * Math.Pow(l, 3) + (N / 120.0) * (5 - 18 * t * t + Math.Pow(t, 4) + 14 * η * η - 58 * η * η * t * t) * Math.Pow(Math.Cos(radB), 5) * Math.Pow(l, 5),4);richTextBox1.AppendText(Environment.NewLine);richTextBox1.Text = "大地经度为L:" + Ld + "°" + Lf + "′" + Lm + "″" + "        " + "大地经度为B:" + Bd + "°" + Bf + "′" + Bm+"″" + "\r\n";richTextBox1.Text += "大地坐标转高斯平面坐标后:" + "\r\n";richTextBox1.Text += "高斯X坐标:" + x + "米" + "        " + "高斯Y坐标:" + +N1 + "" + (y+500000)+  "米" + "\r\n";

3.3 高斯反算

 //输入坐标x,ydouble x = double.Parse(textBox7.Text);double y1 = double.Parse(textBox8.Text);double y = y1-Math.Truncate(y1 / Math.Pow(10, 6)) * Math.Pow(10, 6)-500000;double[] Bf1 = new double[20];double[] F = new double[20];Bf1[0] = x / a0;//底点纬度F[0] = (-a2 / 2.0) * Math.Sin(2 * Bf1[0]) + a4 / 4.0 * Math.Sin(4 * Bf1[0]) - a6 / 6.0 * Math.Sin(6 * Bf1[0]);Bf1[1] = (x - F[0]) / a0;double Δd =Bf1[1] - Bf1[0];for ( i = 0;i<10 ; i++){F[i] = (-a2 / 2.0) * Math.Sin(2 * Bf1[i]) + a4 / 4.0 * Math.Sin(4 * Bf1[i]) - a6 / 6.0 * Math.Sin(6 * Bf1[i]);Bf1[i + 1] = (x - F[i]) / a0;Δd = Bf1[i + 1] - Bf1[i];if (Δd < Math.Pow(10, -10)){i = i + 1;break;}}// tan(Bf)的值double tf = Math.Tan(Bf1[i]);// ηf的值double ηf = e2 * Math.Cos(Bf1[i]) * Math.Cos(Bf1[i]);//计算Mf的值double Mf = a * (1 - e1) / Math.Pow(1 - e1 * Math.Sin(Bf1[i]) * Math.Sin(Bf1[i]), 1.5);//计算Nf的值double Nf = a / Math.Sqrt(1 - e1 * Math.Sin(Bf1[i]) * Math.Sin(Bf1[i]));//计算y坐标的前2位int aa = Convert.ToInt32(Math.Truncate(y1 / Math.Pow(10, 6)));if (comboBox2.Text == "三度带"){L0 = 3 * aa;}if (comboBox2.Text == "六度带"){L0 = 6 * aa - 3;}//求大地经度LL = (Math.PI / 180) * L0 + y / (Nf * Math.Cos(Bf1[i])) - (1 + 2 * tf * tf + ηf ) * Math.Pow(y, 3) / (6 * Math.Pow(Nf, 3) * Math.Cos(Bf1[i])) + (5 + 28 * tf * tf + 24 * Math.Pow(tf, 4) + 6 * ηf + 8 * ηf  * Math.Pow(tf,4)) * Math.Pow(y, 5) / (120 * Math.Pow(Nf, 5) * Math.Cos(Bf1[i]));//转换经度double degrees = (180 / Math.PI) * L;//将弧度转化为度int d1 = Convert.ToInt32(Math.Truncate(degrees));//度int f1 = Convert.ToInt32(Math.Truncate((degrees - d1) * 60));//分double m1 = Math.Round(((degrees - d1) * 60 - f1) * 60,2);//秒if (m1 == 60){m1 = 0;f1 += 1;}//求大地纬度BB = Bf1[i] - (tf * y * y) / (2 * Mf * Nf)+ tf * (5 + 3 * tf * tf + ηf  - 9 * ηf  * tf * tf) * Math.Pow(y, 4) / (24 * Mf * Math.Pow(Nf, 3)) + tf * (61 + 90 * tf * tf + 45 * Math.Pow(tf, 4)) * Math.Pow(y, 6) / (720 * Mf * Math.Pow(Nf, 5));double degrees1 = (180 / Math.PI) * B;//将弧度转化为度int d = Convert.ToInt32(Math.Truncate(degrees1));//度int f = Convert.ToInt32(Math.Truncate((degrees1 - d) * 60));//分double m = Math.Round(((degrees1 - d) * 60 - f) * 60,2);//秒if (m == 60){m = 0;f += 1;}richTextBox1.AppendText(Environment.NewLine);richTextBox1.Text += "高斯平面坐标转大地坐标后:" + "\r\n";richTextBox1.Text +=  "大地坐标L:" + d1+"°   "+f1+"′  "+m1+"″   "+ "大地坐标B:" + d + "°   " + f + "′  " + m + "″   "+"\r\n";

四、结语

最开始写这个高斯正反算程序的时候,公式完全按照大地测量学实习指导书上的进行编写,写完过后进行数据验证,发现相互转换就不能实现,位就出现了偏差,说明正算公式或者反算公式出现了问题,经过检查,正算公式修改成了与https://blog.csdn.net/du12300/article/details/109307386所展示的公式。反算公式是对的,主要底点纬度的精度,我没在CSDN上找到相关的高斯反算文章,需要你自己发力了。
这个程序没有很困难的地方,就是公式的编写,可能就是需要注意double的精度丢失对数据结果带来的影响。
如果你需要批量处理,其实也简单,把我那个水准或者导线的程序里面的批量导入部分copy过来,设置几个变量,再写几个for语句就完事。
我的其他文章:

  1. 利用Python编写一个高斯正反算程序:https://blog.csdn.net/Zj1638/article/details/125740379
  2. 利用C#编写一个附和闭合导线简易平差程序:https://blog.csdn.net/Zj1638/article/details/125639541
  3. 利用C#编写一个水准测量近似平差程序:https://blog.csdn.net/Zj1638/article/details/119303957
  4. 利用C#编写一个GPS高程拟合(二次曲面拟合模型)程序:https://blog.csdn.net/Zj1638/article/details/125752243

相关下载链接:

  1. 利用C#编写一个水准测量近似平差程序下载链接:https://download.csdn.net/download/Zj1638/16732130
  2. 利用C#编写一个附和闭合导线简易平差程序下载链接:https://download.csdn.net/download/Zj1638/85928040
  3. 利用C#编写一个高斯正反算程序下载链接:https://download.csdn.net/download/Zj1638/85711234
  4. 利用Python编写一个高斯正反算程序下载链接:https://download.csdn.net/download/Zj1638/86059069
  5. 利用C#编写一个GPS高程拟合(二次曲面拟合模型)程序下载链接:https://download.csdn.net/download/Zj1638/85916113

需要的可以支持一下。如果有什么不懂的,可以私信,我看到了会回答的。

利用C#编写一个高斯正反算程序相关推荐

  1. 利用Python编写一个高斯正反算程序

    一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...

  2. matlab高斯正反算程序6,基于matlab的高斯投影正反算与相邻带坐标换算程序设计...

    第 卷 第 期 在 月 中 国 水 运 基于 的高斯投影正反算与相邻带坐标换 算程 序设计 徐 翰 ,周 强 波 (核 工 业 二 三 研 究所 ,湖 南 长 沙 ) 摘 要 :地 图投影方法众多 , ...

  3. 利用C#编写一个水准测量近似平差程序

    一.代码界面展示 整个界面主要就是就整个界面而言,其实主要使用到的控件就是Menu,tabControl,dataGridView,richtextbox. 二.代码运算结果展示 1.导入数据 这里就 ...

  4. 立交匝道中边桩坐标放样正反算程序RAMP

    立交匝道中边桩坐标放样正反算程序RAMP(0911改进版) . 正在上传-重新上传取消 正在上传-重新上传取消 . 2.子程序1:RAMP-ZBJS 功能:使用Gauss-Legendre积分公式(四 ...

  5. 高斯正反算—投影坐标转大地坐标、大地坐标转投影坐标(附有完整代码及测试结果)

            本文意在介绍高斯正反算的基本原理和代码实现!针对高斯正反算网上给出的方法很多,但是我试了之后发现多少都有些问题:或公式原理问题.或精度问题!         通过查找资料对其进行了总结 ...

  6. 请用python3编写一个计算器的控制台程序_二、软件工程慕课第一章作业题——编写一个计算器...

    一.题目描述 请用Python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...

  7. python数据预测_利用Python编写一个数据预测工具

    利用Python编写一个数据预测工具 发布时间:2020-11-07 17:12:20 来源:亿速云 阅读:96 这篇文章运用简单易懂的例子给大家介绍利用Python编写一个数据预测工具,内容非常详细 ...

  8. 编写一个简单的考试程序,在控制台完成出题、答题的交互。试题(Question)分为单选(SingleChoice)和多选( MultiChoice)两种。

    编写一个简单的考试程序,在控制台完成出题.答题的交互.试题(Question)分为单选(SingleChoice)和多选( MultiChoice)两种.其中,单选题和多选题继承试题类,如下图所示. ...

  9. 编写一个基本的Android程序

    程序员有个惯例,在任何一个新平台上学习一门新语言的时候,首先做的第一件事情就是编写一个Hello,World程序,在Android上也不例外,<Hello,World>的第一个程序也是He ...

最新文章

  1. 在Win2003服务器系统中添加Web虚拟主机(图)
  2. portal开发下拉框“日期框”查询要怎么配置
  3. Summer Training day4上帝与集合的正确用法 欧拉函数+降幂公式
  4. 比较二进制_浮点数比较的精度问题
  5. 一步步编写操作系统 76 用汇编语言编写字符打印函数
  6. 【JS 逆向百例】PEDATA 加密资讯以及 zlib.gunzipSync() 的应用
  7. 企业应该如何选型ERP?
  8. spd不能修改服务器内存条的原因,修改内存SPD 解决蓝屏问题
  9. python基础入门(9)之字典
  10. 【Andorid学习】declare-styleable:自定义控件的属性
  11. 十步让你成为一名优秀的 Web 开发人员
  12. txt乱码怎么恢复正常_键盘乱码怎么恢复
  13. 浅谈Mysql 表设计规范(转)
  14. 韩顺平 Java集合 自学笔记(Java30天基础)
  15. grpc-go源码剖析二十之grpc客户端帧接收器是如何处理不同的帧的?
  16. 网络远程教育实施方案交流之(三)——服务器架构及视频存储方案
  17. 微信小程序之网易云音乐小案例
  18. 火车头采集细节(一)
  19. 返利网PHP面试_【返利网PHP面试】面试不算难 但是公司的办事奇怪-看准网
  20. FutureTask源码解析二

热门文章

  1. android 监听图库变化,Android ContentObserver 监听图库变化
  2. pytorch 网络可视化(五):netron
  3. 微信小程序在模板语法中使用indexOf失效问题解决办法
  4. 数字图像处理——第七章(小波变换和多分辨率处理)
  5. 使用js调用设备摄像头并实现拍照
  6. java swing实现图文混排_跟我学Java Swing之游戏设计(4)
  7. FusionCharts参数中文说明
  8. ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
  9. Delphi控件-复合控件
  10. 圆圈中最后剩下的数字 ----《剑指offer》面试题45