测绘程序课程设计报告.docx

上传人:b****7 文档编号:25396163 上传时间:2023-06-08 格式:DOCX 页数:80 大小:300.70KB
下载 相关 举报
测绘程序课程设计报告.docx_第1页
第1页 / 共80页
测绘程序课程设计报告.docx_第2页
第2页 / 共80页
测绘程序课程设计报告.docx_第3页
第3页 / 共80页
测绘程序课程设计报告.docx_第4页
第4页 / 共80页
测绘程序课程设计报告.docx_第5页
第5页 / 共80页
点击查看更多>>
下载资源
资源描述

测绘程序课程设计报告.docx

《测绘程序课程设计报告.docx》由会员分享,可在线阅读,更多相关《测绘程序课程设计报告.docx(80页珍藏版)》请在冰豆网上搜索。

测绘程序课程设计报告.docx

测绘程序课程设计报告

测绘程序课程设计报告

一、课程设计概述:

1、课程设计目的

使学生能够在学习完VC.net程序设计基础、测量学、测量平差等课程的基础

上,进一步巩固这些知识,并培养学生的综合应用能力。

2、课程设计时间

7月18日~7月31日,共两周时间。

3、课程设计内容

设计一个边角网平差的程序。

二、系统设计:

1、需求分析

控制网平差程序对野外控制网观测数据进行平差数据处理,其目的就是根据最小二乘原理,消除网中的各种几何矛盾,求出全网各待定元素,即未知点的平面坐标或三维坐标。

2、实现功能

2.1优化设计:

根据控制网的观测精度与网形,全面评定网的精度

2.2数据输入:

使用外部数据倒入,通过读取.txt格式观测文件实现数据输入

2.3概算:

主要是进行近似坐标的推算。

2.4平差计算:

对观测数据进行精密平差计算,得到平差后的点位坐标,方向观测值,边长观测值等,精度评定。

2.5成果输出:

控制网图形输出,绘制误差椭圆,以及平差结果导出到txt文件中。

3、系统总体框架

 

4、数据输入模块

4.1文件格式定义:

 

Surveyor,panlin

Recorder,panlin

Date,2011-7-19

Meteorogy,30,100,0.7

AngleAccuracy,2

DistanceAccuracy,2,2

StationCount,5

StationName,1,2,3,4,5

ENDHeader

Givendata

Coor,2

1,31250.25,11500.41

2,33256.57,10900.84

ENDGivendata

Obsdata

Angle,18

1,2,0

1,3,57.203210

1,4,113.140635

2,5,0

2,3,32.122292

2,4,57.501530

2,1,98.261273

3,1,0

3,2,56.253779

3,5,172.533944

3,4,282.295383

4,1,0

4,2,26.095412

4,3,46.361798

4,5,77.594671

5,4,0

5,3,39.001779

5,2,70.195151

Dist,8

1,3,2300.060

1,4,3090.353

2,5,3643.234

2,3,2115.919

2,4,4363.611

3,5,2169.073

3,4,2620.909

观测数据结束标志

4,5,3922.860

ENDObsdata

需要注意的是,StationCount、StationName并不是指测站数和测站名,而是指控制点数和控制点名(主要是指节点网,这种情况中并不是所有的点都进行摆站了,如附合导线,有一个已知点就没有摆站观测)。

对StationName的说明:

 

4.2数据输出流图

 

 

4.3具体实施

先是定义一个类CcontrolPoint,这个类可以没有.cpp文件,只是用来定义控制点ControlPointData、方向角观测值CBearingObs、距离观测值CdistObs,以及头文件fileheader的格式,这个类编译好之后,就可以为数据输入服务了。

数据输入的具体实施是,在CcontrolnetAdjustmentDlg.h中定义以下几个公有变量:

fileheaderheader;//头文件

实现头文件输入

ControlPointData*KnownPoint;//已知点

intKnownPointCount;//已知点个数

CDistObs*KnownDist;//已知边

intKnownDistCount;//已知边个数

CBearingObs*KnownBearing;//已知方向角

intKnownBearingCount;//已知方向角个数

实现已知数据的输入

CDistObs*ObsDist;//观测边

intObsDistCount;//观测边个数

CBearingObs*ObsBearing;/观测方向角

intObsBearingCount;//观测方向角个数

实现观测数据的输入

这样在txt文件导入之后,通过MFC文件读取方法逐行读入数据,然后通过调用分割函数SplitString,通过ENDHeader、Givendata这些标志,逐行进行分割,将值赋给上述变量中,这样就把数据导入到程序中了。

 

5、近似坐标推算模块:

5.1近似坐标推算原理:

5.1.1按方向观测值计算三角网中待定点的近似坐标(前方交会)

 

(1)

 

5.1.2按边长观测值计算三边网中待定点的近似坐标(边长交会),先按公式

