高斯投影坐标正反算编程报告
1高斯投影坐标正反算编程报告10021 班 张鑫 学号:20103025900401. 编程思想进行高斯投影坐标正反算的编程需要牵涉到大量的公式,为了使程序条理更清楚,各块的数据复用性更强,这里采取了结构化的编程思想。程序由四大块组成。GeodesyHomework.cpp 文件用于存放 main()函数,是整个程序的入口。通过结构化的编程尽力使 main()函数变得简单。MyFunction.h 和 MyFunction.cpp 用于存放计算过程中进行角度弧度换算时所要用到的一些自定的转换函数。Zhengsuan.h 和 Zhengsuan.cpp 用于存放 Zhengsuan 类,在 Zhengsuan 类中声明了高斯投影坐标正算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及正算计算。通过 get 函数获得相应的正算结果。Fansuan.h 和 Fansuan.cpp 用于存放 Fansuan 类,类似于 Zhengsuan 类,Fansuan 类中声明了高斯投影坐标反算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及反算计算。通过 get 函数获得相应的反算结果。2. 计算模型高斯投影正算公式 64256 42322 )861(cosin70 )95(cosiltBN ltBimNlXx 522425 323)818(cos120(slttBltly 高斯投影反算公式 22425 236425 42232868cos1201cs6590720 9ffffff ffffff ffff ffffff tttBNytyl yttMt yttNMtyt 23. 程序框图开始输入 B,L求定带号 N,中央纬度 L0,纬度差 l按照实用公式计算 x,y换算为国家统一坐标 X,Y输出 X,Y输入国家统一坐标 X,Y由 Y 取定带号 N,并换算出 x,y求出中央经线 L0按照实用公式计算 B,lL=L0+l 求出大地经度 L输出 B,L结束正算反算34. 计算结果5. 附录:程序代码/主函数入口GeodesyHomework.cpp#include "MyFunction.h"#include "Zhengsuan.h"#include "Fansuan.h"#include using namespace std;voidfansuan();voidzhengsuan();void main()zhengsuan();fansuan();printf("/n over!");voidzhengsuan()doublemyB,myL;cout>myX>>myY;FansuanmyFansuan1(myX,myY);myFansuan1.printLocation();/自定功能函数库MyFunction.h#define PI 3.1415926#include using namespace std;doubleangleToDegree(intdu,intfen,floatmiao);double angleToDegree();/将度分秒换算为度doubledegreeToRadian(double degree);double degreeToRadian();/将角度换算为弧度MyFunction.cpp#include "MyFunction.h"doubleangleToDegree(intdu,intfen,floatmiao)double result=0;result=miao/3600.0+fen/60.0+du;return result;doubleangleToDegree()intdu,fen;floatmiao;double result;cout>du>>fen>>miao;result=angleToDegree(du,fen,miao);return result;doubledegreeToRadian(double degree)double result=0;5result=degree/57.295779513082321;return result;doubledegreeToRadian()doubleresult,degree;degree=angleToDegree();result=degreeToRadian(degree);return result;/正算类Zhengsuan.h/ Zhengsuan.h: interface for the Zhengsuan class./#if !defined(AFX_ZHENGSUAN_H_2655EA28_E810_44A3_8F14_56421A7B4466_INCLUDED_)#define AFX_ZHENGSUAN_H_2655EA28_E810_44A3_8F14_56421A7B4466_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#define rouSecond 206264.806247096355#include "MyFunction.h"#include #include using namespace std;classZhengsuanpublic:Zhengsuan();Zhengsuan(double fB,doublefL);doublegetX();doublegetY();doublegetrB();doublegetrL();voidprintLocation();virtual Zhengsuan();private:6double x;double y;/大地坐标double X;double Y;/国家统一坐标double B;doublerB;intBsecond;double L;doublerL;/输入的大地纬度 B,大地经度 L,rB,rL 为对应弧度表示值, Bsecond 为换算成秒数值int n;/带号 ndouble L0;/中央经线纬度 L0double LDot;/纬度差 L-L0intLDotSecond;/换算成秒的纬度差double l;double N;double a0;double a3;double a4;double a5;double a6;/七个计算参数;#endif / !defined(AFX_ZHENGSUAN_H_2655EA28_E810_44A3_8F14_56421A7B4466_INCLUDED_)Zhengsuan.cpp/ Zhengsuan.cpp: implementation of the Zhengsuan class./#include "Zhengsuan.h"7/ Construction/Destruction/Zhengsuan:Zhengsuan()Zhengsuan:Zhengsuan(double fB,doublefL)B=fB;rB=degreeToRadian(fB);L=fL;rL=degreeToRadian(fL);Bsecond=B*3600;/初始化大地经度 L,大地纬度 B,Bsecond,按弧度的大地纬度 rBn=(int)(L/6+1);/初始化带号 nL0=6*n-3;/中央经线经度,角度单位LDot=L-L0;/经度差LDotSecond=LDot*3600;l=(LDot)*3600/rouSecond;/计算参数 lN=6399698.902-(21562.267-(108.973-0.612*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB);/计算参数 Na0=32140.404-(135.3302-(0.7092-0.004*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB);/计算参数 a0a4=(0.25+0.00252*cos(rB)*cos(rB)*cos(rB)*cos(rB)-0.04166;/计算参数 a4a6=(0.166*cos(rB)*cos(rB)-0.084)*cos(rB)*cos(rB);/计算参数 a6a3=(0.3333333+0.001123*cos(rB)*cos(rB)*cos(rB)*cos(rB)-0.1666667;/计算参数 a3a5=0.0083-(0.1667-(0.1968+0.004*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB)*cos(rB);/计算参数 a5x=6367558.4969*Bsecond/rouSecond-(a0-(0.5+(a4+a6*l*l)*l*l)*l*l*N)*sin(rB)*cos(rB);/正算 xy=(1+(a3+a5*l*l)*l*l)*l*N*cos(rB);/正算 yX=x;Y=n*1000000+y+500000;/国家统一坐标8Zhengsuan:Zhengsuan()doubleZhengsuan:getX()return X;doubleZhengsuan:getY()return Y;voidZhengsuan:printLocation()printf("正算得国家统一坐标为: X= %8.8f Y=%8.8f n",X,Y);doubleZhengsuan:getrB()returnrB;doubleZhengsuan:getrL()returnrL;/反算类Fansuan.h/ Fansuan.h: interface for the Fansuan class./#if !defined(AFX_FANSUAN_H_5B5E4668_EE81_463F_8D65_FFE2AEACE745_INCLUDED_)#define AFX_FANSUAN_H_5B5E4668_EE81_463F_8D65_FFE2AEACE745_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#define rouSecond 206264.806247096355#include #include "MyFunction.h"9#include using namespace std;classFansuanpublic:Fansuan();Fansuan(double X,double Y);doublegetB();doublegetL();voidprintLocation();virtual