测绘程序设计基础课程设计报告Word格式文档下载.docx
《测绘程序设计基础课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《测绘程序设计基础课程设计报告Word格式文档下载.docx(45页珍藏版)》请在冰点文库上搜索。
2,33256.5700,10900.8400
已知数据, 2为已知点的个数 点名,X,Y
3
3,4,5
未知点数据,3为未知点的个数 点名
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.000000
1,3,57.203210
1,4,113.140635
2,5,0.000000
2,3,32.122292
2,4,57.501530
......................
观测数据
18为方向观测值的个数;
8代表距离观测值个数。
外业数据采集
1.1描述的.txt格式数据文件
数据导入
数据编辑
1.2、数据输入流图
1.3、具体实现
先是定义一个控制点类CControlPoint,用来定义控制点
m_pKnownPoint/m_pUnknownPoint、方向角观测值CBearingObs、距离观测值
CDistObs的格式,这个类编译好之后,就可以用于数据的读取了。
CControlPoint*m_pUnknownPoint;
//未知点数组intm_iUnknownPointCount;
//未知点个数CControlPoint*m_pKnownPoint;
//已知点数组intm_iKnownPointCount;
//已知点个数
CBearingObs* m_pBearingObs;
//方向观测值数组intm_iBearingObsCount;
//方向观测值个数CDistObs* m_pDistObs;
//距离观测值数组intm_iDistObsCount;
//距离观测值个数CBearingObs*m_pZeroBearing;
//零方向观测值数据intm_iZeroBearingCount;
//零方向观测值个数
boolLoadData(constCString&
strFileName);
CString*SplitString(CStringstr,charsplit,intiSubStrs);
//字符串分割函数
按规定格式编辑好数据文件后,将这个txt文档导入,通过MFC文件读取方法逐行读入数据,然后通过调用分割函数SplitString,逐行进行分割,将数据保存到定义的动态数组中,这样就实现了数据的读取与保存。
2、概算模块(主要是近似坐标的推算)
2.1近似坐标推算公式
○1:
按方向观测值计算三角网中待定点的近似坐标
○2按边长观测值计算三边网中待定点的近似坐标
先按公式
(2)计算三角形的内角,再用公式
(1)计算待定点的坐标
○3按方向和边长观测值计算导线网中待定点的近似坐标
综合比较上述三种推算近似坐标的方法,第一和第二种方法,在近似坐标推算时必须有三角形才能计算,适用于三角网。
而本次试验采用的是边角网的观测数据,对于第一种只按角推算和第二种只按边推算,显然也是不合适的。
而第三种极坐标推算的方法,对所有网形均适用,从通用性和数据合理利用这两面考虑,故采用第三种极坐标推算的方法推算近似坐标。
在具体计算中采用逐点解算法,选择已知点或已计算出坐标的点作为起算点,根据具体的图形,来逐个推算出各点的坐标。
这种方法比较容易实现,而对于
整体解算的方法,对所有未知点进行整体解算,实现起来太困难。
推算流程图如下:
3、平差计算模块
○1附有条件的间接平差原理:
设未知数个数为t,观测值个数为n,条件方程个数为m
误差方程:
V=BX+L条件方程:
AX+W=0
根据最小二乘原理:
在条件AX+W=0下 ,即求条件极值法,利用拉格朗日不定乘数法:
由于此次实验中间接平差更适合编程的特点,故我们选用间接平差。
○2平差计算步骤:
(1)读取观测数据与已知点坐标数据;
(2)计算未知点近似坐标(用“导线点坐标增量法近似坐标”算法);
(3)计算角度观测值误差方程的系数和常数项;
(4)计算边长观测值误差方程的系数和常数项;
(5)列条件式;
(6)组成误差方程,得到系数矩阵和常数项矩阵;
(7)定权,得到权矩阵;
(8)组成方程;
(9)解算法方程,求得dX=[dx1dy1dx2dy2…]
(10)求得平差后的坐标值X=X+dX。
因为只有dx很小时误差方程式、条件方程式才是严密的,因此当dX的值较大时应把X=X_+dX作为新的近似值重复1-
3步,直到dx中绝对值最大的一个小于给定的限值。
(11)精度评定,计算误差椭圆参数等
○3误差方程式及条件方程式的列立
以未知点坐标为平差对象,一个观测值对应一个误差方程式,误差方程式
包括两类:
方向观测误差方程式和边长观测误差方程式。
(1)方向观测误差方程式
(2)边长观测误差方程式
○4定权
根据先验方向观测中误差和边长观测中误差来定权
(1)方向观测值的权
在等精度方向观测的控制网中,可把方向观测值的权定为1
(2)边长观测值的权
m2
m
ps= 2
s
而Ms=A+B*S/1000;
其中S单位为Km,这样的话Ms单位为mm
○5平差后的坐标值计算
求得平差后的坐标值X=X+dX。
因为只有dx很小时误差方程式、条件方程
式才是严密的,因此当dX的值较大时应把X=X_+dX作为新的近似值进行迭代,直到dx中绝对值最大的一个小于给定的0.1mm(注意:
这里只是指坐标改正值,不包括定向改正值,所以在求dx中绝对值最大值时,应除去定向改正值,否则会无限迭代计算,因为定向改正值很大,而且迭代计算时不会进行改正)。
VTPV
n-t
○6精度评定
中误差计算:
m0=±
待定点点位误差:
,n为观测值个数,t为未知数个数
Qyy
mx=±
m0Qxx,my=±
m0
m2+m2
x y
mk=±
误差椭圆元素计算:
1 2Q
长半径方位角
Q= arctg
xy
Qxx-Qyy
Q+Qtg(Q+90)
xx xy
长半径、短半径
E=m0E=m0
Qxx+QxytgQ,
平差计算流程图
数据读取,并保存到相应数组中
调用坐标概算函数,推算待求点近似坐标
否
If(MaxAbsDetX(detx)<
0.1)
是
进行间接平差
组成误差方程,得到系数矩阵和常数项矩
计算边长观测值误差方程的系数和常数项及权
计算角度观测值误差方程的系数和常数项及权
调用 调用
平差成果输出
结束
精度评定
4、成果输出模块
控
精
控制
制
度
网图
点
统
形误
成
计
差椭
果
圆的
绘制
具体实现:
平差的成果按一定的格式格式化输出到界面上,并以txt文档的格式保存。
调用绘制控制网图函数和绘制误差椭圆函数实现图形的输出显示,新建一Dlg用于设置误差椭圆的比例系数。
五、界面设计
图中主要有两个按钮,OpenthefileandCompute按钮和DrawtheEllipse按钮分别用作打开文件并计算输出和绘制误差椭圆。
六、实验总结
通过本次实验我在学习完测绘程序程序设计基础(C++)、测量学、测量平差等课程的基础上,通过实践巩固这些课程上的理论知识,并培养了动手能力,综合应用的能力。
在本次实验当中,主要设计思路参考了之前上课时所编写的水准网平差和单导线平差的思路,其中数据读入模块方法基本一致,需要编写坐标概算和平差计算以及控制网图形及误差椭圆的绘制工作。
在实验中遇到了一下的几个问题:
1、坐标概算考虑不周,在坐标概算时,只考虑到了已知数据在前面给出的情况,而如果已知数据出现在后面则会出现bug,在范老师的指导下,发现并改正了
这个小问题;
2、平差计算中出现问题,在平差计算时发现改正以后与正确值相差更多了,我自己检查发现在组成法方程时,由于自己疏忽,写错了代码,改过之后就能够输出了正确结果;
3、绘制控制网图形和误差椭圆时,以前的方法是建立单文档程序,在窗口中画图,但是我这次这样做发现在这个里边以前程序中的部分功能实现不了,我想应该是因为那些函数是基于对话框的,所以就将画图的功能放入对话框中实现了。
衷心感谢范老师张老师和学长在实验当中对我的指导。
附:
主要代码
TraverseNetAdj.h
#pragmaonce
#include"
ControlPoint.h"
#include"
Angle.h"
Matrix.h"
constdoubleRo=206264.806247;
//一弧度对应的秒数
classCTraverseNetAdj
{
public:
CTraverseNetAdj(void);
~CTraverseNetAdj(void);
private:
CBearingObs*m_pBearingObs;
//方向观测值数组intm_iBearingObsCount;
//方向观测值个数CDistObs*m_pDistObs;
//距离观测值数组intm_iDistObsCount;
//距离观测值个数
CBearingObs*m_pZeroBearing;
CString*SplitString(CStringstr,charsplit,int&
iSubStrs);
//分割字符串
voidApproximateXY();
//坐标概算,求近似坐标
CControlPoint*SearchKnownPointUsingNAME(CStringstrNAME);
//根据点名查找已知点,返回该点的指针
CControlPoint*SearchUnknownPointUsingNAME(CStringstrNAME);
//根据点名查找未知知点,返回该点的指针
CControlPoint*SearchPointUsingNAME(CStringstrNAME);
//根据点号查找控制点(包括已知点和未知点),返回该点的指针
voidSetUnknownPointSize(intsize);
//设置未知点数组大小voidSetKnownPointSize(intsize);
//设置已知点数据大小
voidSetBearingObsSize(intsize);
//设置方向观测值数组大小voidSetDistObsSize(intsize);
//设置距离观测值数组大小
voidSetZeroBearingSize(intsize);
//设置零方向观测值数组大小
CAngleZeroBearing(constCBearingObsm_BearingObs);
//计算定向零度方向角函数输入一个方向观察值返回测站点的零度定向角
CAngleAzi(constCControlPoint&
P1,constCControlPoint&
P2);
//已知两点求方位角,输入参数为CControlPoint类型
doubleHDist(constCControlPoint&
//求两点之间的距离
boolLoadObsData(constCString&
//从文件中导入数据
voidRigorousAdjust(constCString&
//严密平差(间接平差)计算主函数
doubleMaxAbsDetX(constCMatrix&
detX);
//求未知改正数绝对值最大的
voidOutMatrixToFile(constCMatrix&
mat,CStdioFile&
SF);
//把矩阵输出到文件中
CMatrixWeight(doubleSigmaAng,doubleSigmaDist);
//简单定权
//计算方向观测方程的系数和常数项
voidComBearingObsEff(constCBearingObs&
BearingObs,double&
Li,double&
Aj,double&
Bj,
double&
Ak,double&
Bk);
//计算距离观测方程的系数和常数项
voidComDistObsEff(constCDistObs&
DistObs,double&
Li,
Ci,double&
Di,double&
Ck,double&
Dk);
//输入一个方向观测对象,查找这一方向观测对象所对应的零方向对象在零方向数组中的位置
intSearchZeroBearing(constCBearingObs&
BearingObs);
//组成误差方程,B为系数矩阵,L为常数项向量
voidFormErrorEquations(CMatrix&
B,CMatrix&
L);
//画图
doubledScale;
//比例
//坐标原点doubledOrgX;
doubledOrgY;
int iLineWidth;
//线宽
COLORREFcrColor;
public:
voidSetScale(doublescale);
//设置绘图比例
voidSetOrg(doublex,doubley);
//设置坐标原点voidSetLineWidth(intiWidth);
//设置线宽
voidSetColor(COLORREFcolor);
//设置颜色voiddraw(CDC*pDC,CRect&
rect);
//绘制图形
};
TraverseNetAdj.cpp
StdAfx.h"
TraverseNetAdj.h"
CommonSurveyFunctions.h"
math.h"
#include<
locale.h>
CTraverseNetAdj:
:
CTraverseNetAdj(void)
//释放动态数组内存if(m_pUnknownPoint!
=NULL)
delete[]m_pUnknownPoint;
m_pUnknownPoint=NULL;
}
if(m_pKnownPoint!
delete[]m_pKnownPoint;
m_pKnownPoint=NULL;
if(m_pBearingObs!
delete[]m_pBearingObs;
m_pBearingObs=NULL;
if(m_pDistObs!
delete[]m_pDistObs;
m_pDistObs=NULL;
if(m_pZeroBearing!
delete[]m_pZeroBearing;
m_pZeroBearing=NULL;
//导线网的已知点个数不确定,所以不能像单导线那样直接确定已知点个数m_pKnownPoint=NULL;
//已知点数组
m_iKnownPointCount=0;
//已知点个数m_pUnknownPoint=NULL;
//未知点数组m_iUnknownPointCount=0;
//未知点个数m_pBearingObs=NULL;
//角度观测值数组m_iBearingObsCount=0;
//角度观测值个数m_pDistObs=NULL;
//距离观测值数组
m_iDistObsCount=0;
m_pZeroBearing=NULL;
//零方向观测值数组m_iZeroBearingCount=0;
~CTraverseNetAdj(void)
//设置已知点个数和数组
//注意:
调用该函数后,原有数据被删除
voidCTraverseNetAdj:
SetKnownPointSize(intsize)
m_pKnownPoint=newCControlPoint[size];
//已知点数组
m_iKnownPointCount=size;
//已知点个数
//设置未知点个数和数组
SetUnknownPointSize(intsize)
if(m_pUnknownPoint!
m_iUnknownPointCount=size;
m_pUnknownPoint=newCControlPoint[size];
//设置方向观测值个数和数组
SetBearingObsSize(intsize)
m_pBearingObs=newCBearingObs[size];
//方向观测值数组m_iBearingObsCount=size;
//方向观测值个数
//设置距离观测值个数和数组
SetDistObsSize(intsize)
m_pDistObs=newCDistObs[size];
//距离观测值数组m_iDistObsCount=size;
//设置零方向观测值个数和数组
SetZeroBearingSize(intsize)
if(m_pZeroBearing!
m_pZeroBearing=newCBearingObs[size];
//零方向观测值数组m_iZeroBearingCount=size;
//已知两个控制点,求P1->
P2的方位角
CAngleCTraverseNetAdj:
Azi(constCControlPoint&
P2)