间接平差基础大作业.docx
《间接平差基础大作业.docx》由会员分享,可在线阅读,更多相关《间接平差基础大作业.docx(36页珍藏版)》请在冰豆网上搜索。
间接平差基础大作业
《测量平差基础》
间接平差法报告书
姓名:
学号:
日期:
2016
指导老师:
目录
1)平差原理..............................................................2
2)平差过程..............................................................3
2.1平差流程...........................................................3
2.2平差相关代码.......................................................3
3)平差结果(要求以表格形式表达;注意单位统一及有效位数的取位)..........25
4)结论..................................................................29
5)课程设计的体会及建议..................................................30
6)参考文献.............................................................31
1)平差原理
2)平差过程
2.1平差流程
①.读取观测数据与已知点坐标数据(包括一些数据的精度);
②.计算未知点近似坐标;
③.建立角度与边长误差方程;
④.计算角度观测值误差方程的系数和常数项;
⑤.计算边长观测值误差方程的系数和常数项;
⑥.组成误差方程,得到系数阵和常数阵;
⑦.定权,得到权矩阵;
⑧.组成并解算法方程;
⑨.计算观测值的平差值及其方差协方差阵DLL与坐标平差值(Xi,Yi)及其方差协方差阵DXX;
⑩.精度评定(单位权中误差,点位中误差,边长相对中误差)。
2.2平差相关代码:
#include"StdAfx.h"
#include"SingleTraverse.h"
#include"CommonSurveyFunctions.h"
#include"math.h"
#include
CSingleTraverse:
:
CSingleTraverse(shortTraverseType,shortAngleType)
{
m_nType=TraverseType;
m_nAngleType=AngleType;
if(m_nType==1)//附合导线,4个已知点
{
m_pKnownPoint=newCControlPoint[4];//已知点数组
m_iKnownPointCount=4;//已知点个数
}
elseif(m_nType==2||m_nType==3)//闭合导线与无定向导线,2个已知点
{
m_pKnownPoint=newCControlPoint[2];//已知点数组
m_iKnownPointCount=2;//已知点个数
}
elseif(m_nType==4)//支导线
{
m_pKnownPoint=newCControlPoint;//已知点数组
m_iKnownPointCount=1;//已知点个数
}
else
{
m_pKnownPoint=NULL;//已知点数组
m_iKnownPointCount=0;//已知点个数
}
m_pUnknownPoint=NULL;//未知点数组
m_iUnknownPointCount=0;//未知点个数
m_pAngleObs=NULL;//角度观测值数组
m_iAngleObsCount=0;//角度观测值个数
m_pDistObs=NULL;//距离观测值数组
m_iDistObsCount=0;//距离观测值个数
}
CSingleTraverse:
:
~CSingleTraverse(void)
{
//释放动态数组内存
if(m_pUnknownPoint!
=NULL)
{
delete[]m_pUnknownPoint;
m_pUnknownPoint=NULL;
}
if(m_pKnownPoint!
=NULL)
{
delete[]m_pKnownPoint;
m_pKnownPoint=NULL;
}
if(m_pAngleObs!
=NULL)
{
delete[]m_pAngleObs;
m_pAngleObs=NULL;
}
if(m_pDistObs!
=NULL)
{
delete[]m_pDistObs;
m_pDistObs=NULL;
}
}
//根据单导线类型,设置已知点个数和数组
voidCSingleTraverse:
:
SetKnownPointSize(shortnType)
{
m_nType=nType;
if(m_nType==1)//附合导线,4个已知点
{
m_pKnownPoint=newCControlPoint[4];//已知点数组
m_iKnownPointCount=4;//已知点个数
}
elseif(m_nType==2||m_nType==3)//闭合导线与无定向导线,2个已知点
{
m_pKnownPoint=newCControlPoint[2];//已知点数组
m_iKnownPointCount=2;//已知点个数
}
elseif(m_nType==4)//支导线
{
m_pKnownPoint=newCControlPoint;//已知点数组
m_iKnownPointCount=1;//已知点个数
}
else
{
m_pKnownPoint=NULL;//已知点数组
m_iKnownPointCount=0;//已知点个数
}
}
//设置未知点个数,根据导线类型计算出角度与距离观测值个数
//注意:
调用该函数后,原有数据被删除
voidCSingleTraverse:
:
SetUnknownPointSize(intsize)
{
if(m_pUnknownPoint!
=NULL)
{
delete[]m_pUnknownPoint;
m_pUnknownPoint=NULL;
}
if(m_pAngleObs!
=NULL)
{
delete[]m_pAngleObs;
m_pAngleObs=NULL;
}
if(m_pDistObs!
=NULL)
{
delete[]m_pDistObs;
m_pDistObs=NULL;
}
m_iUnknownPointCount=size;
m_pUnknownPoint=newCControlPoint[size];
if(m_nType==1||m_nType==2)//闭合导线或附合导线
{
m_pAngleObs=newCAngleObs[size+2];
m_iAngleObsCount=size+2;
m_pDistObs=newCDistObs[size+1];
m_iDistObsCount=size+1;
}
elseif(m_nType==3)//无定向导线
{
m_pAngleObs=newCAngleObs[size];
m_iAngleObsCount=size;
m_pDistObs=newCDistObs[size+1];
m_iDistObsCount=size+1;
}
else//支导线
{
m_pAngleObs=newCAngleObs[size];
m_iAngleObsCount=size;
m_pDistObs=newCDistObs[size];
m_iDistObsCount=size;
}
}
//对已知点数组中的第pos点赋值,pos从0开始
boolCSingleTraverse:
:
SetKnownPoint(intpos,constCControlPoint&CP)
{
if(pos>=m_iKnownPointCount)returnfalse;
m_pKnownPoint[pos]=CP;
returntrue;
}
//对未知点数组中的第pos点赋值,pos从0开始
boolCSingleTraverse:
:
SetUnKnownPoint(intpos,constCControlPoint&CP)
{
if(pos>=m_iUnknownPointCount)returnfalse;
m_pUnknownPoint[pos]=CP;
returntrue;
}
//对角度观测数组中的第pos个观测值赋值,pos从0开始
boolCSingleTraverse:
:
SetAngleObs(intpos,constCAngleObs&AngObs)
{
if(pos>=m_iAngleObsCount)returnfalse;
m_pAngleObs[pos]=AngObs;
returntrue;
}
//对距离观测数组中的第pos个观测值赋值,pos从0开始
boolCSingleTraverse:
:
SetDistObs(intpos,constCDistObs&DistObs)
{
if(pos>=m_iDistObsCount)returnfalse;
m_pDistObs[pos]=DistObs;
returntrue;
}
//已知两个控制点,求P1->P2的方位角
CAngleCSingleTraverse:
:
Azi(constCControlPoint&P1,constCControlPoint&P2)
{
CAngleangAzi;
angAzi(RAD)=Azimuth(P1.X,P1.Y,P2.X,P2.Y);
returnangAzi;
}
//已知两个控制点,求P1->P2的距离
doubleCSingleTraverse:
:
HDist(constCControlPoint&P1,constCControlPoint&P2)
{
returnDist(P1.X,P1.Y,P2.X,P2.Y);
}
//计算角度闭合差
CAngleCSingleTraverse:
:
ComAngleClosedError(void)
{
CAngleangClosedError;//闭合差角度对象
/*A(i+1)=A(i)+左角-180
A(i+1)=A(i)-右角+180
如果大于360度还要减360*/
if(m_nType==1)//附合导线
{
CAngleStartBearing;//起始方位角
CAngleEndBearing;//终点附合方位角
StartBearing=Azi(m_pKnownPoint[0],m_pKnownPoint[1]);
EndBearing=Azi(m_pKnownPoint[2],m_pKnownPoint[3]);
//沿导线路线递推终止边的方位角
for(inti=0;i{
if(m_nAngleType==1)//左角
StartBearing(DEG)=StartBearing(DEG)+m_pAngleObs[i].ObsValue(DEG)-180;
else//右角
StartBearing(DEG)=StartBearing(DEG)+m_pAngleObs[i].ObsValue(DEG)+180;
if(StartBearing(DEG)>360)
StartBearing(DEG)=StartBearing(DEG)-360;
elseif(StartBearing(DEG)<0)
StartBearing(DEG)=StartBearing(DEG)+360;
}
angClosedError=StartBearing-EndBearing;
}
elseif(m_nType==2)//闭合导线
{
CAngleangSum(0,DEG);
//第一个角为连接角,不参与闭合差计算与角度分配
for(inti=1;i{
angSum=angSum+m_pAngleObs[i].ObsValue;
}
angClosedError(DEG)=angSum(DEG)-(m_iAngleObsCount-2)*180;
}
returnangClosedError;
}
//分配角度闭合差
voidCSingleTraverse:
:
DistributeAngleError(constCAngle&AngleError)
{
if(m_nType==1)//附合导线
{
for(inti=0;i{
m_pAngleObs[i].ObsValue(DEG)=m_pAngleObs[i].ObsValue(DEG)-
(AngleError(DEG)/m_iAngleObsCount);
}
}
elseif(m_nType==2)//闭合导线
{
//第一个角为连接角,不参与闭合差计算与角度分配
for(inti=1;i{
m_pAngleObs[i].ObsValue(DEG)=m_pAngleObs[i].ObsValue(DEG)-
(AngleError(DEG)/(m_iAngleObsCount-1));
}
}
}
//近似坐标推算及坐标闭合差计算
//注意:
fx,fy以引用的方式调用,把闭合差传递出来
voidCSingleTraverse:
:
CoorClosedError(double&fx,double&fy)
{
doubledx,dy;
if(m_nType==1||m_nType==2)//附合导线或闭合导线
{
CAngleStartBearing;//起始方位角
StartBearing=Azi(m_pKnownPoint[0],m_pKnownPoint[1]);
//沿导线路线递推终止边的方位角
for(inti=0;i{
if(m_nAngleType==1)//左角
StartBearing(DEG)=StartBearing(DEG)+m_pAngleObs[i].ObsValue(DEG)-180;
else//右角
StartBearing(DEG)=StartBearing(DEG)+m_pAngleObs[i].ObsValue(DEG)+180;
if(StartBearing(DEG)>360)
StartBearing(DEG)=StartBearing(DEG)-360;
elseif(StartBearing(DEG)<0)
StartBearing(DEG)=StartBearing(DEG)+360;
//计算坐标增量
dx=m_pDistObs[i].dDist*cos(StartBearing(RAD));
dy=m_pDistObs[i].dDist*sin(StartBearing(RAD));
if(i==m_iAngleObsCount-2)//如果是最后一个点,则计算闭合差
{
fx=m_pAngleObs[i].cpStation->X+dx-m_pAngleObs[i].cpEndObj->X;
fy=m_pAngleObs[i].cpStation->Y+dy-m_pAngleObs[i].cpEndObj->Y;
}
else//计算未知点近似坐标
{
m_pAngleObs[i].cpEndObj->X=m_pAngleObs[i].cpStation->X+dx;
m_pAngleObs[i].cpEndObj->Y=m_pAngleObs[i].cpStation->Y+dy;
}
}
}
}
//分配坐标闭合差,得到简易平差结果
voidCSingleTraverse:
:
DistributeCoorError(constdouble&fx,constdouble&fy)
{
//导线全长
doubledTotalLength=0;
for(inti=0;i{
dTotalLength=dTotalLength+m_pDistObs[i].dDist;
}
//分配坐标闭合差,注意:
是坐标增量按比例分配,反号分配
doubledx=0,dy=0;
for(inti=0;i{
dx=dx+fx/dTotalLength*m_pDistObs[i].dDist;
dy=dy+fy/dTotalLength*m_pDistObs[i].dDist;
m_pDistObs[i].cpEnd->X=m_pDistObs[i].cpEnd->X-dx;
m_pDistObs[i].cpEnd->Y=m_pDistObs[i].cpEnd->Y-dy;
}
}
//简易平差计算主程序
voidCSingleTraverse:
:
SimpleAdjust(constCString&strFileName)
{
CAngleAngleError;
AngleError=ComAngleClosedError();//计算角度闭合差
DistributeAngleError(AngleError);//分配角度闭合差
doublefx,fy,fD,K;
CoorClosedError(fx,fy);//近似坐标推算及坐标闭合差计算
DistributeCoorError(fx,fy);//分配坐标闭合差
//相对误差计算
fD=sqrt(fx*fx+fy*fy);
//导线全长
doubledTotalLength=0;
for(inti=0;i{
dTotalLength=dTotalLength+m_pDistObs[i].dDist;
}
K=fD/dTotalLength;
//开始输出简易平差的结果
CStdioFileSF;
CStringstrLine;
setlocale(LC_ALL,"");
if(!
SF.Open(strFileName,CFile:
:
modeCreate|CFile:
:
modeWrite))return;
//开始写数据
SF.WriteString(_T("----------单导线近似平差结果----------\n"));
strLine.Format(_T("导线类型:
%d\n"),m_nType);
SF.WriteString(strLine);
//写已知点数据
strLine.Format(_T("已知点个数:
%d\n"),m_iKnownPointCount);
SF.WriteString(strLine);
for(inti=0;i{
strLine.Format(_T("%s,%s,%.4f,%.4f,%.4f\n"),
m_pKnownPoint[i].strName,m_pKnownPoint[i].strID,
m_pKnownPoint[i].X,m_pKnownPoint[i].Y,m_pKnownPoint[i].H);
SF.WriteString(strLine);
}
//写未知点平差后数据
//写未知点数据
strLine.Format(_T("未知点个数:
%d\n"),m_iUnknownPointCount);
SF.WriteString(strLine);
for(inti=0;i{
strLine.Format(_T("%s,%s,%.4f,%.4f,%.4f\n"),
m_pUnknownPoint[i].strName,m_pUnknownPoint[i].strID,
m_pUnknownPoint[i].X,m_pUnknownPoint[i].Y,m_pUnknownPoint[i].H);
SF.WriteString(strLine);
}
//写角度闭合差
strLine.Format(_T("角度闭合差:
%.1f秒\n角度闭合差限差为:
%.1f秒\n"),
AngleError(DEG)*3600,40*sqrt(double(m_iAngleObsCount)));
SF.WriteString(strLine);
//写坐标闭合差
strLine.Format(_T("坐标闭合差:
fx=%.2fcmfy=%.2fcm\n"),fx,fy);
SF.WriteString(strLine);
//写边长观测精度
strLine.Format(_T("边长观测精度:
1/%d"),int(1.0/K));
SF.WriteString(strLine);
SF.Close();
}
//字符串分割函数
CStr