大地测量实习报告_大地测量实习报告范文
大地测量实习报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“大地测量实习报告范文”。
大地测量综合实习
实习报告
学院 :遥感信息工程学院
姓名 :王海斌 学号 :2008302590134 指导老师 :丁老师
一.实习目的和意义
通过编程掌握大地测量的特点,加深对课本中基本公式的理解和运用,提高编程计算的能力通过用VC++语言编写大地坐标解算的一些基本算法程序,使我们巩固和掌握使用MFC进行大地测量解算的基本技能,提高实际动手能力,并通过实际编程了解测绘软件的实现的基本原理。为我们进一步学习大地测量、遥感等专业课程处理解决实际问题奠定基础。
二.实习内容
第一部分:大地测量主题解算(高斯正算和高斯反算):
一,函数头文件:
#include “stdafx.h”
#include #include #include #include
#define NN 8 #define PI 3.14***93 #define P 206265
二,控制变量:(数值按课本上给出赋初值);
void OuDegree(double);
//声明格式输出控制函数
double A12, B0, L0, A0, Bm, Am, deltaB, deltaL, deltaA, B2, L2, A21;double M, N, Nm, Vm, tm, gm;double a=6378245.0;double e2=0.***;double e12=0.***;double c=6399698.9017827110;高斯平均引数的正算公式:
cout
double degree[NN]={47,35,44},minute[NN]={46,49,12},second[NN]={52.6470,36.3300,13.664};//定义3个数组,第一个存放°,第二个存放′,第三个存放″
double B1=(degree[0]+minute[0]/60+second[0]/3600)*PI/180;//将 B1 化成弧度
double L1=(degree[1]+minute[1]/60+second[1]/3600)*PI/180;//将 A1化成弧度
double A1=(degree[2]+minute[2]/60+second[2]/3600)*PI/180;//将 L1 化成弧度 double S=44797.2826;
M=(a*(1-e2))/sqrt(pow((1-e2*pow(sin(B1),2)),3));N=a/sqrt(1-e2*pow(sin(B1),2));
deltaB=B0=S*cos(A1)/M;deltaL=L0=S*sin(A1)/(cos(B1)*N);deltaA=A0=L0*sin(B1);
do {
B0=deltaB;
A0=deltaA;
L0=deltaL;
Bm=B1+B0/2;
Am=A1+A0/2;
tm=tan(Bm);
gm=sqrt(e12)*cos(Bm);
Nm=a/sqrt(1-e2*pow(sin(Bm),2));
Vm=sqrt(1+e12*pow(cos(Bm),2));
deltaB=Vm*Vm*S*cos(Am)*(1+S*S*(sin(Am)*sin(Am)*(2+3*tm*tm+2*gm*gm)+3*gm*gm*cos(Am)*cos(Am)*(tm*tm-1-gm*gm-4*tm*tm*gm*gm))/(24*Nm*Nm))/Nm;
deltaL=S*sin(Am)*(1+S*S*(sin(Am)*sin(Am)*tm*tm-cos(Am)*cos(Am)*(1+gm*gm-9*tm*tm*gm*gm))/(24*Nm*Nm))/(Nm*cos(Bm));
deltaA=S*sin(Am)*tm*(1+S*S*(cos(Am)*cos(Am)*(2+7*gm*gm+9*tm*tm*gm*gm+5*pow(gm,4))+sin(Am)*sin(Am)*(2+tm*tm+2*gm*gm))/(24*Nm*Nm))/Nm;
}while((deltaB-B0)>1e-10&&(deltaL-L0)>1e-10&&(deltaA-A0)>1e-10);
B2=B1+deltaB;
L2=L1+deltaL;
A21=A1+deltaA+PI;
cout
double degree[NN]={47,35,48,36},minute[NN]={46,49,04,14},second[NN]={52.6470,36.3300,09.6384,45.0505};//定义3个数组,第一个存放°,第二个存放′,第三个存放″
double B1=(degree[0]+minute[0]/60+second[0]/3600)*PI/180;//将 B1 化成弧度
double L1=(degree[1]+minute[1]/60+second[1]/3600)*PI/180;//将 A1化成弧度
double B2=(degree[2]+minute[2]/60+second[2]/3600)*PI/180;//将 L1 化成弧度
double L2=(degree[3]+minute[3]/60+second[3]/3600)*PI/180;//将 L1 化成弧度
double U,V,r01,r21,r03,s10,s12,s30,t01,t21,t03,T,S;
Bm=(B1+B2)/2;deltaB=B2-B1;deltaL=L2-L1;
tm=tan(Bm);gm=sqrt(e12)*cos(Bm);Nm=a/sqrt(1-e2*pow(sin(Bm),2));Vm=sqrt(1+e12*pow(cos(Bm),2));
r01=Nm*cos(Bm);r21=Nm*cos(Bm)*(1-gm*gm-9*gm*gm*tm*tm)/24;r03=Nm*pow(cos(Bm),3)*tm*tm/24;s10=Nm/(Vm*Vm);s12=Nm*cos(Bm)*cos(Bm)*(-2-3*tm*tm+3*tm*tm*gm*gm)/24;s30=Nm*(gm*gm-tm*tm*gm*gm)/8;t01=tm*cos(Bm);t21=cos(Bm)*tm*(3+2*gm*gm-2*pow(gm,4))/24;t03=pow(cos(Bm),3)*tm*(1+gm*gm)/12;
U=r01*deltaL+r21*deltaB*deltaB*deltaL+r03*pow(deltaL,3);V=s10*deltaB+s12*deltaB*deltaL*deltaL+s30*pow(deltaB,3);deltaA=t01*deltaL+t21*deltaB*deltaB*deltaL+t03*pow(deltaL,3);
Am=atan(U/V);S=U/sin(Am);A12=Am-deltaA/2;A21=Am+deltaA/2+PI;
cout
void OuDegree(double m){ int aa,bb;double cc;aa=m*206265/3600;bb=m*206265/60-aa*60;cc=m*206265-aa*3600-bb*60;printf(“%d°%d′%f″nn”,aa,bb,cc);} 四:结果:
1,正算:
2,反算:
第二部分:坐标系坐标转换:(MFC)(克氏椭球,国际椭球,WGS—84椭球);
一,TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = “ 克氏椭球 ”;
m_tab.InsertItem(0,&item);
item.pszText = “1975国际椭球”;
m_tab.InsertItem(1,&item);
item.pszText = “ WGS—84椭球”;
m_tab.InsertItem(2,&item);二:Dialog:
三:赋予初值;
m_Ld = 111;m_Lm = 17;m_Ls = 58.3596;
//经度坐标; m_Bd = 30;m_Bm = 45;m_Bs = 25.4425;
//纬度坐标; m_x = 0.0;m_y = 0.0;m_nLd = 0;m_nLm = 0;m_nLs = 0;m_nBd = 0;
m_nBm = 0;m_nBs = 0;四:选择坐标计算类型
case 0 :
_a = 6378245.0;
_b = 6356863.0187730473;
break;
case 1 :
_a = 6378140.0;
_b = 6356755.2881575287;
break;case 2 :
_a = 6378137.0;
_b = 6356752.3142;
break;}
e =pow((_a*_a_b*_b), 0.5)/ _b;
m[0] = _a *(1e*e * sin(B_r)*sin(B_r)),-0.5);t = tan(B_r);nl_squr = e_*e_ * pow(cos(B_r), 2);
l = Le*e * sin(Bf)*sin(Bf)),-0.5);Mf = _a *(1e*e * sin(Bf)*sin(Bf)),-1.5);tf = tan(Bf);nlf_squr = e_*e_ * pow(cos(Bf), 2);
double B_, L_;B_ = Bftf*(61+90*tf*tf+45*pow(tf,4))*pow(m_y,6)/(720*Mf*pow(Nf,5));L_ = 111*PI/180 + m_y/(Nf*cos(Bf))-(1+2*tf*tf+nlf_squr)*pow(m_y,3)/(6*pow(Nf,3)*cos(Bf))+(5+28*tf*tf+24*pow(tf,4)+6*nlf_squr+8*nlf_squr*tf*tf)*pow(m_y,5)/(120*pow(Nf,5)*cos(Bf));
double B_s, L_s;int B_d, B_m, L_d, L_m;B_ *= 3600*180/PI;L_ *= 3600*180/PI;m_nBd = int(B_/3600);
m_nLd = int(L_/3600);m_nBm = int((B_-m_nBd*3600)/60);
m_nLm = int((L_-m_nLd*3600)/60);m_nBs = B_-m_nBd*3600-m_nBm*60;
m_nLs = L_-m_nLd*3600-m_nLm*60;
CDialog::UpdateData(false);第三部分:高斯投影带计算;
一.三度投影带:
void CGuacaltDlg::OnButton1()//三度带投影 { // TODO: Add your control notification handler code here if(bzs){
int n=int(m_L1/3.0+0.5);
L0=3*n*3600;
ZSGuaCalculate();}
if(bfs){
L0=m_mL1*3600;
FSGuaCalculate();} UpdateData(false);二.六度投影带;
void CGuacaltDlg::OnButton2()//六度带投影 { // TODO: Add your control notification handler code here if(bzs){
int n=int(m_L1/6.0)+1;
L0=(6*n-3)*3600;
ZSGuaCalculate();}
if(bfs){
L0=m_mL1*3600;
FSGuaCalculate();} UpdateData(false);三.成果分析
通过数据的输入和输出,并将自己得到的结果与参考结果作出比较,不断改正自己的错误,得到正确的结果; 四.实习总结与体会
通过实习,对课堂上所学的有关大地测量结算的内容有了更深的认识和了解,也从本质上了解了大地测量数据的处理方法。对各种算法有了较清楚的了解和掌握。在这次实习过后,对VC++的使用和MFC的理解也有了进一步的加强,仍旧发现MFC是难点。由于水平有限,很多算法太过复杂,对此部分代码不得不借鉴已有的程序,而只能达到大致的理解。但在实习得到最终成果后,还是比较有成就感的,对课程和专业也有了更深的认识,增强了今后学习的兴趣,也明确了今后努力的方向。
十分感谢学院和老师给我们这次实习的机会,使我们加强了课程的学习,跟让我们认识到了自身的不足。