Skip to content

2024年测绘程序设计比赛准备的资料,包括通知文件、赛题说明、日程安排、参考资料、参考例程、测试数据、我写的练习程序、写程序步骤总结、C#-WinForm语法、常见问题

Notifications You must be signed in to change notification settings

casterbn/Geomatics-Program

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

2024测绘程序设计比赛资料

Static Badge Static Badge Static Badge 访问量统计

2024赛前日程安排(点击展开)

赛前日程安排

2024年测绘程序设计比赛选题及说明(点击展开)

2024年程序设计比赛选题及说明

---

相关资料


国赛六个题

  1. 空间数据探索性分析:计算标准误差椭圆、空间权重矩阵、常用空间自相关指数。

    参考例程:暂无

  2. 遥感图像空间前方交会计算:计算立体像对的投影系数、像空间辅助坐标系坐标及地面摄影测量坐标系坐标。

    参考例程:书上的例程有错,可以参考矿大罗宏昆的 C# 程序

  3. GNSS空间大气改正计算:常用电离层改正模型、对流层改正模型计算。

    参考例程:书上给的例程。

  4. 纵横断面计算:道路纵断面、横断面的相关点位计算,以及断面面积计算。

    参考例程:22年国赛题,书上例程是 VB 的而且读文件的时候有 BUG(有个换行符写错了),可以参考矿大罗宏昆的 C# 程序我的22年国赛程序

  5. 大地线长度计算:根据地球椭球参数和椭球面上的大地经纬度坐标,计算两点之间的大地线长度。

    参考例程:书上给的例程,也可以参考大地主题正反算例程,因为大地线长度计算是大地主题反算的一部分。

  6. 曲线拟合:利用五点光滑法进行曲线拟合。

    参考例程:书上给的例程。


如何准备测绘程序设计比赛

  1. 学C#基础语法

    • 如果有编程基础,就无需系统的学 C# 语法,看看C#语言介绍,直接看代码,也可以看看我总结的常用 C#&WinForm 语法;
    • 没有语法基础,找一套视频教程学,跟着敲代码,学点基础,建议找 20 小时以内的教程;
    • 不懂的语法,查微软 MSDN 官方文档,不要看 CSDN 之类的论坛上乱七八糟的文章。
  2. 学WinForm

  3. 先把一套题学懂

    • 看懂题目和数据文件

    • 运行例程,导入数据,计算,记住程序操作逻辑,确认程序能正确运行;

    • 看懂例程:①先看例程的界面设计,用到了哪些控件;②类型定义;③程序初始化,也就是主窗体的构造函数;④文件读取,理清数据文件中的数据与变量的对应关系;⑤对着公式看数据处理的代码,看看与公式符不符合;⑥看结果展示、输出计算报告的代码。

    • 模仿例程写一遍:①自己新建一个项目,②设计界面,③定义用到的类型,④写数据读取代码,⑤写代码展示读取到的数据,⑥照着题目公式敲数据处理代码,⑦写代码展示计算结果,⑧写代码输出计算报告TXT文件。

    • 脱离例程写一遍:按自己的理解来写,写的时候可以看题目,不要看例程,写完之后再跟例程的结果做对照。

  4. 总结一套编程模板,比赛的时候按套路来写程序

    • 设计思想:花尽量少的时间,尽可能的让程序更有条理、更模块化、更易扩展。

    • 界面设计:保证在五分钟之内能实现;能在属性栏进行的控件配置就在属性栏做,不要写代码。

      6bed8c898685fb89513327654ea263b3
    • 命名风格:字段和变量小写字母开头,类、函数大写字母开头。

    • 类型定义:主要就写三个类,创建对应的三个文件,所有字段和方法都写成 Public:

      • DataCenter:一个数据存储类存所有数据,包括,
      • Calculate
      • FileHelperReadFile() 函数实现读取文件、SaveFile() 函数实现导出计算报告。
    • 全局变量:写在 public partial class Form1 : Form 下面,也就是用 Form1 的字段来实现类似于全局变量的效果。

      • DataCenter dataCente = new DataCenter();:存所有数据;
      • :存生成的计算报告字段;
      • :标识系统执行状态。
    • 面向过程:一万行以上的程序才值得好好的进行面向对象设计;程序在三个地方执行:

      • 主窗体构造函数:点开程序的时候就会执行,可以放一些初始化的代码,。
      • 读取文件按钮的点击事件:创建 FileHelper 类对象,调用其 ReadFile() 函数导入数据到 dataCenter,显示读到的数据到的数据到窗体控件上。
      • 数据处理按钮的点击事件
  5. 有闲工夫可以按自己整理的编程模板套路把几个题都练一遍

  6. 装一个离线版MSDN,除了这个比赛我从来不用C#,语法不一定记得住,比赛时候忘了可以查一下。

  7. 配置VS2017快捷键


常用 C#&WinForm 语法

