高斯投影坐标正反算编程报告.docx

上传人:b****5 文档编号:12052384 上传时间:2023-04-16 格式:DOCX 页数:14 大小:92.02KB
下载 相关 举报
高斯投影坐标正反算编程报告.docx_第1页
第1页 / 共14页
高斯投影坐标正反算编程报告.docx_第2页
第2页 / 共14页
高斯投影坐标正反算编程报告.docx_第3页
第3页 / 共14页
高斯投影坐标正反算编程报告.docx_第4页
第4页 / 共14页
高斯投影坐标正反算编程报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

高斯投影坐标正反算编程报告.docx

《高斯投影坐标正反算编程报告.docx》由会员分享,可在线阅读,更多相关《高斯投影坐标正反算编程报告.docx(14页珍藏版)》请在冰豆网上搜索。

高斯投影坐标正反算编程报告.docx

高斯投影坐标正反算编程报告

高斯投影坐标正反算编程报告

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()

{

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1