高斯投影坐标正反算编程报告.docx
- 文档编号:12052384
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:14
- 大小:92.02KB
高斯投影坐标正反算编程报告.docx
《高斯投影坐标正反算编程报告.docx》由会员分享,可在线阅读,更多相关《高斯投影坐标正反算编程报告.docx(14页珍藏版)》请在冰豆网上搜索。
高斯投影坐标正反算编程报告
高斯投影坐标正反算编程报告
1.编程思想
进行高斯投影坐标正反算的编程需要牵涉到大量的公式,为了使程序条理更清楚,各块的数据复用性更强,这里采取了结构化的编程思想。
程序由四大块组成。
GeodesyHomework.cpp文件用于存放main()函数,是整个程序的入口。
通过结构化的编程尽力使main()函数变得简单。
MyFunction.h和MyFunction.cpp用于存放计算过程中进行角度弧度换算时所要用到的一些自定的转换函数。
Zhengsuan.h和Zhengsuan.cpp用于存放Zhengsuan类,在Zhengsuan类中声明了高斯投影坐标正算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及正算计算。
通过get函数获得相应的正算结果。
Fansuan.h和Fansuan.cpp用于存放Fansuan类,类似于Zhengsuan类,Fansuan类中声明了高斯投影坐标反算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及反算计算。
通过get函数获得相应的反算结果。
2.计算模型
高斯投影正算公式
高斯投影反算公式
3.程序框图
4.计算结果
5.附录:
程序代码
/////主函数入口
GeodesyHomework.cpp
#include"MyFunction.h"
#include"Zhengsuan.h"
#include"Fansuan.h"
#include
usingnamespacestd;
voidfansuan();
voidzhengsuan();
voidmain(){
zhengsuan();
fansuan();
printf("/nover!
");
}
voidzhengsuan(){
doublemyB,myL;
cout<<"【正算】"< cout<<"请输入大地纬度B"< myB=angleToDegree(); cout<<"请输入大地经度L"< myL=angleToDegree(); ZhengsuanmyZhengsuan1(myB,myL); printf("RadianB=%fL=%f\n",myZhengsuan1.getrB(),myZhengsuan1.getrL()); myZhengsuan1.printLocation(); } voidfansuan(){ doublemyX,myY; cout<<"【反算】"< cout<<"请输入国家统一坐标XY。 例如3378627.181920243953.4517"< cin>>myX>>myY; FansuanmyFansuan1(myX,myY); myFansuan1.printLocation(); } ///自定功能函数库 MyFunction.h #definePI3.1415926 #include usingnamespacestd; doubleangleToDegree(intdu,intfen,floatmiao); doubleangleToDegree();//将度分秒换算为度 doubledegreeToRadian(doubledegree); doubledegreeToRadian();//将角度换算为弧度 MyFunction.cpp #include"MyFunction.h" doubleangleToDegree(intdu,intfen,floatmiao){ doubleresult=0; result=miao/3600.0+fen/60.0+du; returnresult; } doubleangleToDegree(){ intdu,fen; floatmiao; doubleresult; cout<<"请输入度分秒。 例如: 302000"< cin>>du>>fen>>miao; result=angleToDegree(du,fen,miao); returnresult; } doubledegreeToRadian(doubledegree){ doubleresult=0; result=degree/57.295779513082321; returnresult; } doubledegreeToRadian(){ doubleresult,degree; degree=angleToDegree(); result=degreeToRadian(degree); returnresult; } ///正算类 Zhengsuan.h //Zhengsuan.h: interfacefortheZhengsuanclass. // ////////////////////////////////////////////////////////////////////// #if! defined(AFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_) #defineAFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_ #if_MSC_VER>1000 #pragmaonce #endif//_MSC_VER>1000 #definerouSecond206264.806247096355 #include"MyFunction.h" #include #include usingnamespacestd; classZhengsuan { public: Zhengsuan(); Zhengsuan(doublefB,doublefL); doublegetX(); doublegetY(); doublegetrB(); doublegetrL(); voidprintLocation(); virtual~Zhengsuan(); private: doublex; doubley;//大地坐标 doubleX; doubleY;//国家统一坐标 doubleB; doublerB; intBsecond; doubleL; doublerL; //输入的大地纬度B,大地经度L,rB,rL为对应弧度表示值,Bsecond为换算成秒数值 intn;//带号n doubleL0;//中央经线纬度L0 doubleLDot;//纬度差L-L0 intLDotSecond;//换算成秒的纬度差 doublel; doubleN; doublea0; doublea3; doublea4; doublea5; doublea6;//七个计算参数 }; #endif//! defined(AFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_) Zhengsuan.cpp //Zhengsuan.cpp: implementationoftheZhengsuanclass. // ////////////////////////////////////////////////////////////////////// #include"Zhengsuan.h" ////////////////////////////////////////////////////////////////////// //Construction/Destruction ////////////////////////////////////////////////////////////////////// Zhengsuan: : Zhengsuan() { } Zhengsuan: : Zhengsuan(doublefB,doublefL){ B=fB; rB=degreeToRadian(fB); L=fL; rL=degreeToRadian(fL); Bsecond=B*3600;//初始化大地经度L,大地纬度B,Bsecond,按弧度的大地纬度rB n=(int)(L/6+1);//初始化带号n L0=6*n-3;//中央经线经度,角度单位 LDot=L-L0;//经度差 LDotSecond=LDot*3600; l=(LDot)*3600/rouSecond;//计算参数l N=6399698.902-(21562.267-(108.973-0.612*cos(rB)*cos(rB))*cos(rB)*cos(rB))*cos(rB)*cos(rB);//计算参数N a0=32140.404-(135.3302-(0.7092-0.004*cos(rB)*cos(rB))*cos(rB)*cos(rB))*cos(rB)*cos(rB);//计算参数a0 a4=(0.25+0.00252*cos(rB)*cos(rB))*cos(rB)*cos(rB)-0.04166;//计算参数a4 a6=(0.166*cos(rB)*cos(rB)-0.084)*cos(rB)*cos(rB);//计算参数a6 a3=(0.3333333+0.001123*cos(rB)*cos(rB))*cos(rB)*cos(rB)-0.1666667;//计算参数a3 a5=0.0083-(0.1667-(0.1968+0.004*cos(rB)*cos(rB))*cos(rB)*cos(rB))*cos(rB)*cos(rB);//计算参数a5 x=6367558.4969*Bsecond/rouSecond-(a0-(0.5+(a4+a6*l*l)*l*l)*l*l*N)*sin(rB)*cos(rB);//正算x y=(1+(a3+a5*l*l)*l*l)*l*N*cos(rB);//正算y X=x; Y=n*1000000+y+500000;//国家统一坐标 } Zhengsuan: : ~Zhengsuan() { } doubleZhengsuan: : getX(){ returnX; } doubleZhengsuan: : getY(){ returnY; } voidZhengsuan: : printLocation(){ printf("正算得国家统一坐标为: X=%8.8fY=%8.8f\n",X,Y); } doubleZhengsuan: : getrB(){ returnrB; } doubleZhengsuan: : getrL(){ returnrL; } ///反算类 Fansuan.h //Fansuan.h: interfacefortheFansuanclass. // ////////////////////////////////////////////////////////////////////// #if! defined(AFX_FANSUAN_H__5B5E4668_EE81_463F_8D65_FFE2AEACE745__INCLUDED_) #defineAFX_FANSUAN_H__5B5E4668_EE81_463F_8D65_FFE2AEACE745__INCLUDED_ #if_MSC_VER>1000 #pragmaonce #endif//_MSC_VER>1000 #definerouSecond206264.806247096355 #include #include"MyFunction.h" #include usingnamespacestd; classFansuan { public: Fansuan(); Fansuan(doubleX,doubleY); doublegetB(); doublegetL(); voidprintLocation(); virtual~Fansuan(); private: doublex; doubley;//高斯投影坐标 doubleX; doubleY; intN;//国家统一坐标,N为带号 doubleB,Bsecond; doubleL;//最后反算得到B、L doubleL0;//中央经线经度 doublel,lsecond;//L=L0+l,L0=6*N-3 doubleBf,BfSecond,BfDegree; doublebeta,betaSecond,betaDegree; doubleZ; doubleNf; doubleb2; doubleb3; doubleb4; doubleb5;//计算的8个参数 }; #endif//! defined(AFX_FANSUAN_H__5B5E4668_EE81_463F_8D65_FFE2AEACE745__INCLUDED_) Fansuan.cpp //Fansuan.cpp: implementationoftheFansuanclass. // ////////////////////////////////////////////////////////////////////// #include"Fansuan.h" ////////////////////////////////////////////////////////////////////// //Construction/Destruction ////////////////////////////////////////////////////////////////////// Fansuan: : Fansuan() { } Fansuan: : Fansuan(doubleX,doubleY){ this->X=X; this->Y=Y;//初始化x,y N=(int)(Y/1000000);//取出带号 L0=6*N-3;//初始化该带号的中央经线经度 x=X; y=Y-1000000*N-500000; beta=x/6367558.4969;//初始化beta,弧度单位 betaSecond=beta*rouSecond;//初始化beta,秒单位 betaDegree=betaSecond/3600;//初始化beta,整度数单位 Bf=beta+(50221746+(293622+(2350+22*cos(beta)*cos(beta))*cos(beta)*cos(beta))*cos(beta)*cos(beta))*(1e-10)*sin(beta)*cos(beta);//初始化Bf,弧度单位 BfSecond=Bf*rouSecond;//初始化Bf,秒单位 BfDegree=BfSecond/3600;//初始化Bf,整度数单位 Nf=6399698.902-(21562.267-(108.973-0.612*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf); Z=y/(Nf*cos(Bf)); b2=(0.5+0.003369*cos(Bf)*cos(Bf))*sin(Bf)*cos(Bf); b4=0.25+(0.16161+0.00562*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf); b3=0.333333-(0.166667-0.001123*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf); b5=0.2-(0.166667-0.0088*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf); Bsecond=BfSecond-(1-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*rouSecond;//计算大地经度B,单位为秒 B=Bsecond/3600;//用整度数表示B lsecond=(1-(b3-b5*Z*Z)*Z*Z)*Z*rouSecond;//计算经度差l,单位为秒 l=lsecond/3600;//用整度数表示l L=L0+l;//计算大地经度L } doubleFansuan: : getB(){ returnB; } doubleFansuan: : getL(){ returnL; } voidFansuan: : printLocation(){ printf("反算得大地坐标为: 大地纬度B=%f°大地经度L=%f°\n",B,L); } Fansuan: : ~Fansuan() { }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 投影 坐标 正反 编程 报告