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