测绘程序设计实验八水准网平差程序设计报告.docx
《测绘程序设计实验八水准网平差程序设计报告.docx》由会员分享,可在线阅读,更多相关《测绘程序设计实验八水准网平差程序设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
测绘程序设计实验八水准网平差程序设计报告
《误差理论与测量平差基础课程设计(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
#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{
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_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=SplitString(strLine,',',n);
m_pDhObs[i].cpBackObj=SearchPointUsingID(pstrData[0]);//后视点
m_pDhObs[i].cpFrontObj=SearchPointUsingID(pstrData[1]);//前视点
m_pDhObs[i].HObsValue=_tstof(pstrData[2]);//高差观测值
m_pDhObs[i].Dist=_tstof(pstrData[3]);//距离观测值
delete[]pstrData;
pstrData=NULL;
}
sf.Close();
return1;
}
CString*AdjustLevel:
:
SplitString(CStringstr,charsplit,int&iSubStrs)
{
intiPos=0;//分割符位置
intiNums=0;//分割符的总数
CStringstrTemp=str;
CStringstrRight;
//先计算子字符串的数量
while(iPos!
=-1)
{
iPos=strTemp.Find(split);
if(iPos==-1)
{
break;
}
strRight=strTemp.Mid(iPos+1,str.GetLength());
strTemp=strRight;
iNums++;
}
if(iNums==0)//没有找到分割符
{
//子字符串数就是字符串本身
iSubStrs=1;
returnNULL;
}
//子字符串数组
iSubStrs=iNums+1;//子串的数量=分割符数量+1
CString*pStrSplit;
pStrSplit=newCString[iSubStrs];
strTemp=str;
CStringstrLeft;
for(inti=0;i{
iPos=strTemp.Find(split);
//左子串
strLeft=strTemp.Left(iPos);
//右子串
strRight=strTemp.Mid(iPos+1,strTemp.GetLength());
strTemp=strRight;
pStrSplit[i]=strLeft;
}
pStrSplit[iNums]=strTemp;
returnpStrSplit;
}
//
LevelControlPoint*AdjustLevel:
:
SearchKnownPointUsingID(CStringID)
{
for(inti=0;i{
if(m_pKnownPoint[i].strID==ID)
{return&m_pKnownPoint[i];}
}
returnNULL;
}
//
LevelControlPoint*AdjustLevel:
:
SearchUnknownPointUsingID(CStringID)
{
for(inti=0;i{
if(m_pUnknownPoint[i].strID==ID)
{return&m_pUnknownPoint[i];}
}
returnNULL;
}
LevelControlPoint*AdjustLevel:
:
SearchPointUsingID(CStringID)
{
LevelControlPoint*cp;
cp=SearchKnownPointUsingID(ID);
if(cp==NULL)
cp=SearchUnknownPointUsingID(ID);
returncp;
}
voidAdjustLevel:
:
ApproHeignt(void)//用于计算高程近似值的函数
{
for(inti=0;i{
if(m_pUnknownPoint[i].flag!
=1)
{
//先在未知点作为观测值的前视点的情况
for(intj=0;j{//如果观测值的前视点是未知点且其后视点已经有高程值
if((m_pDhObs[j].cpFrontObj->strID==m_pUnknownPoint[i].strID)
&&m_pDhObs[j].cpBackObj->flag==1)
{//前视点=后视点-高差
/*m_pUnknownPoint[i].H=m_pDhObs[i].cpBackObj->H-m_pDhObs[i].ObsValue;*/
m_pUnknownPoint[i].H=m_pDhObs[j].cpBackObj->H+m_pDhObs[j].HObsValue;
m_pUnknownPoint[i].flag=1;
break;
}
}
if(m_pUnknownPoint[i].flag!
=1)//如果经过上一步骤未知点仍没有计算出近似值
{
for(intj=0;j{//如果观测值的后视点是未知点且其前视点已经有高程值
if((m_pDhObs[j].cpBackObj->strID==m_pUnknownPoint[i].strID)
&&m_pDhObs[j].cpFrontObj->flag==1)
{//后视点=前视点+高差
m_pUnknownPoint[i].H=m_pDhObs[j].cpFrontObj->H-m_pDhObs[j].HObsValue;
/*m_pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj->H+m_pDhObs[i].ObsValue;*/
m_pUnknownPoint[i].flag=1;
break;
}
}
}
}
if(i==m_iUnknownPointCount-1)//如果已经计算到最后一个未知点
{
for(inta=0;a{
if(m_pUnknownPoint[i].flag!
=1)//只要有一个未知点的近似高程直没有计算
{//则要重新进行上面的步骤直到所有的未知点的近似高程值都计算出
i=-1;
break;
}
}
}
}
}
CMatrixAdjustLevel:
:
LevleWeight(void)
{
CMatrixp(m_iDhObsCount,m_iDhObsCount);
p.Unit();
doublevalue;
for(inti=0;i{
value=(1.0/m_pDhObs[i].Dist);
p(i,i)=value;
}
returnp;
}
voidAdjustLevel:
:
FormErrorEquation(CMatrix&B,CMatrix&L)
{
B.SetSize(m_iDhObsCount,m_iUnknownPointCount);
L.SetSize(m_iDhObsCount,1);
for(inti=0;i{
LevelControlPoint*tmpBack=NULL,*tmpFront=NULL;
tmpBack=SearchPointUsingID(m_pDhObs[i].cpBackObj->strID);
tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);
//找到与第i个观测值有关的未知点
tmpBack->strID;
for(intj=0;j{
if(m_pUnknownPoint[j].strID==tmpBack->strID)//如果是后视点则前面的系数为-1
{B(i,j)=-1;continue;
}
if(m_pUnknownPoint[j].strID==tmpFront->strID)//如果是前视点则前面的系数为
{
B(i,j)=1;
}
}
}
//建立L矩阵
CStringtmp;
for(inti=0;i{
//l=高差观测值-(后视近似值-前视近似值)
/*L(i,0)=m_pDhObs[i].ObsValue-(m_pDhObs[i].cpBackObj->H-m_pDhObs[i].cpFrontObj->H);*/
L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H-m_pDhObs[i].cpBackObj->H);
tmp.Format(_T("%.3f"),L(i,0));
L(i,0)=_tstof(tmp);
L(i,0)=L(i,0)*1000;//将单位化为mm
}
}
voidAdjustLevel:
:
EquationCompute(CMatrix&x)//计算法方程
{
CMatrixP,B,l;
P=LevleWeight();//P为权矩阵
FormErrorEquation(B,l);
ApproHeignt();
CMatrixBT(m_iUnknownPointCount,m_iDhObsCount);
BT=~B;//B的转置矩阵
CMatrixNBB(m_iUnknownPointCount,m_iUnknownPointCount);
NBB=BT*P*B;
CMatrixNBBl=NBB.Inv();
x=NBBl*BT*P*l;
for(inti=0;i{
m_pUnknownPoint[i].H+=x(i,0);//未知点高程值=近似值+改正数
}
}
voidAdjustLevel:
:
Accuracy_Assessment(double&r0,CMatrix&Qxx)//精度评定
{
CMatrixB,l,P,x;
P=LevleWeight();//P为权矩阵
FormEr