您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 其它文档 > 测绘程序设计(VS2008)实验报告--高斯投影正反算
《测绘程序设计(VC.net)》上机实验报告(VisualC++.Net)班级:学号:姓名:序号:二零一一年五月实验7常用测量程序设计1.实验目的:1.1巩固类的创建与使用;1.2掌握数组参数的传递;1.3掌握常用测绘程序设计的技巧。1.42.实验内容:编写高斯投影正反算程序。3.设计思路:这次的实验目的是实现高斯正反算。需要考虑以下几个问题投影方式即分带的方式,又要考虑椭球参数的类型,可通过单选组框和相应函数来完成此功能,分别是intSetProjectType(intm)和voidSetParameter(intm,double&a,double&b)4.界面设计界面设计很简单,如下:其中每个复选框的第一个选项的属性中Group属性设置为TRUE5.主要代码:文件名:Ccehui1201_shiyan7_yang_GaussDlg.hvoidCcehui1201_shiyan7_yang_GaussDlg::SetParameter(double&a,double&b);//设置椭球参数doubleCcehui1201_shiyan7_yang_GaussDlg::SetProjectType(double&LL);//设置分带方式doubleDeg(doubledDms);文件名:Ccehui1201_shiyan7_yang_GaussDlg.cpp代码:constdoublePI=4*atan(1.0);在BOOLCcehui1201_shiyan7_yang_GaussDlg::OnInitDialog()添加代码:《CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO3);CheckRadioButton(IDC_RADIO4,IDC_RADIO5,IDC_RADIO6);》//获得分带方式返回中央子午线经度doubleCcehui1201_shiyan7_yang_GaussDlg::SetProjectType(double&LL){UpdateData(TRUE);intn;//记录分带带号doubleL2;//经度L2=Deg(LL);if(IsDlgButtonChecked(IDC_RADIO1))//6度带{n=int(L2/6)+1;L0=6*n-3;}elseif(IsDlgButtonChecked(IDC_RADIO2))//3度带{n=int((L2+1.5)/3);L0=3*n;}elseif(IsDlgButtonChecked(IDC_RADIO3))//自主分带L0=L0;returnL0;}voidCcehui1201_shiyan7_yang_GaussDlg::SetParameter(double&a,double&b){if(IsDlgButtonChecked(IDC_RADIO4))//克拉索夫斯基椭球{a=6378245.0;b=6356863.0187730473;//e=sqrt(0.006693421622966);}elseif(IsDlgButtonChecked(IDC_RADIO5))//1975国际协议椭球{a=6378140.0;b=6356755.2881575287;//e=sqrt(0.006694384999588);}elseif(IsDlgButtonChecked(IDC_RADIO6))//WGS-84椭球{a=6378137.0;b=6356752.3142;//e=sqrt(0.0066943799013);}}//正算按钮voidCcehui1201_shiyan7_yang_GaussDlg::OnBnClickedOk(){//TODO:在此添加控件通知处理程序代码doubleN;//卯酉圈曲率半径doublet;doubleη;doubleX;//当前点到赤道的子午线长度doubleA0,A2,A4,A6,A8;//计算X的参数doubleRadB;doubleρ;ρ=180*3600/PI;//定义弧秒值,近似于″doublea,b,e1,e2;//椭球参数SetParameter(a,b);e1=sqrt(a*a-b*b)/a;e2=sqrt(a*a-b*b)/b;doublel;//经度L同当前带中央子午线的差值,单位为秒L0=SetProjectType(L);doubleRadL;RadL=Deg(L);l=(L-L0)*3600;RadB=Deg(B)*PI/180;N=a/sqrt(1-e1*e1*sin(RadB)*sin(RadB));t=tan(RadB);η=e2*cos(RadB);A0=1+3.0/4*pow(e1,2)+45.0/64*pow(e1,4)+350.0/512*pow(e1,6)+11025.0/16384*pow(e1,8);A2=-1.0/2*(3.0/4*e1*e1+60.0/64*pow(e1,4)+525.0/512*pow(e1,6)+17640.0/16384*pow(e1,8));A4=1.0/4*(15.0/64*pow(e1,4)+210.0/512*pow(e1,6)+8820.0/16384*pow(e1,8));A6=-1.0/6*(35.0/512*pow(e1,6)+2520.0/16384*pow(e1,8));A8=1.0/8*(315.0/16384*pow(e1,8));X=a*(1-pow(e1,2))*(A0*RadB+A2*sin(2*RadB)+A4*sin(4*RadB)+A6*sin(6*RadB)+A8*sin(8*RadB));x=X+N/(2*pow(ρ,2))*sin(RadB)*cos(RadB)*l*l+N/(24*pow(ρ,4))*sin(RadB)*pow(cos(RadB),3)*(5-t*t+9*pow(η,2)+4*pow(η,4))*pow(l,4)+N/(720*pow(ρ,6))*sin(RadB)*pow(cos(RadB),5)*(61-58*t*t+pow(t,4))*pow(l,6);y=N/ρ*cos(RadB)*l+N/(6*pow(ρ,3))*pow(cos(RadB),3)*(1-t*t+η*η)*pow(l,3)+N/(120*pow(ρ,5))*pow(cos(RadB),5)*(5-18*t*t+pow(t,4)+14*η*η-58*η*η*t*t)*pow(l,5);UpdateData(FALSE);}//反算按钮voidCcehui1201_shiyan7_yang_GaussDlg::OnBnClickedCancel(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);doublet_f;doubleη_f;doubleB_f;//底点纬度doubleN_f;doubleM_f;doubleX=x;doubleB0;doubleK0,K2,K4,K6;doublea,b,e1,e2;//椭球参数SetParameter(a,b);e1=sqrt(a*a-b*b)/a;e2=sqrt(a*a-b*b)/b;doubleA0;A0=1+3.0/4*e1*e1+45.0/64*pow(e1,4)+350.0/512*pow(e1,6)+11025.0/16384*pow(e1,8);B0=X/(a*(1-e1*e1)*A0);K0=1.0/2*(3.0/4*e1*e1+45.0/64*pow(e1,4)+350.0/512*pow(e1,6)+11025.0/16384*pow(e1,8));K2=-1.0/3*(63.0/64*pow(e1,4)+1108.0/512*pow(e1,6)+58239.0/16384*pow(e1,8));K4=1.0/3*(604.0/512*pow(e1,6)+68484.0/16384*pow(e1,8));K6=-1.0/3*(26328.0/16384*pow(e1,8));B_f=B0+sin(2*B0)*(K0+sin(B0)*sin(B0)*(K4+K6*sin(B0)*sin(B0)));t_f=tan(B_f);η_f=e2*cos(B_f);N_f=a/sqrt(1-e1*e1*sin(B_f)*sin(B_f));M_f=N_f/(1+e2*e2*cos(B_f)*cos(B_f));doubleB1;B1=B_f-t_f/(2*M_f*N_f)*y*y+t_f/(24*M_f*pow(N_f,3))*(5+3*t_f*t_f+η_f*η_f-9*η_f*η_f*t_f*t_f)*pow(y,4)-t_f/(720*M_f*pow(N_f,5))*(61+90*t_f*t_f+45*pow(t_f,4))*pow(y,6);doubleL1;L1=1.0/(N_f*cos(B_f))*y-1.0/(6*pow(N_f,3)*cos(B_f))*(1+2*t_f*t_f+η_f*η_f)*pow(y,3)+1.0/(120*pow(N_f,5)*cos(B_f))*(5+28*t_f*t_f+24*pow(t_f,4)+6*η_f*η_f+8*η_f*η_f*t_f*t_f)*pow(y,5);doubleL3=SetProjectType(L1);L0=L3;//将B,L转化为度分秒的形式B=B1*180/PI;L=L1*180/PI+L0;UpdateData(FALSE);//OnCancel();}//度分秒转十进制doubleCcehui1201_shiyan7_yang_GaussDlg::Deg(doubledDms){intiDeg,iMin;doubledSec;iDeg=int(dDms+EPSILON);//度,加一个很小的数,防止取整时出错iMin=int((dDms-iDeg)*100+EPSILON);//分dSec=((dDms-iDeg)*100-iMin)*100;//秒returniDeg+(double)iMin/60+dSec/3600;}//取消按钮voidCcehui1201_shiyan7_yang_GaussDlg::OnBnClickedButton2(){//TODO:在此添加控件通知处理程序代码OnCancel();}//清除按钮voidCcehui1201_shiyan7_yang_GaussDlg::OnBnClickedButton3(){//TODO:在此添加控件通知处理程序代码UpdateData(TRUE);L=B=L0=x=y=0;UpdateData(FALSE);}6.运行结果:实验的运行结果如下图所示:正算:反算:7.实验总结这次实验是实现高斯投影的正反算,方法很多,实现并不复杂,但是计算公式复杂,变量繁多,稍有不慎,就会造成计算错误。编程前我考虑最多的就是分带方式及椭球参数选择的实现方法,如何保证界面及函数的简洁美观,在和同学的讨论过程中,有同学建议用radiobutton,再添加事件处理程序这样就可达到界面及函数的简洁美观的效果了。不过我觉得没必要这么麻烦,写两个函数也可以搞定的啦,怎么简单就怎么办啦!第一次运行时,结果偏差相当大,核对了一遍公式公式并未发现什么错误,对变量进行监测时,发现ρ″的偏差很大,一检查原来是PI的定义出了问题,被我写成了4*tan(1.0)。改正后进行运算结果仍然相差很大,检测到的L的弧度的小数位上始终是0,所以肯定是角度转换出了问题,所以很快也改正了。通过这次实验我明白了断点调试和变量监测的重要性。
本文标题:测绘程序设计(VS2008)实验报告--高斯投影正反算
链接地址:https://www.777doc.com/doc-4436862 .html