(2)计算三角形的内角,再用公式

(1)计算待定点的坐标

 

(2)

5.1.3按方向和边长观测值计算导线网中待定点的近似坐标

b

k

a

A

tab

t

d

 

比较上述三种方法可以发现,第一和第二种方法,在近似坐标推算时必须搜索三角形,才能计算,换句话来说就是适用于三角网,在通用性上显然不合理。

而且,本次试验采用的是边角网的观测数据,对于第一种只按角推算和第二种只按边推算,显然也是不合适的。

而第三种极坐标推算的方法,对所有网形均适用,从通用性和数据合理利用这两面考虑,所以我采用第三种极坐标推算的方法。

在具体计算中采用逐点解算法,选择已知点或已计算出坐标的点作为起算点,根据具体的图形,来逐个推算出各点的坐标。

这种方法比较容易实现,而对于整体解算的方法,对所有未知点进行整体解算,实现起来太困难。

 

5.2计算流图

 

inti=0toheader.StationCount

Header.StaionCoor中第i个坐标是否已知

在方向观测值中查找照准点为i点的测站点j中是否存在坐标已知点(j=0toObsBearingCount)

在方向观测值中查找测站点为j点的照准点k中是否存在坐标已知点(k=0toObsBearingCount)

在边长观测值中查找测站点为j照准点为i点,或者测站点为i点照准点为j的边长值

计算i点近似坐标,并且把求出的值记录到Header.StaionCoor中

所有未知点的近似坐标是否已经推算出来

近似坐标推算计算完毕

 

i=i+1

 

 

 

 

 

 

再次从i=0循环否是

5.3具体实施

在文件读入数据时,文件头中有StationName这一项,在读入控制点名后,就会动态创建类型为类ControlPointData对象的数组header.StationCoor,然后把已知点数据传入到header.StationCoor中。

header.StationCoor创建的目的就是进行存储所有的控制点坐标,方便以后的数据调用和数据更新。

经过上述中5.3的循环计算,这样所有的未知点近似坐标均已经计算出来,存入到这个数据中。

需要注意的是,在近似坐标推算中,循环计算一次之后,必须判断是否所有未知点的近似坐标已经推算出来,没有的话再进行循环计算。

(这样做主要是为了防止在节点控制网中,当未知点很多时,可能推算到一个点之后,它所连得所有控制点均为坐标未知点,这样在一次循环中就会跳过这个控制点,这个点的近似坐标就没有计算出来。

而在下一次循环中,它所连得控制点中就会有坐标已知点,这样这个点的近似坐标就计算出来了)。

 

6、平差计算模块

平差有两种方式,一种是条件平差,一种是间接平差。

条件方程式较少,占用内存小,但条件方程与网形有关,很难编制通用的程序。

间接平差一个观测值就是一个误差方程,占用内存相对较大,但易于编程解算,容易编制通用的程序。

从程序编制和程序的通用性考虑,所以选择间接平差的方法。

 

6.1平差计算原理:

6.1.1间接平差基本原理

设:

观测值为L,其权为P,相应的改正数为V,必要观测值个数为t,选定未知数X,则有误差方程

根据最小二乘原理:

求极值,

 

,得:

法方程:

法方程的解:

单位权中误差:

6.1.2间接平差流程

6.1.2.1列出误差方程及条件式

6.1.2.2定权

6.1.2.3组成法方程

6.1.2.4解算法方程,求得dX=[dx1dy1dx2dy2…]

6.1.2.5平差后的坐标值计算X=X+dX。

6.1.2.6精度评定,计算误差椭圆参数等

6.1.3误差方程的列立

以未知点坐标为平差对象,一个观测值对应一个误差方程式,误差方程式包括两类:

方向观测误差方程式和边长观测误差方程式

(1)方向观测误差方程式

一般形式:

其中:

 

一般取测站起始方向(零方向)的近似坐标方位角作为定向角近似值

 

当测站点i为已知点时:

当照准点j为已知点时:

当侧站点和照准点都为已知点时:

(2)边长观测误差方程式

 

为近似坐标计算而得,为实测边长

当测站点i为已知点时:

当照准点j为已知点时:

 

6.1.4定权

(1)方向观测值的权

在等精度方向观测的控制网中,一般把方向观测值的权定为1

(2)边长观测值的权

 

而Ms=A+B*S/1000;其中S单位为Km,这样的话Ms单位为mm

6.1.5平差后的坐标值计算

求得平差后的坐标值X=X+dX。

因为只有dx很小时误差方程式、条件方程式才是严密的,因此当dX的值较大时应把X=X_+dX作为新的近似值重复6.1.2.1~6.1.2.4步,直到dx中绝对值最大的一个小于给定的0.1mm(注意:

这里只是指坐标改正值,不包括定向改正值,所以在求dx中绝对值最大值时,应除去定向改正值,否则会无限迭代计算,因为定向改正值很大,而且迭代计算时不会进行改正)。

6.1.6精度评定

中误差计算:

,n为观测值个数,t为未知数个数

待定点点位误差:

 

误差椭圆元素计算:

长半径方位角

长半径、短半径

 

6.2平差计算流程图:

近似坐标推算

Adjust函数

平差计算,将坐标改正数加到坐标上,并判断坐标改正数是否大于0.1mm

建立矩阵类Matrix对象,进行调用

单位权中误差计算

点位中误差计算

误差椭圆参数计算

 

近似坐标

 

矩阵B、L、P

矩阵运算

 

是否

求得坐标作为近似坐标精度评定

6.3具体实现

在近似坐标推算出来之后,就可以通过adjustment函数调用这些近似坐标来计算系数阵B、常数项阵L、权阵P,这三项计算出来之后,就可以计算坐标改正数(建立Matrix的对象Dx,因为B、L、P、Dx均为Matrix对象,而类Matrix中重载了一些运算覆,可以实现矩阵转置、求逆、相乘、相减得运算,所以就可以计算出Nbb=(~B)*P*B;Nvv=(-1)*((~B)*P*L);Dx=(Nbb.Inv())*Nvv),改正数计算出来之后,将坐标改正数加到原有近似坐标上,判断如果坐标改正数的最大值(绝对值)大于0.1mm(注意是大于0.1mm才是迭代终止条件,不要写成小于0.1mm),重复上述步骤继续迭代计算,直到坐标改正数的最大值(绝对值)小于0.1mm,迭代计算终止,这时求出的坐标即为平差后坐标。

坐标改正数Dx求出来之后,就可以求得观测值改正数矩阵V,V求出来之后,就可以计算出单位权中误差m0,进而计算出点位中误差、误差椭圆参数。

7、成果输出模块

成果输出模块有两方面,一方面是平差结果的输出,另一方面是图形绘制。

对于平差结果的输出这一方面,主要是输出方向观测成果表、距离观测成果表、精度评定以及控制点成果表这四方面内容,对于这部分的输出比较容易实现,只要建立Cstring对象,调用库函数.format()来定义输出格式,来进行格式化输出,就很容易实现。

对于图形的绘制,需要链接到另一个Dialog来绘制,这涉及到一些建类、数据传输的内容,下面详细介绍这部分内容。

7.1图形绘制流程图:

建立绘图的Dialog

添加类DrawGraph

类ControlnetAdjustmentDlg

建立DrawGraph对象draw

函数OnPaint()

函数StepLength

函数ControlNet

函数ErrorEllipseDraw

 

draw.DoModal()

数据传输调用OnPaint()

绘图

 

添加消息函数调用主绘图函数

 

调用返回画图

步长step

 

调用绘制误差椭圆函数

 

7.2具体实施

由于绘图在另一个Dialog中进行,所以必须在CcontrolnetAdjustmentDlg中能够调用绘图的Dialog。

主要是在建立Dialog之后,给这个Dialog添加一个类DrawGraph,这样就可以在CcontrolnetAdjustmentDlg中通过建立DrawGraph的对象draw,通过调用库函数draw.DoModal()来打开Dialog了。

不过在这之前要进行数据传输,主要是在CcontrolnetAdjustmentDlg中通过调用

Draw的成员变量,将值传输到类DrawGraph中。

之后在类DrawGraph中添加消息函数OnPaint(),这样在在CcontrolnetAdjustmentDlg中调用库函数draw.DoModal()之后,就会跳到类DrawGraph中的消息函数OnPaint()进行绘图。

在函数OnPaint()中会调用函数StepLength,通过比较实际坐标的最大值、最小值,以及窗口大小来确定绘图的步长。

之后调用函数ControlNet来进行主要的绘图工作,主要是坐标轴、控制网网形、误差椭圆、以及绘图比例尺的绘制,其中误差椭圆的绘制时调用函数ErrorEllipseDraw来绘制。

 

三、程序设计计划与进度表:

编号:

完成内容:

日期:

1

系统的总体设计、编制作业进度表

7月18日~7月19日

2

数据输入

7月20日

3

近似坐标的推算

7月20日

4

平差计算

7月21日~7月22日

5

控制网网形、误差椭圆的绘制

7月23日

6

代码修改、程序整改、修饰工作

7月24日~7月25日

7

实验报告的编写

7月26日~7月28日

 

四、程序代码:

1.ControlPoint.h

#pragmaonce

#include"Angle.h"

classControlPointData

{

public:

doubleX,Y;//坐标值

CStringstrName;//控制点名

doubledE,dF;//误差椭圆的长半轴和短半轴

CAngledAlfa;//误差椭圆长半轴的方位角

doubledMx,dMy,dM;//点位误差

doubleQxx,Qyy,Qxy;//协因数

};

 

//距离观测值类

classCDistObs

{

public:

CDistObs(void)

{

dDist=0;

};

~CDistObs(void){};

public:

ControlPointDatacpStart,cpEnd;//起点和终点

doubledDist;//距离观测值

};

 

//方向观测值类

classCBearingObs

{

public:

CBearingObs(void){};

~CBearingObs(void){};

public:

ControlPointDatacpStation;//测站点

ControlPointDatacpObject;//照准点

CAngleangleObsValue;//方向观测值

};

 

classMeteo//气象参数

{

public:

doubletemperature;//温度

doublepressure;//气压

doublehumidity;//相对湿度

};

 

classDistanceAccu//仪器距离观测精度信息

{

public:

doublea;

doubleb;

};

 

classfileheader

{

public:

CStringSurveyor;//观测值

CStringRecorder;//记录者

CStringDate;//观测日期

MeteoMeteorogy;//气象参数

doubleAngleAccuracy;//仪器方向观测精度信息

DistanceAccuDistanceAccuracy;//仪器距离观测精度信息

intStationCount;//控制点个数

intOriAngleCount;//测站个数

ControlPointData*StationCoor;//控制点坐标信息

};

 

2.ControlnetAdjustmentDlg.h

#pragmaonce

#include"ControlPoint.h"

#include"Matrix.h"

//CControlnetAdjustmentDlg对话框

classCControlnetAdjustmentDlg:

publicCDialog

{

//构造

public:

CControlnetAdjustmentDlg(CWnd*pParent=NULL);//标准构造函数

~CControlnetAdjustmentDlg();//析构函数

//对话框数据

enum{IDD=IDD_CONTROLNETADJUSTMENT_DIALOG};

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持

 

//实现

protected:

HICONm_hIcon;

//生成的消息映射函数

virtualBOOLOnInitDialog();

afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);

afx_msgvoidOnPaint();

afx_msgHCURSOROnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

doubleAzimuth(doubleX1,doubleY1,doubleX2,doubleY2);//求方位角,返回弧度

intsgn(doubleX);//符号函数

doubleOutX(CStringstrName);//导出X

doubleOutY(CStringstrName);//导出Y

intKnoworUnKnow(CStringstrName);//判断一个控制点是否已知,已知返回,未知返回-1

doubleMax(CMatrixB,intm,intn);//求矩阵中最大值

doubleXKnoworUnKnow();//求控制点坐标中是否还存在未知点,存在返回,不存在返回-1

CStringObsdata;//显示观测数据

afx_msgvoidOnBnClickedRadio1();//数据读入

CString*SplitString(CStringstr,charsplit,int&iSubStrs);//分割函数

voidadjustment(CMatrix&B,CMatrix&L,CMatrix&P);//平差函数

fileheaderheader;//头文件

ControlPointData*KnownPoint;//已知点

intKnownPointCount;//已知点个数

CDistObs*KnownDist;//已知边

intKnownDistCount;//已知边个数

CBearingObs*KnownBearing;//已知方向角

intKnownBearingCount;//已知方向角个数

CDistObs*ObsDist;//观测边

intObsDistCount;//观测边个数

CBearingObs*ObsBearing;//观测方向角

intObsBearingCount;//观测方向角个数

CStringOutData;//用来输出计算信息(概算、平差等)

afx_msgvoidOnBnClickedRadio2();//坐标推算

afx_msgvoidOnBnClickedRadio3();//平差计算

afx_msgvoidOnBnClickedRadio4();//文件保存

afx_msgvoidOnBnClickedRadio5();//网图显示

afx_msgvoidOnBnClickedOk();//清屏

};

 

3.ControlnetAdjustmentDlg.cpp

#include"stdafx.h"

#include"ControlnetAdjustment.h"

#include"ControlnetAdjustmentDlg.h"

#include"ControlPoint.h"

#include

#include"math.h"

#include"Matrix.h"

#include"DrawGraph.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#endif

CControlnetAdjustmentDlg:

:

CControlnetAdjustmentDlg(CWnd*pParent/*=NULL*/)//标准构造函数

:

CDialog(CControlnetAdjustmentDlg:

:

IDD,pParent)

Obsdata(_T(""))

OutData(_T(""))

{

m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

KnownDist=NULL;//初始化

KnownPoint=NULL;

KnownBearing=NULL;

ObsDist=NULL;

ObsBearing=NULL;

header.StationCoor=NULL;

}

CControlnetAdjustmentDlg:

:

~CControlnetAdjustmentDlg()//析构函数

{

//释放空间

if(KnownPoint!

=NULL)

{

delete[]KnownPoint;

KnownPoint=NULL;

}

if(KnownDist!

=NULL)

{

delete[]KnownDist;

KnownDist=NULL;

}

if(Kno

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1