间接平差基础大作业.docx
- 文档编号:5951488
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:36
- 大小:121.54KB
间接平差基础大作业.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 间接 基础 作业