测绘程序设计实验八 水准网平差程序设计报告.docx

上传人:b****2 文档编号:2423896 上传时间:2023-05-03 格式:DOCX 页数:28 大小:475.91KB
下载 相关 举报
测绘程序设计实验八 水准网平差程序设计报告.docx_第1页
第1页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第2页
第2页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第3页
第3页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第4页
第4页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第5页
第5页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第6页
第6页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第7页
第7页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第8页
第8页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第9页
第9页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第10页
第10页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第11页
第11页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第12页
第12页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第13页
第13页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第14页
第14页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第15页
第15页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第16页
第16页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第17页
第17页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第18页
第18页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第19页
第19页 / 共28页
测绘程序设计实验八 水准网平差程序设计报告.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

测绘程序设计实验八 水准网平差程序设计报告.docx

《测绘程序设计实验八 水准网平差程序设计报告.docx》由会员分享,可在线阅读,更多相关《测绘程序设计实验八 水准网平差程序设计报告.docx(28页珍藏版)》请在冰点文库上搜索。

测绘程序设计实验八 水准网平差程序设计报告.docx

测绘程序设计实验八水准网平差程序设计报告

《测绘程序设计(VC.net)》

上机实验报告

(VisualC++.Net)

 

班级:

测绘0901班

学号:

0405090204

姓名:

代娅琴

2012年4月29日

 

实验八平差程序设计基础

一、实验目的

•巩固过程的定义与调用

•巩固类的创建与使用

•巩固间接平差模型及平差计算

•掌握平差程序设计的基本技巧与步骤

二、实验内容

水准网平差程序设计。

设计一个水准网平差的程序,要求数据从文件中读取,

计算部分与界面无关。

1.水准网间接平差模型:

2.计算示例:

近似高程计算:

3.水准网平差计算一般步骤

(1)读取观测数据和已知数据;

(2)计算未知点高程近似值;

(3)列高差观测值误差方程;

(4)根据水准路线长度计算高差观测值的权;

(5)组成法方程;

(6)解法方程,求得未知点高程改正数及平差后高程值;

(7)求高差观测值残差及平差后高差观测值;

(8)精度评定;

(9)输出平差结果。

4.水准网高程近似值计算算法

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为权矩阵

FormErrorEquation(B,l);

EquationCompute(x);

CMatrixv(m_iDhObsCount,1);

v=B*x-l;

CMatrixvT(1,m_iDhObsCount);

vT=~v;

CMatrixr/*(1,l)*/;

r=vT*P*v;

r0=sqrt(r(0,0)/(m_iDhObsCount-m_iUnknownPointCount));//单位权中误差

Qxx.SetSize(m_iUnknownPointCount,m_iUnknownPointCount);

CMatrixBT(m_iUnknownPointCount,m_iDhObsCount);

BT=~B;

CMatrixNBB(m_iUnknownPointCount,m_iUnkn

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2