1、测绘程序设计技术基础测绘工程专业目 录第一章 绪 论.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第四节
2、高程网间接平差.37附 录:高程网平差相关函数.38第五节 高程网秩亏平差.43第六节 水准网闭合差统计.45第七节 高程网优化设计.46第五章 平面网平差.48第一节 概述.48第二节 边角网最小二乘平差.48第三节 平面网数据输入格式.50第四节 近似坐标计算.51第五节 结构与函数设计.53附 录: 平面网平差相关函数.551第六节 三角网方向观测精度估算.80附 录: 方向观测精度估算函数.81第七节 平面控制网优化设计.82第六章 GPS 向量网平差 .84第一节 概述.84第二节 GPS 向量网平差 .86第三节 结构与函数设计.87附 录: GPS 平差相关函数 .88第七章 测
3、量坐标系转化.96第一节 空间直角坐标与大地坐标系的转化.96第二节 高斯投影坐标变换.97第三节 任意坐标系的转换.98第一章 绪 论第一节 本课程的相关内容1 本课程主要内容测绘程序设计是大题目,在测绘工作与科学研究中,很多情况下都可以使用计算机。测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都可以使用计算机来完成。从一般含义上说,测绘工作包含计算和绘图两个方面的内容。关于计算机绘图有相关课程讲述,所以,这门课程的主要内容集中在测绘工程的相关计算上面,而其中,主要讲述关于平差计算的程序设计问题。本课程主要讲述以下内容:(1) 数据结构 在控制网数据处理中,数据组织是非常重要的内容
4、,在这里我们主要讲述图的概念,以及使用图表示控制网的数据。(2) 常用工具函数编写 这里主要讲数据处理中经常需要用到的一些工具函数,如角度-弧度互化的函数,测量正反算函数,矩阵计算函数等。(3) 基本平差程序 使用计算机的方法处理间接平差的结构与过程。(4) 高程网平差 将高程网平差表示为基本平差结构,使用基本平差程序处理水准网、三角高程网平差的相关问题。(5) 边角网平差 处理边角网平差的过程与问题。(6) GPS 向量网平差 处理观测值为 GPS 基线向量的三维坐标平差问题。(7) 测量坐标系转化 2 平差程序计算特点相对于手工计算,平差程序计算的主要特点是计算速度快、精度高、数据处理自动
5、化,从而把人从繁重的计算工作中解放出来。从程序设计的角度看,程序设计与平差计算相对独立。在平差手工计算时,我们总是面对需要计算的具体问题,所以其数据是特定的,计算过程由人实时控制;在计算机程序计算中,在程序设计时数据是抽象的,必须考虑到实际计算中问题的多样性,以及数据计算过程的自动化,所以在程序设计时必须考虑需要处理的所有问题的普遍性和规律性。另外,相对于手工计算,在程序计算时,选择平差方法的依据不同。在手工计算时,我们通常希望尽量降低计算工作量。当必要观测数 t多余观测数 r 时,我们可以选择条件平差;当必要观测数 t 表示。其中点偶也采用尖括弧表示,尖括弧中顶点的顺序是固定的。对于图 1.
6、3,可以表示如下: 2,4,32,3,1,23,2,14EVG,图 1.3 具有四个点的有向图对于有 n 个顶点的无向图,边的最大数目为: 2/)1(2nC对于有 n 个顶点的有向图,边的最大数目为: P2.2 图的数学表示方法对图的数学表示方法有以下三种:相关矩阵,邻接表和边目录。1)相关矩阵:如果 i,j 两点有边相连,则矩阵第 i 行、第 j 列元素为 1,反之为 0;对角线上元素永远为零。对于如图 1.2 所示的无向图,用相关矩阵表示如下:501无向图特点:关于主对角线对称,通常只需写出一半即可。对于如图 1.3 所示的有向图,用相关矩阵表示如下: 01有向图特点:通常不是对称矩阵,需
7、要写出矩阵全部元素。2)邻接表:按照图中的顶点顺序,将与该点边相连的所有点(可达顶点)排成一行,所有这些行所构成的表叫邻接表。对于如图 1.3 所示的有向图,用邻接表表示如下(表 1.1):该表可由对应的相关矩阵产生。为节省内存,通常将邻接表排成一行。为识别可达顶点所属的行号,需要给出表 1.1 中每行含有的可达顶点数,从而构成可达顶点数表和可达顶点表。如表 1.2 所示:表 1.1 邻接表2 2 2 12 3 1 3 2 4 2表 1.2 邻接表 在表 1.2 中,第一行为可达顶点数表;第二行为可达顶点表。与有向图类似,无向图的邻接表也可以由相应相关矩阵产生。3)边目录:按照图的定义,图由顶
8、点集 V 和边集 E 组成。然而,边集实际上包含了所有点集的信息(除非图中包含孤立的点,这种情况在控制网中是不会出现的) ,所以可以只用边集 E 来表示图。这种用两端点号表示图中边所构成的表成为边目录。下面对于有向图的例子做简单的说明。对于如图 1.3 所示的有向图,用边目录表示如下(表 1.3):1 1 2 2 3 3 42 3 1 3 2 4 2表 1.3 有向图的边目录在表 1.3 中,每一列表示一条边,第一行中的点为起点号,第二行中的点为终点号。对于无向图,表示方法与有向图类似。需要注意的是,为了使每条边只表示一次,采用最小点号原则。也就是起点号由小到大排列,边不重复表示。以上三种方法
9、,在数学上是统一的。也就是说,只要知道一种表示,其它两种就可以相应生成。3 各种方法的比较相关矩阵、邻接表和边目录都能表示出图的全部点和边。其中,相关矩阵方法冗余度最大,对角线上元素全为零,其余位置上也存在大量的数据冗余。另外,相关矩阵不能反映出各边的邻接关系,这对于控制网平差计算极为不利。对于有向图,邻接表要比边目录节省许多内存空间。因为这两种方法第二行元素完全相同,但在第一2 31 32 426行,邻接表只需列出可达顶点数,所以比边目录占用存储空间少。对于无向图,邻接表和边目录体积相当,两种方法均可以采用。在控制网平差中,使用邻接表占用内存小,使用边目录更加直观。所以这两种方法均可以采用,
10、更重要的原因在于这两种方法可以根据需要调整边的邻接关系。2.4 有序邻接表和边目录为了反映图中同一顶点上各边的邻接关系,无论是邻接表还是边目录都应该按照顶点序号和每顶点上各边的相邻次序按一定的顺序排列(顺时针方向) ,如此形成的邻接表和边目录称为有序邻接表和有序边目录。控制网平差需要用到有序邻接表和有序边目录,不加说明,我们仍称为邻接表和边目录。3 控制网的数据结构3.1 图与控制网的映射图的元素与测量控制网元素之间存在如下所示的对应关系:图的顶点对应于测量控制点;有向图的边对应于控制网的有向边(方向观测值、高差线路、基线坐标分量等) ;无向图的边对应于控制网的无向边(单向测距边) 。另外,图
11、也可以用于研究控制网的其它关系,例如,图的顶点用来表示三角形,图的边则表示三角形的邻接关系等。3.2 控制网数据结构的组成控制网的数据包括已知数据、观测数据、网形数据三个部分。其中,前两个部分是我们所熟悉的,网形数据是需要我们用图论方法表示的信息。根据上面的讨论,我们可以使用有向图或者无向图的方法表示控制网中数据之间存在的各种关系。3.3 控制网数据结构应满足的条件1)充分性条件:数据结构中应当包含足够多的数据,以保证能构成所需的控制网。也就是要充分表示网点及其关系。例如,对于边长交会的情况,按照数学理论方面的要求,在有两个已知点的情况下,似乎测量两条边就足够了,实际上,我们知道,这时候可以计
12、算出两个点的坐标。也就是说解不唯一,或者说不满足充分性要求,这时必须增加约束条件数据,从而得到唯一的计算结果。2)必要性条件:数据结构中只包含构网必须的数据,无冗余数据。程序设计不大可能忽视充分性条件,因为充分性条件不满足,很容易发现。对于必要性条件,则很可能由于算法实现的难度而转嫁于用户头上,要求用户输入一些属于冗余信息的数据,从而加重用户的工作量。我们应当重视必要性条件,这也是软件是否完善与成熟的主要标志之一。第四节 C+特征与 Visual C+6.0 开发环境在这门课中,我们需要应用 C+程序设计中的一些特征,在课间实习与集中实习中,需要使用 Visual C+6.0 开发相关程序(d
13、os 版 C+程序) ,在此对相关内容作简要的介绍。.CPP1C+特征1.1 重载重载是 C+在 C 的基础上对函数功能的扩展。利用重载机制,可以对具有相似功能的函数在定义时使用相同的函数名,从而方便用户的使用。例如:在 C 语言中,为定义不同类型数据相加的操作,必须使用不同的函数名来定义一组函数。Iplus() 整数相加;Dplus() 实数相加;Fplus() 浮点数相加;Cplus() 字符串相加。7对于不同类型的数据计算必须由用户调用不同的函数,这无疑增加了用户使用程序的负担。在 C+语言中,可以使用更简洁的方法处理这种问题。对以上四种计算可以只使用一个函数名 plus 定义相关的不同
14、函数。计算机函数编译的区别标志在于函数的参数不同。也就是说,计算机根据同名函数参数不同来区别相关函数。在应用时,就可以以一个相同的函数名调用一族函数。这就是 C+语言函数重载的概念。很明显,函数重载的应用,方便了程序的编写与用户的使用。使用相同名字定义的一族函数叫重载函数。使用一个已经存在的函数名定义一个新函数叫对原有函数的重载。定义重载函数的关键在于相关函数应当具有不同的参数。参数不同体现在两个方面:函数参数的类型不同或函数参数的个数不同。对于上例问题,可以定义一组重载函数(函数定义略) :int plus(int a, int b);double plus(double a, double
15、 b);float plus(float a, float b);char* plus(char * a, char* b);在应用时,系统根据调用函数参数的不同直接调用相关函数,如:int d=plus(2,14);coutint Plus(int y+;return x+y;定义 main()函数void mian()Int a(5),b(10),c;c=plus(a,b);cout 函数完成数据的输入与输出,在使用中,必须判断数据类型,在应用中不够方便。C+使用面向对象的方法实现了数据的输入/ 输出,使用上更灵活、简便。C+使用输入输出流 定义数据的键盘输入与屏幕输出,并预定了两个应用对
16、象 cin 和cout,cin 用来实现数据的键盘输入;cout 用来实现数据的屏幕输出,并为这两个对象分别定义了运算符和void main() int a,b,c;double d,e,f;char name20;coutab;coutde;coutname;c=a+b;f=d+e;coutabname; 1.5.4 关闭文件文件使用结束,应当关闭相关文件in.close();具体应用参照相关文献。2Visual C+6.0 程序开发环境Visual C+是微软使用 C+语言的 Windows 程序程序开发平台,该平台支持 C+控制台程序开发(dos 以 main()函数为程序主要入口)要求。C+兼容 C,所以也可以用来设计 C 语言的结构化程序。本课程采用 Visual C+6.0 作为程序开发平台。Visual C+6.0 是 Windows 程序,以菜单定义相关操作功能,应用方便。其桌面布局(图 1):