测绘程序设计实验八水准网平差程序设计报告.docx
- 文档编号:8497865
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:24
- 大小:635.88KB
测绘程序设计实验八水准网平差程序设计报告.docx
《测绘程序设计实验八水准网平差程序设计报告.docx》由会员分享,可在线阅读,更多相关《测绘程序设计实验八水准网平差程序设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
测绘程序设计实验八水准网平差程序设计报告
《测绘程序设计(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_iUnkno
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测绘 程序设计 实验 水准 网平差 报告