测绘程序设计实验八水准网平差程序设计报告Word文档下载推荐.docx
- 文档编号:21634097
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:24
- 大小:635.88KB
测绘程序设计实验八水准网平差程序设计报告Word文档下载推荐.docx
《测绘程序设计实验八水准网平差程序设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《测绘程序设计实验八水准网平差程序设计报告Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
classLevelControlPoint
{
public:
LevelControlPoint(void);
~LevelControlPoint(void);
CStringstrName;
//点名
CStringstrID;
//点号
floatH;
boolflag;
//标记是否已经计算出近似高程值,若计算出则为,否则为
};
classCDhObs
CDhObs(void);
~CDhObs(void);
LevelControlPoint*cpBackObj;
//后视点
LevelControlPoint*cpFrontObj;
//前视点
doubleObsValue;
//高差值
doubleDist;
//测站的距离
#include"
StdAfx.h"
LevelControlPoint.h"
LevelControlPoint:
:
LevelControlPoint(void)
strName=_T("
"
);
strID=_T("
H=0;
flag=0;
}
~LevelControlPoint(void)
CDhObs:
CDhObs(void)
~CDhObs(void)
#include"
Matrix.h"
classAdjustLevel
AdjustLevel(void);
~AdjustLevel(void);
LevelControlPoint*m_pKnownPoint;
//已知点数组
intm_iKnownPointCount;
//已知点个数
LevelControlPoint*m_pUnknownPoint;
//未知点数组
intm_iUnknownPointCount;
//未知点个数
CDhObs*m_pDhObs;
//高差观测值数组
intm_iDhObsCount;
//高差观测值个数
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);
//计算权矩阵
voidFormErrorEquation(CMatrix&
B,CMatrix&
L);
//组成误差方程
voidEquationCompute(CMatrix&
x);
//计算法方程
voidAccuracy_Assessment(double&
r0,CMatrix&
Qxx);
//精度评定
voidCompAdjust(double&
r0,CMatrixQx[]);
AdjustLevel.h"
#include<
locale.h>
math.h"
AdjustLevel:
AdjustLevel(void)
m_pKnownPoint=NULL;
m_iKnownPointCount=0;
m_pUnknownPoint=NULL;
m_iUnknownPointCount=0;
m_pDhObs=NULL;
m_iDhObsCount=0;
~AdjustLevel(void)
if(m_pKnownPoint!
=NULL)
{
delete[]m_pKnownPoint;
m_pKnownPoint=NULL;
}
if(m_pUnknownPoint!
delete[]m_pUnknownPoint;
m_pUnknownPoint=NULL;
if(m_pDhObs!
delete[]m_pDhObs;
m_pDhObs=NULL;
voidAdjustLevel:
SetKnownPointSize(intsize)
m_pKnownPoint=newLevelControlPoint[size];
//创建动态指针
m_iKnownPointCount=size;
SetUnkonwnPointSize(intsize)
m_pUnknownPoint=newLevelControlPoint[size];
m_iUnknownPointCount=size;
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));
//根据未知点的个数创建未知点数组
//读取未知点的点名
CString*pstrData=SplitString(strLine,'
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!
//读取观测值的个数
SetDhObsSize(_ttoi(strLine));
//按照观测值的大小,创建观测值数组
m_iDhObsCount;
i++)//分行读取观测值的数据,将其存入观测值数组
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]);
//距离观测值
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<
iNums;
i++)
//左子串
strLeft=strTemp.Left(iPos);
//右子串
strRight=strTemp.Mid(iPos+1,strTemp.GetLength());
pStrSplit[i]=strLeft;
pStrSplit[iNums]=strTemp;
returnpStrSplit;
//
LevelControlPoint*AdjustLevel:
SearchKnownPointUsingID(CStringID)
i++)
if(m_pKnownPoint[i].strID==ID)
{return&
m_pKnownPoint[i];
SearchUnknownPointUsingID(CStringID)
if(m_pUnknownPoint[i].strID==ID)
m_pUnknownPoint[i];
SearchPointUsingID(CStringID)
LevelControlPoint*cp;
cp=SearchKnownPointUsingID(ID);
if(cp==NULL)
cp=SearchUnknownPointUsingID(ID);
returncp;
ApproHeignt(void)//用于计算高程近似值的函数
i++)//计算未知点高程值
if(m_pUnknownPoint[i].flag!
=1)
{
//先在未知点作为观测值的前视点的情况
for(intj=0;
j<
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;
{//如果观测值的后视点是未知点且其前视点已经有高程值
if((m_pDhObs[j].cpBackObj->
m_pDhObs[j].cpFrontObj->
{//后视点=前视点+高差
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;
}
if(i==m_iUnknownPointCount-1)//如果已经计算到最后一个未知点
for(inta=0;
a<
a++)
if(m_pUnknownPoint[i].flag!
=1)//只要有一个未知点的近似高程直没有计算
{//则要重新进行上面的步骤直到所有的未知点的近似高程值都计算出
i=-1;
break;
CMatrixAdjustLevel:
LevleWeight(void)
CMatrixp(m_iDhObsCount,m_iDhObsCount);
p.Unit();
doublevalue;
value=(1.0/m_pDhObs[i].Dist);
p(i,i)=value;
returnp;
FormErrorEquation(CMatrix&
L)
B.SetSize(m_iDhObsCount,m_iUnknownPointCount);
L.SetSize(m_iDhObsCount,1);
i++)//建立B系数阵
LevelControlPoint*tmpBack=NULL,*tmpFront=NULL;
tmpBack=SearchPointUsingID(m_pDhObs[i].cpBackObj->
strID);
tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->
//找到与第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;
//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->
tmp.Format(_T("
%.3f"
),L(i,0));
L(i,0)=_tstof(tmp);
L(i,0)=L(i,0)*1000;
//将单位化为mm
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;
m_pUnknownPoint[i].H+=x(i,0);
//未知点高程值=近似值+改正数
Accuracy_Assessment(double&
Qxx)//精度评定
CMatrixB,l,P,x;
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);
CMatrixNBB(m_iUnknownPointCount,m_iUnkno
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测绘 程序设计 实验 水准 网平差 报告