闭合导线计算测量程序设计.docx
《闭合导线计算测量程序设计.docx》由会员分享,可在线阅读,更多相关《闭合导线计算测量程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
闭合导线计算测量程序设计
测绘工程2012级
测量程序设计程序文档
一.含球气差改正的三角高程计算程序
1.需求分析
三角高程测量方法简便灵活,受地形条件的限制比较少。
随着电磁波测距仪的迅速发展,当前利用电磁波测距仪作三角高程测量已相当普遍。
在一定条件下,三角高程的测量精度可以达到四等水准甚至三等水准的测量精度。
在这样的情况下,通过编写含有地球曲率和大气折光影响改正的程序语言,通过程序计算,提高准确度和减少工作量。
2.界面设计
程序通过C++程序语言,基于MFC的对话框方式实现。
整个界面简洁明了如下图:
界面左边是含有大气折光和地球曲率影响的三角高程测量示意图;右边则包含已知量:
仪器高、目标高、垂直角、斜距、测站点高程的输入窗口以及目标点高程显示窗口和程序执行的确定按钮。
3.主要功能模块的代码
头文件处的声明如下:
#include"stdafx.h"
#include"W0110XF__三角高程.h"
#include"W0110XF__三角高程Dlg.h"
#include"math.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
在测量中,角度观测值常用浮点小数表示度分秒,即:
度为整数部分,小数点后两位为分,第三位开始为秒。
而计算时需转化为度或者弧度的形式,下面的程序即为实现用浮点数表示的度分秒转化为弧度的函数:
doubleZH(doublej_dfm)//度分秒转化为度再转化为弧度
{
inta=int(j_dfm);
intb=int((j_dfm-a)*100);
doublec=((j_dfm-a)*100-b)*100;
doublej_d=(a+double(b)/60+c/3600)/180*3.1415926;
returnj_d;
}
含球气差改正的三角高程计算实现代码如下:
voidCW0110XF__三角高程Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
if(D<0||i<0||v<0)
{
AfxMessageBox(_T("数据输入有误,请重新输入!
"));
}
doublej_hd=ZH(j_ab);//调用已有函数,实现度分秒转化为度再转化为弧度
doubleK=0.14;//大气垂直折光系数
doubleR=6371000;//地球平均曲率半径
h_B=h_A+D*sin(j_hd)+(1-K)*D*D/(2*R)*cos(j_hd)*cos(j_hd)+i-v;//高程计算公式
UpdateData(FALSE);
}
4.测试运行
输入相应数据,运行结果正确如下图:
当仪器高输为负数时,提示有误:
二.坐标前方交会定点程序
1.需求分析
前方交会定点法是一种常见的加密控制点的方法,通过已知点A(Xa,Ya),B(Xb,Yb)及∠A∠B来求得未知点坐标(Xp,Yp)。
计算公式如下:
通过程序语言实现坐标点位的计算,简捷快速,不易出错。
1.界面设计
程序通过C++程序语言,基于MFC的对话框方式实现。
整个界面简洁明了如下图:
界面左边是前方交会定点的示意图,右边为坐标已知点及角度的输入窗口,
已知数据:
A点X坐标、A点Y坐标、B点X坐标、B点Y坐标、角A、角B;
计算结果:
P点X坐标、P点Y坐标。
3.主要功能模块的代码
头文件声明如下:
#include"stdafx.h"
#include"W0110XF__前方交会.h"
#include"W0110XF__前方交会Dlg.h"
#include"math.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
在测量中,角度观测值常用浮点小数表示度分秒,即:
度为整数部分,小数点后两位为分,第三位开始为秒。
而计算时需转化为度或者弧度的形式,下面的程序即为实现用浮点数表示的度分秒转化为弧度的函数:
doubleZH(doublej_dfm)//度分秒转化为度再转化为弧度
{
inta=int(j_dfm);
intb=int((j_dfm-a)*100);
doublec=((j_dfm-a)*100-b)*100;
doublej_d=(a+double(b)/60+c/3600)/180*3.1415926;
returnj_d;
}
前方交会定点实现代码如下:
voidCW0110XF__前方交会Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
doubleA,B;
A=ZH(jiao_A);//调用已有函数实现度分秒转化为度,再转化为弧度
B=ZH(jiao_B);
Xp=(Xa/tan(B)+Xb/tan(A)+(Yb-Ya))/(1/tan(A)+1/tan(B));//求未知点点位坐标代码
Yp=(Ya/tan(B)+Yb/tan(A)+(Xa-Xb))/(1/tan(A)+1/tan(B));
UpdateData(FALSE);
}
4.测试运行
按照西南交通大学版《测量学》教材例题输入相关数据计算,显示答案正确,详情如下:
三.大地坐标与空间直角坐标相互转换程序
1.需求分析
实现大地坐标系中大地经度L、大地纬度B、大地高H与空间直角坐标X、Y、Z的相互转换较为复杂。
特别是大地纬度B的计算通常会涉及到迭代运算的方式。
而采用计算机程序语言实现迭代十分方便。
这让坐标转换的进行也变得容易,整个过程的准确率也比较高!
2.界面设计
程序通过C++程序语言,基于MFC的对话框方式实现。
整个界面简洁明了如下图:
因为该程序涉及到空间直角坐标与大地坐标的相互转换,为了便于用户识别,不混淆转化框,所以在界面上设计了两个计算按钮并用分组框加以区别。
在使用时只需在对应框中输入相应值,点击相应按钮即可实现计算!
3.主要功能模块的代码
头文件声明如下:
#include"stdafx.h"
#include"W0110XF__空间直角坐标与大地坐标转换.h"
#include"W0110XF__空间直角坐标与大地坐标转换Dlg.h"
#include"math.h"
#definePI3.1415926
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
在测量中,角度观测值常用浮点小数表示度分秒,即:
度为整数部分,小数点后两位为分,第三位开始为秒。
而计算时需转化为度或者弧度的形式,下面的程序即为实现用浮点数表示的度分秒转化为弧度的函数:
doubleZH1(doublej_dfm)//度分秒转化为度,再转化为弧度
{
inta=int(j_dfm);
intb=int((j_dfm-a)*100);
doublec=((j_dfm-a)*100-b)*100;
doublej_d=(a+double(b)/60+c/3600)/180*3.1415926;
returnj_d;
}
而在显示时我们通常需要将所得的度转化为用浮点数来表示度分秒的形式,这样以便于结果的有效利用。
其实现的函数代码如下:
doubleZH2(doublej_d)//度转化为度分秒的浮点数方式
{
inta=int(j_d);
doubleb1=(j_d-a)*60;
intb2=int(b1);
doublec=(b1-b2)*60;
doublej_dfm=a+double(b2)/100+c/10000;
returnj_dfm;
}
大地坐标转化为空间直角坐标实现代码如下:
voidCW0110XF__空间直角坐标与大地坐标转换Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
doublehB,hL,hN;
if(B<0||B>90)
{
AfxMessageBox(_T("纬度输入错误!
"));
}
hB=ZH1(B);//调用已声明函数,实现度分秒转化为度再转化为弧度
hL=ZH1(L);
//采用WGS84椭球参数
doublee=0.0066943799013;//椭球第一偏心率
doublea=6378137;//椭球的长半轴
hN=a/sqrt(1-e*e*sin(hB)*sin(hB));
X=(hN+H)*cos(hB)*cos(hL);
Y=(hN+H)*cos(hB)*sin(hL);
Z=(hN*(1-e*e)+H)*sin(hB);
UpdateData(FALSE);
}
空间直角坐标转化为大地坐标实现代码如下:
voidCW0110XF__空间直角坐标与大地坐标转换Dlg:
:
OnBnClickedButton1()
{
UpdateData(TRUE);
//采用WGS84椭球参数
doublee=0.0066943799013;//椭球第一偏心率
doublea=6378137;//椭球的长半轴
doubleb,b1,b2;
b1=atan(Z1/sqrt(X1*X1+Y1*Y1));
b2=atan(((a*e*sin(b1))/sqrt(1-e*sin(b1)*sin(b1))+Z1)/(sqrt(X1*X1+Y1*Y1)));
while(fabs(b2-b1)>0.00005)//求大地纬度B的迭代循环
{
b1=b2;b2=atan(((a*e*sin(b1))/sqrt(1-e*sin(b1)*sin(b1))+Z1)/(sqrt(X1*X1+Y1*Y1)));
}
b=b2;
L1=atan(Y1/X1);
H1=sqrt(X1*X1+Y1*Y1)/cos(b)-a/sqrt(1-e*sin(b)*sin(b));
B1=ZH2(b*180/PI);//调用已声明函数,实现度转化为度分秒的浮点数表达
L1=ZH2(L1*180/PI);
UpdateData(FALSE);
}
4.测试运行
运行截图如下:
当纬度输入超限时:
四.简易闭合导线计算程序
1.需求分析
闭合导线计算是较为复杂的测量计算过程,它涉及到:
角度闭合差的计算和调整、坐标方位角的计算、坐标增量闭合差的计算和调整以及坐标计算这一系列的复杂计算过程;数据量也比较到。
因此,通过计算机程序实现闭合导线的输入自动计算,会大大节省工作时间,计算的准确率和工作效率、工作质量也都会大大提升!
2.程序主要功能代码
在测量中,角度观测值常用浮点小数表示度分秒,即:
度为整数部分,小数点后两位为分,第三位开始为秒。
而计算时需转化为度或者弧度的形式,下面的程序即为实现用浮点数表示的度分秒转化为弧度的函数:
doubleZH(doublej_dfm)//度分秒转化为度
{
doublej_d;
inta=int(j_dfm);
intb=int((j_dfm-a)*100);
doublec=((j_dfm-a)*100-b)*100;
j_d=(a+double(b)/60+c/3600);
returnj_d;
}
对于导线计算这样的生成数据比较多的程序,通常采用文本文档记录计算成果数据,代码实现如下:
ofstreamoutfile("D:
\\W0110XF_FILE.txt");
if(!
outfile)
cout<<"读取出现错误!
未能保存成功!
!
\n";
else
for(inti=1;i{
outfile<outfile<}
outfile.close();
cout<<"*****平差结果在D:
W0110XF_FILE.txt中也有保存!
*****"<<"\n"<3.程序源代码
//W0110__闭合导线.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
#definePI3.1415926
#defineN5//在此修改测站点数
doubleZH(doublej_dfm)//度分秒转化为度
{
doublej_d;
inta=int(j_dfm);
intb=int((j_dfm-a)*100);
doublec=((j_dfm-a)*100-b)*100;
j_d=(a+double(b)/60+c/3600);
returnj_d;
}
int_tmain(intargc,_TCHAR*argv[])
{
doublex[N+1],//各点纵坐标
y[N+1],//各点横坐标
s[N],//边长
n_j[N],//内角
fw_j1[N];//方位角
doubledx,//纵坐标差
dy,//横坐标差
sum_s=0,//边长和
sum_j=0;//内角和
cout<<"*********注意:
当前设定的测站点数为"<!
*********\n"<cout<<"NOW,请输入已知点坐标x1,y1(以空格分开):
";
cin>>x[0]>>y[0];
cout<<"请输入已知点的方位角:
";
cin>>fw_j1[0];
fw_j1[0]=ZH(fw_j1[0]);
for(inti=0;i{
cout<<"请输入第"<
";
cin>>s[i];
}
{
for(inti=0;i{
cout<<"请输入第"<
";
cin>>n_j[i];
n_j[i]=ZH(n_j[i]);
sum_j+=n_j[i];
}
for(inti=0;in_j[i]-=(sum_j-180*(N-2))/N;//内角平差
}
for(inti=1;i{
fw_j1[i]=180-n_j[i]+fw_j1[i-1];//计算其余各点的方位角
}
for(inti=1;i{
x[i]=x[i-1]+s[i-1]*cos(fw_j1[i-1]/180*PI);
y[i]=y[i-1]+s[i-1]*sin(fw_j1[i-1]/180*PI);//计算各点的大致坐标
}
dx=x[N]-x[0];
dy=y[N]-y[0];
for(inti=0;i{
sum_s+=s[i];
}
for(inti=1;i{
x[i]=x[i]+dx/sum_s*s[i-1];
y[i]=y[i]+dy/sum_s*s[i-1];//坐标平差
}
cout<<"******************************************************"<cout<<"***************最后平差结果如下***********************"<for(inti=1;i{
cout<<"第"<
"<}
//将计算数据保存在文本文件中
ofstreamoutfile("D:
\\W0110XF_FILE.txt");
if(!
outfile)
cout<<"读取出现错误!
未能保存成功!
!
\n";
else
for(inti=1;i{
outfile<outfile<}
outfile.close();
cout<<"*****平差结果在D:
W0110XF_FILE.txt中也有保存!
*****"<<"\n"<system("pause");
return0;
}
4.测试运行
程序运行结果截图:
保存的计算成果文档截图: