中南大学测绘程序课程设计报告含代码界面设计数据格式.docx
- 文档编号:17995079
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:68
- 大小:213.81KB
中南大学测绘程序课程设计报告含代码界面设计数据格式.docx
《中南大学测绘程序课程设计报告含代码界面设计数据格式.docx》由会员分享,可在线阅读,更多相关《中南大学测绘程序课程设计报告含代码界面设计数据格式.docx(68页珍藏版)》请在冰点文库上搜索。
中南大学测绘程序课程设计报告含代码界面设计数据格式
中南大学
测绘程序课程设计报告
姓名:
XXXXX
学号:
XXXXXX
指导老师:
XXX
专业班级:
XXXX
1系统设计
1、实现功能
1.1优化设计:
根据控制网的观测精度与网形,全面评定网的精度
1.2数据输入:
使用外部数据倒入,通过读取.txt格式观测文件实现数据输入
1.3平差计算:
对观测数据进行精密平差计算,得到平差后的点位坐标,方向
观测值,边长观测值等,精度评定,并弹出文本框输出成果。
1.4画图:
控制网图形输出,绘制误差椭圆,以及平差结果导出到txt文
件中。
2、系统总体框架
导线网平差系统
退出
数据输入
画图
平差计算
并输出成果
*:
界面设计
2.1数据输入
2.1.1文件格式:
2(已知点数据个数)
1,31250.2500,11500.4100
(已知点数据)
2,33256.5700,10900.8400
3(未知点数据个数)
3,
4,(未知点数据)
5,
8(距离观测数据个数)
1,3,2300.0600
1,4,3090.3530
2,5,3643.2340
2,3,2115.9190(距离观测数据)
2,4,4363.6110
3,5,2169.0730
3,4,2620.9090
4,5,3922.8600
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
2.1.2数据输入实现:
(1)创建角度类
#pragmaonce
//枚举数据类型,用于代表角度形式
enumAngleStyle
{
DEG,
DMS,
RAD
};
classCAngle
{
public:
CAngle(doublevalue=0,AngleStylestyle=DMS);
~CAngle(void);
private:
doubledValue;//角度值
AngleStylenCurStyle;//当前角度值类型
private:
//设置常成员函数的作用:
.类成员不会被改变
//2.可以被常类变量调用
doubleDeg(doubledDms)const;
doubleDms(doubledDeg)const;
public:
//获取指定的类型获取角度值,
//由于返回的是dValue的引用,所以该值大小可以改变,即可以进行赋值
double&operator()(AngleStylestyle);
//重载,获取指定的类型获取角度值,该值不可改变,constCAngle类型变量调用
doubleoperator()(AngleStylestyle)const;
//重载运算符+/-
friendCAngleoperator+(constCAngle&m1,constCAngle&m2);
friendCAngleoperator-(constCAngle&m1,constCAngle&m2);
};
(2)创建点类用于存取点的信息,如坐标、点号、椭圆函数
#pragmaonce
classCControlPoint//控制点
{
public:
CControlPoint();
~CControlPoint();
doubleX;
doubleY;
CStringstrPointID;//点号
intstate;
intflg;//判断测站点是否相同用
doubledE;
doubledF;
doubledQ;//椭圆函数
doubledMx;
doubledMy;
doubledMk;//矩阵计算
};
(3)创建距离类用于存取距离观测信息,如测站方向点、观测方向点、距离观测值
#pragmaonce
#include"ControlPoint.h"
#include"Angle.h"
classCDistObs//距离观测值
{
public:
CDistObs();
~CDistObs();
public:
CControlPoint*cpStart,*cpEnd;//测站与照准点
doubledDist;//距离观测值
};
(4)创建方向类用于存取方向观测信息,如测站方向点、照准方向点、方向观测值
#pragmaonce
#include"ControlPoint.h"
#include"Angle.h"
classCAngleObs//方向观测值
{
public:
CAngleObs();
~CAngleObs();
public:
CControlPoint*cpStation;//起始点
CControlPoint*cpEnd;//照准点
CAngleObsAngle;//方向观测值
};
(4)读取文件函数:
boolLoadObsData(constCString&strFileName,CString&screen);,此函数功能为通过传入的文件名strFileName进行文件读写,并将信息存到相应成员数据中。
2.2近似坐标推算
2.2.1近似坐标计算原理
按方向和边长观测值计算导线网中待定点的近似坐标
d
2.2.2具体实现
(1)
坐标概算函数:
voidCoordinateEstimates();,函数设计思路:
设计一个循环如果没有读取数据则返回。
然后通过创建一个bool类型的函数lsCoordinateEstimate来判断有没有计算过坐标的近似值,防止其陷入死循环。
然后开始用迭代:
首先判断测站点是否已知点,然后再判断测站点相同的情况下找到照准点近似坐标未算出的照准点(有方向观测值,这样才可以通过极坐标法计算出近似值),然后根据近似坐标计算原理计算方向观测j(条件循环的时候定义两个参数i,j)的观测方向近似坐标,需要注意的是,在近似坐标推算中,循环计算一次之后,必须判断是否所有未知点的近似坐标已经推算出来,没有的话再进行循环计算。
(这样做主要是为了防止在节点控制网中,当未知点很多时,可能推算到一个点之后,它所连得所有控制点均为坐标未知点,这样在一次循环中就会跳过这个控制点,这个点的近似坐标就没有计算出来。
而在下一次循环中,它所连得控制点中就会有坐标已知点,这样这个点的近似坐标就计算出来了)。
(2)计算流程图:
坐标输入系统
inti=0tom_pAngleObsCount
i=i+1
m_pAngleObs中第i个的测站点和观测方向点是否已知
否
j=j+1
是
m_pAngleObs中第j个的测站点和m_pAngleObs中第i个测站点相同,观测方向点未知
否
计算m_pAngleObs中第i个的观测方向点近似坐标
是
近似坐标推算计算完毕
所有未知点的近似坐标是否已经推算出来
再次从i=0循环否是
2.3平差计算
2.3.1平差计算原理
设:
观测值为L,其权为P,相应的改正数为V,必要观测值个数为t,选定未知数X,则有误差方程
根据最小二乘原理:
求极值,
,得:
法方程:
法方程的解:
单位权中误差:
2.3.2间接平差流程
(1)列出误差方程及条件式
(2)定权
(3)组成法方程
(4)解算法方程,求得dX=[dx1dy1dx2dy2…]
(5)平差后的坐标值计算X=X+dX。
(6)精度评定,计算误差椭圆参数等
2.3.3误差方程的列立
以未知点坐标为平差对象,一个观测值对应一个误差方程式,误差方程式包括两类:
方向观测误差方程式和边长观测误差方程式
(1)方向观测误差方程式
一般形式:
其中:
一般取测站起始方向(零方向)的近似坐标方位角作为定向角近似值
当测站点i为已知点时:
当照准点j为已知点时:
当侧站点和照准点都为已知点时:
(2)边长观测误差方程式
为近似坐标计算而得,为实测边长
当测站点i为已知点时:
当照准点j为已知点时:
2.3.4定权
(1)方向观测值的权
在等精度方向观测的控制网中,一般把方向观测值的权定为1
(2)边长观测值的权
其中Ms由对话框输入
2.3.5平差后的坐标值计算
求得平差后的坐标值X=X+dX。
因为只有dx很小时误差方程式、条件方程式才是严密的,因此当dX的值较大时应把X=X_+dX作为新的近似值重复上述步骤,直到dx中绝对值最大的一个小于给定的0.1mm(注意:
这里只是指坐标改正值,不包括定向改正值,所以在求dx中绝对值最大值时,应除去定向改正值,否则会无限迭代计算,因为定向改正值很大,而且迭代计算时不会进行改正)。
2.3.6精度评定
(1)中误差计算:
,n为观测值个数,t为未知数个数
(2)待定点点位误差:
(3)
误差椭圆元素计算:
长半径方位角
长半径、短半径
2.3.7平差计算流程图
近似坐标推算
:
近似坐标
CalculateErrorEquations函数
矩阵B、L、P
建立矩阵类Matrix对象,进行调用
平差计算,将坐标改正数加到坐标上,并判断循环是否达到要求
矩阵运算
单位权中误差计算
是否
求得坐标作为近似坐标精度评定
误差椭圆参数计算
点位中误差计算
2.3.8具体实现
(1)voidComAngleObsEff(CAngleObsAngleObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk);,此函数功能为计算出AngleObs的系数Fi、Ci、Di、Ck;
(2)voidComDistObsEff(CDistObsDistObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk);,此函数功能为计算出DistObs的系数Fi、Ci、Di、Ck;
(3)voidFormErrorEquations(CMatrix&B,CMatrix&f),此函数功能为组建法方程系数矩阵B,常数项矩阵f;voidFixedWeight(CMatrix&p),此函数功能为计算权矩阵p;
(4)voidFormErrorEquations(CMatrix&B,CMatrix&f),此函数功能为平差计算、点位精度计算.
2.成果输出
(1)平差结果的输出,主要是输出方向观测成果表、距离观测成果表、精度评定以及控制点成果表这四方面内容,对于这部分的输出比较容易实现,只要建立Cstring对象,调用库函数.format()来定义输出格式,来进行格式化输出,就很容易实现。
在对话框对应的计算按钮添加代码部分获得文件名strFileName,调用voidCalculateErrorEquations(constCString&strFileName)。
(2)图形绘制,对话框添加画图控件,在对话框对应的画图按钮添加代码获得picture控件的CDC和大小,调用控制网ControlNetAdjust中成员函数voidErrorEllipseDraw(CDC*pDC,CRect&rect)进行绘图。
2程序设计计划与进度表
编号:
完成内容:
日期:
1
进行程序设计与安排进度表
7.1——7.2
2
设定数据格式与实现读取数据功能
7.3
3
近似坐标的推算
7.4-7.5
4
平差计算并进行成果输出
7.6—7.8
5
控制网网形、误差椭圆的绘制
7.8
6
代码修改、程序整改、修饰工作、调试
7.8-7.9
7
实验报告的编写
7.10
3设计心得
3.1程序设计过程中遇到问题及解决方法
3.1.1系统的设计:
需要实现什么功能,怎么实现。
通过一步步地剖析实验指导书里面的流程图,然后列出需求分析,最后得出初步设计思路。
3.1.2数据文件的读取:
老师给的指导书里面的数据是分开的,我们要做的不仅是读数据重点是怎么读。
通过参考了第8个实验读取数据的格式,对比指导书的数据,设计出来了自己的数据格式。
3.1.3坐标概算时:
坐标概算有三种方法,根据指导书和老师的讲解,我们取用的第三种极坐标算法。
参考书里的代码。
编写后会发现书里面定义的很多变量跟自己不一致,需要更改,并且书里面概算的过程中调用的一些函数(比如方位角Azi()计算和SearchDist())需要自己编写。
需要注意的是编写的这两个函数的形参要与概算函数里面创建的参数类型要一致,这需要好好注意。
3.1.4组成法方程,计算B,F矩阵:
同样参考书里面代码,因为书里面定义前后不一样,所以不能直接搬用。
所以需要理解B矩阵是怎么构成的。
通过查看书本和指导书得出B矩阵行为观测值(方向与角度)个数,列为未知点参数(X,Y)与测站点个数构成,同样理解F矩阵。
而且,书本里面定向方位角近似的函数也要自己编写。
3.1.5组成法方程时,常数项矩阵f数值过大,分别在函数ComAngleObsEff(ClzAngleObsAngleObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk)和ComDistObsEff(ClzDistObsDistObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk)中设置断点,经手算各方向观测系数和距离观测系数后与监视值对比发现两个问题,第一个是在求解测站零方向的近似方位角时,随着测站的变化,零方向的近似方位角没有作对应变化;第二个问题是方向观测的常数Fi由于角度类对象和double转换不统一出现问题。
经过改正后通过,与手算误差符合。
3.1.6平差计算时,由于是参考第8个实验计算输出的代码,这一次输出的成果要比上一次多所以在对比和计划的时候弄了不断时间,主要是输出f的时候一定要注意单位,要回去检查f矩阵的计算和单位的换算,设置断点逐语句地查看监视结果。
3.2程序设计感想
这一次的课程设计跟以往做的八个实验都不一样,它可以说八个实验的集合并且要超过以往八个实验的总和。
一开始做的时候感觉无从下手,因为这个程序需要实现读取数据,计算,绘图,输出。
而计算里面也分为概算,组成法方程,平差。
首先是数据读取,一开始拿到课程设计指导书看到数据的时候脑子浮现的是:
这是什么?
因为指导书里面的数据是分开的,不像做好了格式很清晰明了地排列在一个文档中。
看数据的时候我需要搞懂这是什么数据,怎么测量的,然后再设计数据的排列方式再设计出如何读取数据。
在这个过程中,我更深入地掌握了读取文件的方式和方法与格式,以前一些不懂的地方也通过多次调试弄得清楚明白。
继而开始编写概算的代码。
在老师讲解中,我们需要采用的是极坐标法,这个方法要比前两种要简单,适用性更强。
看了指导书和书本之后,我决定采用书里面概算的代码。
书里面的代码是采用循环迭代来计算,有一些书里定义的函数需要自己弄清楚参数和函数类型,然后再自己编写这个函数的功能的。
所以需求仔细看书代码的意思然后才能编写出某个需自定义的函数。
通过编写了概算的函数,我更深入地掌握了迭代循环的用法和理解了极坐标法计算近似坐标的方法。
然后编写平差计算的代码。
首先是组成误差方程,那么就需要B和l矩阵,同样的我也是参考书里面的代码。
一开始看不懂书里面的变量,因为书里变量定义没有说明并且跟自身定义的差别太大。
需要我一行行甚至是手写和请教老师和同学才知道究竟表达的是什么。
由于有编写概算的经验,这一次编写比较顺利。
然后开始编写定权和误差计算的代码了,我参考了第八个实验的代码。
输出和计算出平差的成果。
在调试的时候出现多次错误有很多是循环提前了或则没有设置循环所以在计算的时候就会中断而不能继续,通过设置了很多个断点逐语句进行监视看每个变量的值,再对比指导书里面的成果。
成功调试后发现了X和Y的后面的成果小数点后2位跟指导书成果有一点点误差,经过检查还是无法改正出指导书一样的结果。
最后一步是绘图,绘图的代码不是全部自己编写的,但是我将绘图代码的一些重点语句看懂了,比如那个是定义画笔,颜色,比例等等。
在编写了程序并成功运行并输出后,其实有很多地方还是甚不了解的。
我反反复复地看自己的程序代码,一句一句地看这代码是怎样实现的,为什么这样做。
加深了一点了解。
但是在答辩的时候,我发现了我对B矩阵和x改正数矩阵并不完全了解,它们之间的联系并没有让我深入发掘出来。
答辩之后我深思了一下,再查看了一下程序,顿时之前查看代码的一部分部分慢慢结合成了一块。
让我发现了原来答辩不仅仅是单单的检验自己的程序和自己是否自己编写的,更是一个让自身更加深入地,全面地回顾自己这两个星期以来的点点滴滴,将他们结合起来机会。
在这一次课程设计中,我受益匪浅。
它将之前八个C++实验有机地统合在了一起并且升华。
在比以往都庞大的一个程序调试的过程中未免会出现很多的错误,有时候甚至高达几百个。
以前我一个一个个找错误找到自己认为容易改的开始改起,如今我懂得了错误要从第一个改起,因为有时候下面很多错误也许就是因为最上面一个少加了,或者;而引起的。
不仅如此,以前一些不从下手需要请教老师的错误现在见识多了,比较容易就知道了出现这种错误一般是哪里打错了或则哪里少了声明等等。
以往还不很会设置断点和理解断点的作用,现在懂得了再调试后可以通过断点一步步对比参数更加容易地发现到底是哪里出现了问题并加以改正。
感谢这一次机会,让我学到了这么东西,我会继续努力更加认真地学习下去!
4代码
(1)ControlPoint头文件
#pragmaonce
classCControlPoint//控制点
{
public:
CControlPoint();
~CControlPoint();
doubleX;
doubleY;
CStringstrPointID;//点号
intstate;
intflg;//判断测站点是否相同用
doubledE;
doubledF;
doubledQ;//椭圆函数
doubledMx;
doubledMy;
doubledMk;//矩阵计算
};
ControlPoint源文件
#include"StdAfx.h"
#include"ControlPoint.h"
CControlPoint:
:
CControlPoint()//初始化
{
X=0;
Y=0;
strPointID=_T("");
flg=0;
state=0;
dE=0;
dF=0;
dQ=0;
dMx=0;
dMy=0;
dMk=0;
}
CControlPoint:
:
~CControlPoint()
{
}
(2)DistObs头文件
#pragmaonce
#include"ControlPoint.h"
#include"Angle.h"
classCDistObs//距离观测值
{
public:
CDistObs();
~CDistObs();
public:
CControlPoint*cpStart,*cpEnd;//测站与照准点
doubledDist;//距离观测值
};
};
DistObs源文件
#include"StdAfx.h"
#include"DistObs.h"
CDistObs:
:
CDistObs(void)
{
dDist=0;
cpStart=NULL;
cpEnd=NULL;
}
CDistObs:
:
~CDistObs(void)
{
cpStart=NULL;
cpEnd=NULL;
}(3)AngleObs头文件
#pragmaonce
#include"ControlPoint.h"
#include"Angle.h"
classCAngleObs//方向观测值
{
public:
CAngleObs();
~CAngleObs();
public:
CControlPoint*cpStation;//起始点
CControlPoint*cpEnd;//照准点
CAngleObsAngle;//方向观测值
};
AngleObs源文件
#include"StdAfx.h"
#include"AngleObs.h"
CAngleObs:
:
CAngleObs(void)
{
cpStation=NULL;
cpEnd=NULL;
ObsAngle=0;
}
CAngleObs:
:
~CAngleObs(void)
{
}
(4)ControlNetAdjust头文件
#pragmaonce
#include"ControlPoint.h"
#include"AngleObs.h"
#include"DistObs.h"
#include"Matrix.h"
#include"Angle.h"
constdoubleAnglesigma=5;
constdoubleDistsigma=0.5;
classCControlNetAdjust
{
public:
CControlNetAdjust();
~CControlNetAdjust();
private:
CControlPoint*m_pUnknowPoint;
intm_iUnknowPointCount;
CControlPoint*m_pKnowPoint;
intm_iKnowPointCount;
CAngleObs*m_pAngleObs;
intm_iAngleObsCount;
CDistObs*m_pDistObs;
intm_iDistObsCount;
public:
intm_iStationCount;
boolLoadObsData(constCString&strFileName,CString&screen);
voidCoordinateEstimates();
voidSetSta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 测绘 程序 课程设计 报告 代码 界面设计 数据格式