我是学导航的,主要写 C++,C#除了这个比赛就没用到过,

  • C# 语法比 C++ 简单,C++ 比 C# 灵活、性能高;
  • C# 的 List 对应 C++ 的 Vector;
  • C# 的 WinForm 界面设计方式和 C++ Qt 框架类似;
  • 基本数据类型:int、double(小数都用double不用float);
  • 运算符:和其它编程语言一样:算术运算符比较运算符布尔逻辑运算符位运算符和移位运算符相等运算符
  • 语句结构:循环语句(for、while、do-while)、条件语句(if-else、switch-case)
  • 数组
  • List 泛型集合:(我们写程序不在乎性能,所以能用 List 就别用其它数据结构)
  • 类和对象
  • 异常捕获:try-catch,提高程序的鲁棒性,,在导入数据的代码都写在 try 里,
  • MessageBox.Show("Test"):弹出一个对话框,显示你设置字符串,类似于命令行程序中的 Console.WriteLine()、C 语言中的 Printf、C++ 中的 std::cout。
  • 格式化输出
  • 字符串操作
  • StreamReader
  • StreamWriter
  • 主窗体 Form 操作
  • 控件常用属性:Text(控制显示内容)、Name(在代码中的对象名)、Dock(定义控件绑定到边缘)、BlackColor(背景颜色)、BackgroundImage(背景图片)、BackgroundImageLayout(背景图片布局)、Visible(控件是否可见)、Enable(控件是否可用)、FlatStyle(设置外观)、Font(字体)、
  • SaveFileDialog:保存文件对话框,
  • OpenFileDialog:打开文件对话框,
  • DataGridView
  • RichTextBox
  • TabControl
  • MenuStrip:菜单栏,
  • ToolStrip:工具条,
  • StatusStrip:状态栏,一般放在界面最下面,显示程序的执行状态。
  • Button:按钮,上面可以显示文字、图片,双击编写它的点击事件函数。
  • Label:标签,主要作用就是在窗体上显示文字。
  • 单选框RadioButton、复选框**CheckBox:checked 属性指示控件是否除以选中状态,常用GroupBox**给控件分组,可以显示一个组名。

常用代码段

1、坐标点类型定义

  • 点名、B、L、H

  • 点名、X、Y、Z

  • 点名、X、Y

  • 点的集合


2、从数据文件中循环导入坐标点数据

  • 导入数据的代码都写在 try 中,如果出现啥问题,比如格式出错、选错文件,程序不会因为异常而退出。
  • 先创建打开文件对话框 OpenFileDialog 对象,
try
{
	OpenFileDialog opf = new OpenFileDialog();  // 创建打开文件对话框对象 opf
	opf.Filter = "文本文件|*.txt";				 // 文件类型过滤,只显示 .txt 文件
	opf.Title = "请选择要导入的文件";			  // 显示在打开文件对话框开头的提示词
	if (opf.ShowDialog() == DialogResult.OK)    // 弹出打开文件对话框
	{
		StreamReader sr = new StreamReader(opf.FileName);   // 创建 StreamReader 对象
		data.Points = new List<Point>();
		Point point ;
		string line = sr.ReadLine();
        string[] lines;
        data.PointCount = int.Parse(line);
        
        for (int i = 0; i < data.PointCount; i++)
        {
			lines = sr.ReadLine().Trim().Split(',');
			point = new Point(lines[0], double.Parse(lines[1]), double.Parse(lines[2]),double.Parse(lines[3]));
			data.Points.Add(point);
		}
			MessageBox.Show("导入数据文件成功!");
		}
	else
	{
		MessageBox.Show("文件打开失败!");
	}
}
catch (Exception)
{
	MessageBox.Show("文件导入失败,请重新导入!");
    throw;
}

3、循环显示坐标点数据到 DataGridView

  • 在 DataGridView 控件的属性栏先
dataGridView1.RowCount = data.PointCount;
for (int i = 0; i < data.PointCount; i++)
	{
		dataGridView1.Rows[i].Cells[0].Value = data.Points[i].Name;
		dataGridView1.Rows[i].Cells[1].Value = data.Points[i].X;
		dataGridView1.Rows[i].Cells[2].Value = data.Points[i].Y;
		dataGridView1.Rows[i].Cells[3].Value = data.Points[i].Z;
}

4、导出计算报告

5、程序执行状态枚举

  • 程序执行状态枚举定义

  • 导入数据的时候重置程序执行状态枚举

  • 进行某一步计算的时候判断程序执行状态枚举

6、度分秒DMS、弧度RAD、角度DEG之间的转换

编程进行三角函数计算的时候一般用弧度(例如:0.5π),生活中常使用角度(例如:60°),经纬度坐标常表示成度分秒(例如 30.3241),所以需要进行转换。

  • 弧度转角度

  • 角度转弧度


7、椭球类

大地测量相关的计算很多都基于旋转椭球,

长半球和扁率


常见问题(欢迎提Issue补充)

  • 下载例程了之后,如何在VS2017中打开?

    • 确保 VS 中安装了 C# 语言和 .NET 环境;

    • 双击 .sln 是打开解决方案,双击 .csproj 是打开项目,一个解决方案可以包含多个项目;

    • 如果双击没反应,尝试去设置打开方式,选择 VS 打开。

  • 打开解决方案或项目报错:未能成功构建其中一个或多个项目。

    • 可能是程序文件夹没解压,Win11 中压缩文件夹可以直接在资源管理器中点开,看着和普通文件很像,很容易就忘了解压;
    • .sln 打开程序失败,可以试试直接点 .csproj 打开项目。
  • 更改到目标框架

    • 安照提示点确认,

About

2024年测绘程序设计比赛准备的资料,包括通知文件、赛题说明、日程安排、参考资料、参考例程、测试数据、我写的练习程序、写程序步骤总结、C#-WinForm语法、常见问题

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published