测绘程序设计技术基础
测绘工程专业
目 录
第一章 绪 论...........……………………………………………………………………………………………………………………2
第一节 本课程的相关内容……………………………………………………………….………………………………………2
第二节 结构化程序设计………………………………………………………………….………………………………………3
第三节 控制网的数据结构………………………………………………………………………………………………………4
第四节 C++特征与 Visual C++6.0 开发环境……………………………………………………………………………………7
第二章 通用函数模块编写……………………………………………………………………………………………………………15
第一节 矩阵相关函数……………………………………………………………………………………………………………15
附录:相关函数源代码……………………………………………………………………………………………………………17
第二节 角度制与弧度制的相互转化……………………………………………………………………………………………21
第三节 测量正反算函数…………………………………………………………………………………………………………22
第四节 标准正态分布分位数函数………………………………………………………………………………………………24
第三章 通用平差程序………………………………………………………………………………………………...……………….26
第一节 间接平差………………………………………………………………………………………………...……………….26
附录:相关函数………………………………………………………………………………………………...……….………….27
第二节 抗差估计………………………………………………………………………………………………...……………….30
第四章 高程网平差程序…………………………………………………………………………………………………...………….33
第一节 概述………………………………………………………………………………………………...…………………….33
附 录:极大权法平差函数………………………………………………………………………………………………...……….35
第二节 高程网的输入数据……………………………………………………………………………………...……………….35
第三节 高程网的结构与函数………………………………………………………………………………………………...….36
第四节 高程网间接平差……………………………………………………………………….…………..…………………….37
附 录:高程网平差相关函数……………………………………………………………………………………………….…….38
第五节 高程网秩亏平差…………………………………………………………………………………….…...………………43
第六节 水准网闭合差统计……………………………………………………………………………………...……………….45
第七节 高程网优化设计……………………………………………………………………….…………….………….……….46
第五章 平面网平差…………………………………………………………………………….…………….…….………………….48
第一节 概述…………………………………………………………………………………….…………...……………..….….48
第二节 边角网最小二乘平差…………………………………………………………………………………...……………….48
第三节 平面网数据输入格式…………………………………………………………………………………...……………….50
第四节 近似坐标计算…………………………………………………………………………………...……………………….51
第五节 结构与函数设计………………………………………………………………………………………...……………….53
附 录: 平面网平差相关函数…………………………………………………………………………………...……………….55
第六节 三角网方向观测精度估算……………………………………………………………………………...……………….80
附 录: 方向观测精度估算函数…………………………………………………………………………………...…………….81
第七节 平面控制网优化设计…………………………………………………………………………………...……………….82
第六章 GPS 向量网平差…………………………………………………………………………………….…….………….……….84
第一节 概述…………………………………………………………………………………...………………………………….84
第二节 GPS 向量网平差………………………………………………………………………………………...……………….86
第三节 结构与函数设计………………………………………………………………………………………...……………….87
附 录: GPS 平差相关函数…………………………………………………………………………………...………………….88
第七章 测量坐标系转化…………………………………………………………………………………….…….………….……….96
第一节 空间直角坐标与大地坐标系的转化……………………………………………………………...…………………….96
第二节 高斯投影坐标变换……………………………………………………………………………………...……………….97
第三节 任意坐标系的转换………………………………………………………………………………………...…………….98
第一章 绪
论
第一节 本课程的相关内容
1. 本课程主要内容
测绘程序设计是大题目,在测绘工作与科学研究中,很多情况下都可以使用计算机。测绘工程所涉及
的数据计算、绘图、数据库管理、数据分析等,都可以使用计算机来完成。从一般含义上说,测绘工作包
含计算和绘图两个方面的内容。关于计算机绘图有相关课程讲述,所以,这门课程的主要内容集中在测绘
工程的相关计算上面,而其中,主要讲述关于平差计算的程序设计问题。
本课程主要讲述以下内容:
(1) 数据结构 在控制网数据处理中,数据组织是非常重要的内容,在这里我们主要讲述图的概念,
以及使用图表示控制网的数据。
(2) 常用工具函数编写 这里主要讲数据处理中经常需要用到的一些工具函数,如角度-弧度互化的
函数,测量正反算函数,矩阵计算函数等。
(3) 基本平差程序 使用计算机的方法处理间接平差的结构与过程。
(4) 高程网平差 将高程网平差表示为基本平差结构,使用基本平差程序处理水准网、三角高程网
平差的相关问题。
(5) 边角网平差 处理边角网平差的过程与问题。
(6) GPS 向量网平差 处理观测值为 GPS 基线向量的三维坐标平差问题。
(7) 测量坐标系转化
2. 平差程序计算特点
相对于手工计算,平差程序计算的主要特点是计算速度快、精度高、数据处理自动化,从而把人从繁
重的计算工作中解放出来。
从程序设计的角度看,程序设计与平差计算相对独立。在平差手工计算时,我们总是面对需要计算的
具体问题,所以其数据是特定的,计算过程由人实时控制;在计算机程序计算中,在程序设计时数据是抽
象的,必须考虑到实际计算中问题的多样性,以及数据计算过程的自动化,所以在程序设计时必须考虑需
要处理的所有问题的普遍性和规律性。
另外,相对于手工计算,在程序计算时,选择平差方法的依据不同。在手工计算时,我们通常希望尽
量降低计算工作量。当必要观测数 t>多余观测数 r 时,我们可以选择条件平差;当必要观测数 t<多余观测
数 r 时,我们可以选择间接平差,这样,可以降低平差计算量。然而,在计算机程序计算时,由于计算机计
算的快速高效性,我们不是很关心计算量的问题,而把主要精力集中于方法实现的现实性方面,也就是要
求该方法具有较强的规律性,便于程序设计的技术实现。
在平差程序设计中,使用间接平差,对于一般控制网,误差方程形式统一、规律性强、便于程序设计;
而使用条件平差,误差方程形式多样,规律性差,不利于程序设计。所以,在本课程中,我们主要使用间
1
接平差方法进行程序设计。
总之,我们在选择数学模型的时候,一定要考虑算法同计算机程序设计的特点相统一。
3. 平差程序的基本要求
平差程序设计与其它程序设计相同,应当满足一定的要求。
(1)程序逻辑结构简单,清晰易读,符合结构化程序设计要求,便于扩展;
(2)运算速度快,占用内存小,内外存之间的交换不宜过于频繁;
(3)数学模型及计算方法正确、先进,计算结果精度高;
(4)适应性强,便于移植,充分考虑各种可能形式,尽量满足不同要求与需要;
(5)方便用户,操作简便。数据输入与用户作业方式与习惯相统一,输出明了、齐全;尽量减少手工
处理工作量,操作简便;人机交互性要强。
上述要求,既体现在平差程序的总体设计中,也贯穿于平差程序设计的各个环节中。
4. 平差程序的设计步骤
(1) 结构总体设计
(2) 数据结构设计
(3) 确定软件各组成部分的算法及数据组织
(4) 选定某种表达式来描述各种算法
(5) 程序编写
(6) 程序调试
(7) 编写用户使用说明
5. 学习本课程的基本要求
(1) 掌握 C 语言基本技术,并应用于测绘程序的编写中;
(2) 熟悉《测量平差基础》、《控制网平差基础》等理论知识;
(3) 基本掌握结构化程序设计方法;
(4) 勤思考,勤动手,多练、多问,阅读、编写相关功能程序。
第二节 结构化程序设计
结构化程序设计是计算机软件技术高度发展的产物,是大规模、工业化软件开发的基础。C 语言是结构
化程序设计思想成熟与完善的标志,至今,仍然是计算机软件开发的主要语言之一。模块的概念是软件工
程的基本概念之一。
1. 模块化程序设计相关概念
模块——执行某一特定任务的数据结构和程序代码。
模块的性质
内部特征
外部特征
模块的局部数据
实现模块功能的程序代
模块接口(输入、输出
模块的功能
码
,引用的全局变量,调
用的其他模块)
在 C 语言中,每个模块与一个函数(function)相对应。
模块化——将待开发的软件分解成若干个小的模块,以使每个模块可以独立地开发、测试,最后组
装成完整的软件。软件模块化的目的在于使软件的结构清晰,降低软件开发难度、容易阅读理解、测试
和修改。
划分模块的原则:
2
(1) 按功能划分模块,要求每个模块包含单一、具体的功能
(2) 使每个模块独立性好,这就要求一个模块具有较强的内聚性和较弱的耦合性。方便于模块的
独立开发、调试,同时,使模块具有很好的移植性。
划分模块时,应当尽量减小模块间的耦合性,例如尽可能地使用局部变量就可以减小模块之间的耦合
性。划分模块时,采用层次结构进行分析:
(1) 最上层模块是对系统整体功能的抽象;
(2) 下层模块是对上层模块的逐步细化描述;
(3) 重复(2),得出便于实现的独立性好的模块,直到下层模块不可再分为止。在最下层,对“怎
么做”作出精确的描述。
2. 平差程序模块化
图 1.1 平差程序模块化
第三节 控制网的数据结构
1. 基本概念
测量平差程序处理的对象是程序所适应的各种测量控制网问题。因此,这类程序总是同一定的网形相
联系的。一个具体的控制网通常是以图形方式直接绘出的,为了用计算机进行控制网的平差计算,就需要
将具体的网形转化为一系列的数据,然后才能输入计算机进行处理。这种将网形转化为一系列数据的工作
和过程称为“网形数字化”。网形数字化所得到的一组数据就是控制网的数据结构。
数据结构所涉及的范围是广泛的。在每个具体问题中,数据元素及其关系是确定的,而且都有其特定
的含义。对测量平差而言,其数据结构就是表达一个控制网的全部数据的集合,包括已知数据、观测数据、
网形数据(网图数据)及其关系。
为了使用数学方法表示控制网的结构,需要用到图论的相关概念。图论是研究事物之间关系的一种数
学方法,下面对之一概念作简单的介绍。
2. 图及其数字化
2.1 图的定义
图论是研究事物之间关系的一种数学方法,在图论中,用点表示事物,用线段表示事物之间的联系,
3
这些点称为图的顶点,线段称为图的边。对于控制网,其中元素及其关系可以使用图论的方法进行研究。
图是由点和边构成的,可以定义为定点集 V 与边集 E 的和,记为
G=(V,E)
例如对于图 1.2 所示问题,可以得出如下图论分析结果
G
V
E
4321
,,,
3124433221
,,,,,,,,,
上述边集中元素(1,2),(2,3)等称为点偶。若点偶中顶点的顺序可以任意,称这种图为无向图,反之,
称为有向图。
对于有向图采用符号 G=表示。其中点偶也采用尖括弧表示,尖括弧中顶点的顺序是固定的。对
图 1.2 具有四个点的无向图
于图 1.3,可以表示如下:
G
V
E
4321
,,,
2,4,4,3,2,3,3,2,1,2,3,1,2,1
图 1.3 具有四个点的有向图
对于有 n 个顶点的无向图,边的最大数目为:
2
Cn
(
nn
2/)1
对于有 n 个顶点的有向图,边的最大数目为:
2
Pn
(
nn
)1
2.2 图的数学表示方法
对图的数学表示方法有以下三种:相关矩阵,邻接表和边目录。
1)相关矩阵:如果 i,j 两点有边相连,则矩阵第 i 行、第 j 列元素为 1,反之为 0;对角线上元素永远
为零。
对于如图 1.2 所示的无向图,用相关矩阵表示如下:
4
0110
1101
1011
0110
无向图特点:关于主对角线对称,通常只需写出一半即可。
对于如图 1.3 所示的有向图,用相关矩阵表示如下:
0110
0101
1010
0010
有向图特点:通常不是对称矩阵,需要写出矩阵全部元素。
2)邻接表:按照图中的顶点顺序,将与该点边相连的所有点(可达顶点)排成一行,所有这些行所构
成的表叫邻接表。
对于如图 1.3 所示的有向图,用邻接表表示如下(表 1.1):
该表可由对应的相关矩阵产生。为节省内存,通常将邻接表排成一行。为识别可达顶点所属的行号,需要
给出表 1.1 中每行含有的可达顶点数,从而构成可达顶点数表和可达顶点表。如表 1.2 所示:
3
3
4
2
1
2
2
表 1.1 邻接表
2
2
2
1
2
3
表 1.2 邻接表
1
3
2
4
2
在表 1.2 中,第一行为可达顶点数表;第二行为可达顶点表。
与有向图类似,无向图的邻接表也可以由相应相关矩阵产生。
3)边目录:按照图的定义,图由顶点集 V 和边集 E 组成。然而,边集实际上包含了所有点集的信息(除
非图中包含孤立的点,这种情况在控制网中是不会出现的),所以可以只用边集 E 来表示图。这种用两
端点号表示图中边所构成的表成为边目录。下面对于有向图的例子做简单的说明。
对于如图 1.3 所示的有向图,用边目录表示如下(表 1.3):
3
2
1
2
表 1.3 有向图的边目录
2
3
1
2
1
3
3
4
4
2
在表 1.3 中,每一列表示一条边,第一行中的点为起点号,第二行中的点为终点号。
对于无向图,表示方法与有向图类似。需要注意的是,为了使每条边只表示一次,采用最小点号原则。
也就是起点号由小到大排列,边不重复表示。
以上三种方法,在数学上是统一的。也就是说,只要知道一种表示,其它两种就可以相应生成。
3 各种方法的比较
相关矩阵、邻接表和边目录都能表示出图的全部点和边。其中,相关矩阵方法冗余度最大,对角线上
元素全为零,其余位置上也存在大量的数据冗余。另外,相关矩阵不能反映出各边的邻接关系,这对于控
制网平差计算极为不利。
对于有向图,邻接表要比边目录节省许多内存空间。因为这两种方法第二行元素完全相同,但在第一
5
行,邻接表只需列出可达顶点数,所以比边目录占用存储空间少。对于无向图,邻接表和边目录体积相当,
两种方法均可以采用。
在控制网平差中,使用邻接表占用内存小,使用边目录更加直观。所以这两种方法均可以采用,更重
要的原因在于这两种方法可以根据需要调整边的邻接关系。
2.4 有序邻接表和边目录
为了反映图中同一顶点上各边的邻接关系,无论是邻接表还是边目录都应该按照顶点序号和每顶点上
各边的相邻次序按一定的顺序排列(顺时针方向),如此形成的邻接表和边目录称为有序邻接表和有序边目
录。控制网平差需要用到有序邻接表和有序边目录,不加说明,我们仍称为邻接表和边目录。
3. 控制网的数据结构
3.1 图与控制网的映射
图的元素与测量控制网元素之间存在如下所示的对应关系:
图的顶点对应于测量控制点;
有向图的边对应于控制网的有向边(方向观测值、高差线路、基线坐标分量等);
无向图的边对应于控制网的无向边(单向测距边)。
另外,图也可以用于研究控制网的其它关系,例如,图的顶点用来表示三角形,图的边则表示三角形
的邻接关系等。
3.2 控制网数据结构的组成
控制网的数据包括已知数据、观测数据、网形数据三个部分。其中,前两个部分是我们所熟悉的,网
形数据是需要我们用图论方法表示的信息。根据上面的讨论,我们可以使用有向图或者无向图的方法表示
控制网中数据之间存在的各种关系。
3.3 控制网数据结构应满足的条件
1)充分性条件:数据结构中应当包含足够多的数据,以保证能构成所需的控制网。也就是要充分表示
网点及其关系。例如,对于边长交会的情况,按照数学理论方面的要求,在有两个已知点的情况下,似
乎测量两条边就足够了,实际上,我们知道,这时候可以计算出两个点的坐标。也就是说解不唯一,或
者说不满足充分性要求,这时必须增加约束条件数据,从而得到唯一的计算结果。
2)必要性条件:数据结构中只包含构网必须的数据,无冗余数据。程序设计不大可能忽视充分性条件,
因为充分性条件不满足,很容易发现。对于必要性条件,则很可能由于算法实现的难度而转嫁于用户头
上,要求用户输入一些属于冗余信息的数据,从而加重用户的工作量。我们应当重视必要性条件,这也
是软件是否完善与成熟的主要标志之一。
第四节 C++特征与 Visual C++6.0 开发环境
在这门课中,我们需要应用 C++程序设计中的一些特征,在课间实习与集中实习中,需要使用 Visual
C++6.0 开发相关程序(dos 版 C++程序),在此对相关内容作简要的介绍。.CPP
1.C++特征
1.1 重载
重载是 C++在 C 的基础上对函数功能的扩展。利用重载机制,可以对具有相似功能的函数在定义时使
用相同的函数名,从而方便用户的使用。
例如:在 C 语言中,为定义不同类型数据相加的操作,必须使用不同的函数名来定义一组函数。
Iplus() 整数相加;
Dplus() 实数相加;
Fplus() 浮点数相加;
Cplus() 字符串相加。
6
对于不同类型的数据计算必须由用户调用不同的函数,这无疑增加了用户使用程序的负担。在 C++语
言中,可以使用更简洁的方法处理这种问题。对以上四种计算可以只使用一个函数名 plus 定义相关的不同
函数。计算机函数编译的区别标志在于函数的参数不同。也就是说,计算机根据同名函数参数不同来区别
相关函数。在应用时,就可以以一个相同的函数名调用一族函数。这就是 C++语言函数重载的概念。
很明显,函数重载的应用,方便了程序的编写与用户的使用。使用相同名字定义的一族函数叫重载函
数。使用一个已经存在的函数名定义一个新函数叫对原有函数的重载。
定义重载函数的关键在于相关函数应当具有不同的参数。参数不同体现在两个方面:函数参数的类型
不同或函数参数的个数不同。
对于上例问题,可以定义一组重载函数(函数定义略):
int plus(int a, int b);
double plus(double a, double b);
float plus(float a, float b);
char* plus(char * a, char* b);
在应用时,系统根据调用函数参数的不同直接调用相关函数,如:
int d=plus(2,14);
cout<
int Plus(int & x, int & y)
{
x++;
y++;
return x+y;
}
定义 main()函数
void mian()
{
Int a(5),b(10),c;
c=plus(a,b);
cout<