测绘程序设计实验八水准网平差程序设计报告.docx
《测绘程序设计实验八水准网平差程序设计报告.docx》由会员分享,可在线阅读,更多相关《测绘程序设计实验八水准网平差程序设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
测绘程序设计实验八水准网平差程序设计报告
《误差理论与测量平差基础课程设计(VC.net)》
实习报告
(VisualC++.Net)
班级:
学号:
姓名:
2014年2月17日至2月28日
水准网平差程序设计
一、实验目的
•巩固过程的定义与调用
•巩固类的创建与使用
•巩固间接平差模型及平差计算
•掌握平差程序设计的基本技巧与步骤
二、实验内容
水准网平差程序设计。
设计一个水准网平差的程序,要求数据从文件中读取,
计算部分与界面无关。
1.水准网间接平差模型:
2.计算示例:
近似高程计算:
3.水准网平差计算一般步骤
(1)读取观测数据和已知数据;
(2)计算未知点高程近似值;
(3)列高差观测值误差方程;
(4)根据水准路线长度计算高差观测值的权;
(5)组成法方程;
(6)解法方程,求得未知点高程改正数及平差后高程值;
(7)求高差观测值残差及平差后高差观测值;
(8)精度评定;
(9)输出平差结果。
4.水准网高程近似值计算算法
5.输入数据格式示例
3已知点数
A,151。
5664
B,144。
5684已知点号及高程
C,144。
3194
9未知数
P1,P2,P3,P4,P5,P6,P7,P8,P9未知点号
15高差观测数据个数
B,P4,1。
4966,0。
4
B,P1,1。
7881,0。
5
P1,A,5。
2065,0。
7
P4,P2,2.0850,0。
9
P2,A,3。
4175,0.4
C,P3,1。
2081,1.0
P3,A,6.0372,0。
6
C,P5,4。
3306,0。
7高差观测数据:
起点,终点,高差,路线长度
P6,P5,3.6513,0。
6
P7,P6,2.5122,0。
3
P7,P9,2.0415,0。
8
P9,P4,1.5366,0.7
C,P4,1.7450,0.8
P8,P5,2.7436,0.4
P9,P8,1。
3783,0,5
实验代码:
#pragmaonce
classLevelControlPoint
{
public:
LevelControlPoint(void);
~LevelControlPoint(void);
public:
CStringstrName;//点名
CStringstrID;//点号
floatH;
boolflag;//标记是否已经计算出近似高程值,若计算出则为,否则为
};
classCDhObs
{
public:
CDhObs(void);
~CDhObs(void);
public:
LevelControlPoint*cpBackObj;//后视点
LevelControlPoint*cpFrontObj;//前视点
doubleObsValue;//高差值
doubleDist;//测站的距离
};
#include”StdAfx.h”
#include"LevelControlPoint。
h”
LevelControlPoint:
:
LevelControlPoint(void)
{
strName=_T("”);
strID=_T(”");
H=0;
flag=0;
}
LevelControlPoint:
:
~LevelControlPoint(void)
{
}
CDhObs:
:
CDhObs(void)
{
}
CDhObs:
:
~CDhObs(void)
{
}
#pragmaonce
#include"LevelControlPoint.h"
#include”Matrix.h"
classAdjustLevel
{
public:
AdjustLevel(void);
~AdjustLevel(void);
public:
LevelControlPoint*m_pKnownPoint;//已知点数组
intm_iKnownPointCount;//已知点个数
LevelControlPoint*m_pUnknownPoint;//未知点数组
intm_iUnknownPointCount;//未知点个数
CDhObs*m_pDhObs;//高差观测值数组
intm_iDhObsCount;//高差观测值个数
public:
voidSetKnownPointSize(intsize);//创建大小为size的已知点数组
voidSetUnkonwnPointSize(intsize);//创建大小为size的未知点数组
voidSetDhObsSize(intsize);//创建大小为size的观测值数组
boolLoadObsData(constCString&strFile);//读入观测文件
CString*SplitString(CStringstr,charsplit,int&iSubStrs);
voidApproHeignt(void);//计算近似值
private:
LevelControlPoint*SearchKnownPointUsingID(CStringID);
LevelControlPoint*SearchUnknownPointUsingID(CStringID);
LevelControlPoint*SearchPointUsingID(CStringID);
CMatrixLevleWeight(void);//计算权矩阵
public:
voidFormErrorEquation(CMatrix&B,CMatrix&L);//组成误差方程
voidEquationCompute(CMatrix&x);//计算法方程
voidAccuracy_Assessment(double&r0,CMatrix&Qxx);//精度评定
voidCompAdjust(double&r0,CMatrixQx[]);
};
#include"StdAfx.h”
#include”AdjustLevel.h”
#include〈locale。
h>
#include”LevelControlPoint。
h”
#include"math。
h”
AdjustLevel:
:
AdjustLevel(void)
{
m_pKnownPoint=NULL;//已知点数组
m_iKnownPointCount=0;//已知点个数
m_pUnknownPoint=NULL;//未知点数组
m_iUnknownPointCount=0;//未知点个数
m_pDhObs=NULL;//高差观测值数组
m_iDhObsCount=0;//高差观测值个数
}
AdjustLevel:
:
~AdjustLevel(void)
{
if(m_pKnownPoint!
=NULL)
{
delete[]m_pKnownPoint;
m_pKnownPoint=NULL;
}
if(m_pUnknownPoint!
=NULL)
{
delete[]m_pUnknownPoint;
m_pUnknownPoint=NULL;
}
if(m_pDhObs!
=NULL)
{
delete[]m_pDhObs;
m_pDhObs=NULL;
}
}
voidAdjustLevel:
:
SetKnownPointSize(intsize)
{
m_pKnownPoint=newLevelControlPoint[size];//创建动态指针
m_iKnownPointCount=size;
}
voidAdjustLevel:
:
SetUnkonwnPointSize(intsize)
{
m_pUnknownPoint=newLevelControlPoint[size];
m_iUnknownPointCount=size;
}
voidAdjustLevel:
:
SetDhObsSize(intsize)
{
m_pDhObs=newCDhObs[size];
m_iDhObsCount=size;//高差观测值个数
}
boolAdjustLevel:
:
LoadObsData(constCString&strFile)
{
CStdioFilesf;
if(!
sf.Open(strFile,CFile:
:
modeRead))returnfalse;//创建并打开文件对象
CStringstrLine;
boolbEOF=sf。
ReadString(strLine);//读取第一行,即已知点的数目
SetKnownPointSize(_ttoi(strLine));//根据已知点的数目,创建已知点数组;
intn=0;
for(inti=0;i〈m_iKnownPointCount;i++)//读取已知点的点名和高程值
{
sf。
ReadString(strLine);
CString*pstrData=SplitString(strLine,',',n);
m_pKnownPoint[i]。
strName=pstrData[0];
m_pKnownPoint[i].strID=pstrData[0];
m_pKnownPoint[i].H=_tstof(pstrData[1]);
m_pKnownPoint[i].flag=1;//已知点不用平差,故将其的flag设置为
delete[]pstrData;
pstrData=NULL;
}
sf。
ReadString(strLine);//读取未知点的个数
SetUnkonwnPointSize(_ttoi(strLine));//根据未知点的个数创建未知点数组
sf.ReadString(strLine);//读取未知点的点名
CString*pstrData=SplitString(strLine,’,’,n);
for(inti=0;i〈m_iUnknownPointCount;i++)//将未知点的点名放入未知点数组
{
m_pUnknownPoint[i].strName=pstrData[i];
m_pUnknownPoint[i]。
strID=pstrData[i];
m_pUnknownPoint[i]。
H=0;//未知点的高程值设置为
m_pUnknownPoint[i]。
flag=0;//还没有求得近似高程,故其flag设置为
}
if(pstrData!
=NULL)
{
delete[]pstrData;
pstrData=NULL;
}
sf.ReadString(strLine);//读取观测值的个数
SetDhObsSize(_ttoi(strLine));//按照观测值的大小,创建观测值数组
for(inti=0;i{
sf.ReadString(strLine);
CString*pstrData=S