中南大学测绘程序课程设计报告含代码讲解.docx
- 文档编号:27914017
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:51
- 大小:183.77KB
中南大学测绘程序课程设计报告含代码讲解.docx
《中南大学测绘程序课程设计报告含代码讲解.docx》由会员分享,可在线阅读,更多相关《中南大学测绘程序课程设计报告含代码讲解.docx(51页珍藏版)》请在冰豆网上搜索。
中南大学测绘程序课程设计报告含代码讲解
中南大学
测绘程序课程设计报告
姓名:
XXX
学号:
XXXXXXX
指导老师:
XXX
专业班级:
XXXX
1系统设计
1、实现功能
1.1优化设计:
根据控制网的观测精度与网形,全面评定网的精度
1.2数据输入:
使用外部数据倒入,通过读取.txt格式观测文件实现数据输入
1.3概算:
主要是进行近似坐标的推算。
1.4平差计算:
对观测数据进行精密平差计算,得到平差后的点位坐标,方向
观测值,边长观测值等,精度评定。
1.5成果输出:
控制网图形输出,绘制误差椭圆,以及平差结果导出到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)创建点类用于存取点的信息,如坐标、点号、长短轴、精度信息
classClzControlPoint
{
public:
ClzControlPoint();
~ClzControlPoint();
doubleX;
doubleY;
CStringstrPointID;
intstate;
intflg;
doubledE;
doubledF;
doubledQ;
doubledMx;
doubledMy;
doubledMk;
};
(2)创建距离类用于存取距离观测信息,如测站方向点、观测方向点、距离观测值
classClzDistObs
{
public:
ClzDistObs();
~ClzDistObs();
public:
ClzControlPoint*cpStart,*cpEnd;
doubledDist;
};
(3)创建方向类用于存取方向观测信息,如测站方向点、照准方向点、方向观测值
classClzAngleObs
{
public:
ClzAngleObs();
~ClzAngleObs();
public:
ClzControlPoint*cpStation;
ClzControlPoint*cpEnd;
AngleObsAngle;
};
(4)读取文件函数:
boolClzControlNetAdjust:
:
LoadObsData(constCString&strFileName),此函数功能为通过传入的文件名strFileName进行文件读写,并将信息存到相应成员数据中。
2.2近似坐标推算
2.2.1近似坐标计算原理
按方向和边长观测值计算导线网中待定点的近似坐标
d
2.2.2具体实现
(1)坐标概算函数:
voidClzControlNetAdjust:
:
CoordinateEstimates(),此函数功能为:
第一步查找某方向观测i两端都为已知点,第二步查找某方向观测j的测站点与方向观测i测站点相同且观测方向未知,第三步根据近似坐标计算原理计算方向观测j的观测方向近似坐标,需要注意的是,在近似坐标推算中,循环计算一次之后,必须判断是否所有未知点的近似坐标已经推算出来,没有的话再进行循环计算。
(这样做主要是为了防止在节点控制网中,当未知点很多时,可能推算到一个点之后,它所连得所有控制点均为坐标未知点,这样在一次循环中就会跳过这个控制点,这个点的近似坐标就没有计算出来。
而在下一次循环中,它所连得控制点中就会有坐标已知点,这样这个点的近似坐标就计算出来了)。
(2)计算流程图:
坐标输入系统
inti=0tom_pAngleObsCount
i=i+1
m_pAngleObs中第i个的测站点和观测方向点是否已知
否
j=j+1
是
计算m_pAngleObs中第i个的观测方向点近似坐标
m_pAngleObs中第j个的测站点和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)voidClzControlNetAdjust:
:
ComAngleObsEff(ClzAngleObsAngleObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk),此函数功能为计算出AngleObs的系数Fi、Ci、Di、Ck;
(2)voidClzControlNetAdjust:
:
ComDistObsEff(ClzDistObsDistObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk),此函数功能为计算出DistObs的系数Fi、Ci、Di、Ck;
(3)voidClzControlNetAdjust:
:
FormErrorEquations(CMatrix&B,CMatrix&f),此函数功能为组建法方程系数矩阵B,常数项矩阵f;FixedWeight(CMatrix&p),此函数功能为计算权矩阵p;
(4)voidClzControlNetAdjust:
:
CalculateErrorEquations(constCString&strFileName),此函数功能为平差计算、点位精度计算、输出到trFileName中。
2.成果输出
(1)平差结果的输出,主要是输出方向观测成果表、距离观测成果表、精度评定以及控制点成果表这四方面内容,对于这部分的输出比较容易实现,只要建立Cstring对象,调用库函数.format()来定义输出格式,来进行格式化输出,就很容易实现。
在对话框对应的计算按钮添加代码部分获得文件名strFileName,调用CalculateErrorEquations(constCString&strFileName)。
(2)图形绘制,对话框添加picture控件,在对话框对应的画图按钮添加代码获得picture控件的CDC和大小,调用控制网ClzControlNetAdjust中成员函数ErrorEllipseDraw(CDC*pDC,CRect&rect)进行绘图。
2程序设计计划与进度表
编号:
完成内容:
日期:
1
系统的总体设计、编制作业进度表
6.24——6.25
2
数据输入
6.26
3
近似坐标的推算
6.27
4
平差计算
6.28--6.29
5
控制网网形、误差椭圆的绘制
6.30
6
代码修改、程序整改、修饰工作、调试
7.1-7.2
7
实验报告的编写
7.3
3设计心得
3.1程序设计过程中遇到问题及解决方法
3.1.1坐标概算时,CoordinateEstimates()函数在查找某方向观测方向两端为已知时中断,设断点发现方向观测的测站点和观测方向点指针指向NULL,初步断定读取函数出现问题。
在LoadObsData(constCString&strFileName)中读取已知点、未知点、方向观测、距离观测处设置断点,通过调试发现在读取方向观测时,SearchPointUsingID出现问题,发现是if语句出现了问题,改正后通过。
3.1.2组成法方程时,常数项矩阵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.3平差计算时,迭代平差进入死循环。
设置断点后,调试发现问题在于求解未知数坐标改正数找最大值时,最大值始终为第一次平差时改正数最大值,并未随着迭代而变化。
通过监视未知点的坐标时发现,一般再迭代两次左右坐标不会变换,所以将迭代次数直接迭代5次,而不通过控制未知数改正数的最大值跳出循环。
3.1.4平差结果文件中,发现方向观测各测站零方向改正数不为零,在输出之前写代码将零方向强制归零,相同测站的方向减去该零方向的改正数,经处理后问题得到解决。
3.1.5平差后进行画图时,再制定比例尺时,通过坐标中的最大的坐标比上rect的宽度和高度,坐标转换后,图像画出来非常小。
处理方法为:
通过横纵坐标的最大与最小的差与rect的宽度和高度比作为比例尺,并以控制点的某点相对画图,图像的大小位置符合要求。
而在绘制椭圆过程中,直接通过长短轴求得椭圆上的点到椭圆中心的距离,投影到屏幕坐标上,经绘制为误差曲线,经过将坐标旋转后直接绘图得到正确图形。
3.1.6后期测试时,发现在计算、画图后,再按计算、画图按钮,上一次的图形并未清除,上网查找GetDlgItem(IDC_DRAW)->ShowWindow(FALSE);GetDlgItem(IDC_DRAW)->ShowWindow(TRUE);,通过关闭和开启控件可将上次所绘图形清除。
3.2程序设计感想
这次测绘程序课程设计让我学会了编写控制网平差的程序,其中包括文件读取、坐标概算、组成法方程、定权、平差计算、精度评定以及绘制网图和误差椭圆。
其中,加深了文件读取的操作,MFC图形绘制操作的熟练程度。
在编写过程中,遇到了各种问题,最后都通过调试得到了解决,也更让我明白,一个好的程序调试是至关重要的,而最麻烦的也是调试,因为语句编译通过,语法没有错误,错误往往是一些细小的地方。
这就得需要一步步的设断点,并进行监视,看监视值和正确值是否一致,一步步进行调整。
在编写过程中,往往由于一些原因引起不必要的麻烦,这更叫提醒我在写程序的时候务必专心,同时我也更有信心学好专业编程,相信自己会做的更好。
4代码
(1)ClzControlPoint头文件
classClzControlPoint
{
public:
ClzControlPoint();
~ClzControlPoint();
doubleX;
doubleY;
CStringstrPointID;
intstate;
intflg;
doubledE;
doubledF;
doubledQ;
doubledMx;
doubledMy;
doubledMk;
};
ClzControlPoint源文件
#pragmaonce
#include"stdafx.h"
#include"ClzControlPoint.h"
ClzControlPoint:
:
ClzControlPoint()
{
X=0;
Y=0;
strPointID=_T("");
flg=0;
state=0;
dE=0;
dF=0;
dQ=0;
dMx=0;
dMy=0;
dMk=0;
}
ClzControlPoint:
:
~ClzControlPoint()
{
}
(2)ClzDistObs头文件
classClzDistObs
{
public:
ClzDistObs();
~ClzDistObs();
public:
ClzControlPoint*cpStart,*cpEnd;
doubledDist;
};
ClzDistObs源文件
#include"stdafx.h"
#include"ClzDistObs.h"
ClzDistObs:
:
ClzDistObs()
{
dDist=0;
cpStart=NULL;
cpEnd=NULL;
}
ClzDistObs:
:
~ClzDistObs()
{
cpStart=NULL;
cpEnd=NULL;
}
(3)ClzAngleObs头文件
classClzAngleObs
{
public:
ClzAngleObs();
~ClzAngleObs();
public:
ClzControlPoint*cpStation;
ClzControlPoint*cpEnd;
AngleObsAngle;
};
ClzAngleObs源文件
#include"stdafx.h"
#include"ClzAngleObs.h"
ClzAngleObs:
:
ClzAngleObs()
{
cpStation=NULL;
cpEnd=NULL;
ObsAngle=0;
}
}
ClzAngleObs:
:
~ClzAngleObs()
{
cpStation=NULL;
cpEnd=NULL;
}
(4)ClzControlNetAdjust头文件
#pragmaonce
#include"ClzControlPoint.h"
#include"ClzAngleObs.h"
#include"ClzDistObs.h"
#include"Matrix.h"
#include"Angle.h"
classClzControlNetAdjust
{
public:
ClzControlNetAdjust();
~ClzControlNetAdjust();
private:
ClzControlPoint*m_pUnknowPoint;
intm_iUnknowPointCount;
ClzControlPoint*m_pKnowPoint;
intm_iKnowPointCount;
ClzAngleObs*m_pAngleObs;
intm_iAngleObsCount;
ClzDistObs*m_pDistObs;
intm_iDistObsCount;
public:
doubleAnglesigma;
doubleDistsigma;
intm_iStationCount;
boolLoadObsData(constCString&strFileName);
voidCoordinateEstimates();
voidSetAnglesigmaD(doubleAsigma,doubleDsigma,doublecount);
voidErrorEllipseDraw(CDC*pDC,CRect&rect);
voidCalculateErrorEquations(constCString&strFileName);
private:
ClzControlPoint*SearchKnownPointUsingID(CStringstrID);
ClzControlPoint*SearchUnknownPointUsingID(CStringstrID);
voidSetKnowPointSize(intsize);
voidSetUnknowPointSize(intsize);
voidSetAngleObsSize(intsize);
voidSetDistObsSize(intsize);
CString*SplitString(CStringstr,charsplit,intiSubStrs);
ClzControlPoint*SearchPointUsingID(CStringstrPointID);
AngleAzimuth(doubledX1,doubleMy1,doubledX2,doubleMy2);
doubleHDist(ClzControlPoint*cpStation1,ClzControlPoint*cpEnd1);
AngleZeroAngle(ClzAngleObsAngleObs);
voidFormErrorEquations(CMatrix&B,CMatrix&f);
voidComAngleObsEff(ClzAngleObsAngleObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk);
voidComDistObsEff(ClzDistObsDistObs,double&Fi,double&Ci,double&Di,double&Ck,double&Dk);
voidFixedWeight(CMatrix&p);
voidGetMaxXY(double&dx,double&dy,double&minx,double&maxy);
voidOutMatrixToFile(constCMatrix&mat,CStdioFile&SF);
}
ClzControlNetAdjust源文件
#include"stdafx.h"
#include"ClzControlNetAdujst.h"
#include
#include"math.h"
constdoublePI=atan(1.0)*4.0;
constdoubleEPSILON=1.0E-12;
constdoubleR0=206265;
ClzControlNetAdjust:
:
ClzControlNetAdjust()
{
m_pUnknowPoint=NULL;
m_iUnknowPointCount=0;
m_pKnowPoint=NULL;
m_iKnowPointCount=0;
m_pAngleObs=NULL;
m_iAngleObsCount=0;
m_pDistObs=NULL;
m_iDistObsCount=0;
Anglesigma=0;
Distsigma=0;
m_iStationCount=0;
}
ClzControlNetAdjust:
:
~ClzControlNetAdjust()
{
delete[]m_pUnknowPoint;
m_pUnknowPoint=NULL;
delete[]m_pKnowPoint;
m_pKnowPoint=NULL;
delete[]m_pAngleObs;
m_pAngleObs=NULL;
delete[]m_pDistObs;
m_pDistObs=NULL;
}
voidClzControlNetAdjust:
:
SetKnowPointSize(intsize)
{
if(m_pKnowPoint!
=NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 测绘 程序 课程设计 报告 代码 讲解
![提示](https://static.bdocx.com/images/bang_tan.gif)