间接平差基础大作业.docx

上传人:b****6 文档编号:5951488 上传时间:2023-01-02 格式:DOCX 页数:36 大小:121.54KB
下载 相关 举报
间接平差基础大作业.docx_第1页
第1页 / 共36页
间接平差基础大作业.docx_第2页
第2页 / 共36页
间接平差基础大作业.docx_第3页
第3页 / 共36页
间接平差基础大作业.docx_第4页
第4页 / 共36页
间接平差基础大作业.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

间接平差基础大作业.docx

《间接平差基础大作业.docx》由会员分享,可在线阅读,更多相关《间接平差基础大作业.docx(36页珍藏版)》请在冰豆网上搜索。

间接平差基础大作业.docx

间接平差基础大作业

《测量平差基础》

间接平差法报告书

 

姓名:

学号:

日期:

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

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

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1