测绘程序设计比赛小总结

0x01 说在前面

本文是用于整理个人参加 2023年全国大学生测绘学科创新创业智能大赛 测绘程序设计竞赛(国赛) 所使用的代码而写,如有错误,恳请指出。
如无特殊说明,文中所涉代码默认使用C#(.NET Framework 4.0)完成。

0x02 加载文件

2023年测绘程序设计竞赛所使用的文件均为text文件,读取相对简单。主要思路:使用OpenFileDialog->StreamReader->转换各行内容为string[]。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if(ofd.ShowDialog() == DialogResult.OK) {
string filePath = ofd.FileName;
try {
StreamReader sr = new StreamReader(filePath);
while(!sr.EndOfFile) {
string[] aaa = sr.ReadLine().Split(',');
//other reading code here
}
} catch(Exception ex) {
MessageBox.Show(ex.ToString());
}
}

为完成构建加载文件,个人使用强类型列表List<T>,如

1
2
3
4
5
6
7
8
9
10
11
12
13
class Point {
public string pointName { get; set; }
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }

public Point(string pointName, double X, double Y, double Z) {
this.pointName = pointName;
this.X = X;
this.Y = Y;
this.Z = Z;
}
}

完成后使用List<Point> points = new List<Point>();声明强类型列表, 对每一行数据进行分离,并使用points.Add(point);将对象加入列表。

0x03 空间前方交会的计算要点

空间前方交会计算可能是最简单的一个题目。对本题而言,需要构建一个包括9个基本要素、3个辅助坐标、1个投影系数的共计13项数据。

特别注意:像片主距为焦距,理论上无负值。带负值的像片主距为-f。

像空间辅助坐标矩阵的计算公式如下

u=a1x+a2y+a3fu = a1 * x + a2 * y + a3 * -f
v=b1x+b2y+b3fv = b1 * x + b2 * y + b3 * -f
w=c1x+c2y+c3fw = c1 * x + c2 * y + c3 * -f

为便于计算旋转矩阵元素, 建议提前计算好cosφ、cosκ、cosω与sinφ、sinκ、sinω。

结果输出可全部依靠TextBox控件。

0x04 伪距单点定位的计算

关于伪距单点定位,参考书中内容冗余过多,大多无需理解。

重点:

1 卫星数据及其含义:

Sat Clock: dt
Trop Delay: dtrop
CL: L矩阵中的p
P矩阵中的p使用下式计算:

sin(θ)/0.04sin(θ)/0.04

计算结果时,先使用B矩阵、P矩阵、L矩阵,得出dx,再通过dx计算σ0。

Q矩阵本质是dx计算的左半部分!

具体公式可参考书上。

关于数据输出,建议使用DataGridView,使用dataGridView.DataSource绑定List<T>

0x05 纵横断面计算

纵横断面计算的重点、难点在于高程插值的编写。

推荐构造点类时预留水平距离计算方法,最好可以暂存距离以加强代码运行效率。

为寻找插值点,可自某点起遍历其余所有点与之距离并做好标记(如强类型列表等),再对距离进行排序(对基础较弱者,推荐冒泡排序算法),找出最短的五个距离,分别找到对应点参数,再进行计算。

梯形面积公式: (上底+下底) * 高 / 2。

此处上下底为左右高程差,“高”为两点间距。

0x06 大地主题正反算

挖坑,待填