空间直角坐标系与大地坐标系转换程序
空间直角坐标系与大地坐标系转换程序
#include
#include
#include
using namespace std;
#define PI (2.0*asin(1.0))
void main()
{ double a,b,c,d1,d2,f1,f2,m1,m2,B,L,H,X,Y,Z,W,N,e;
//cout
//cin>>a>>b;
a=6378137; //以WGS84为例
b=6356752.3142;
e=sqrt(a*a-b*b)/a;
c=a*a/b;
int x;
cout
cin>>x;
switch(x)
{
case 0:
{
cout
cin>>d1>>f1>>m1>>d2>>f2>>m2>>H;
B=PI*(d1+f1/60+m1/3600)/180;
L=PI*(d2+f2/60+m2/3600)/180;
W=sqrt(1-e*e*sin(B)*sin(B));
N=a/W;
X=(N+H)*cos(B)*cos(L);
Y=(N+H)*cos(B)*sin(L);
Z=(N*(1-e*e)+H)*sin(B);
cout
}
case 1:
{
cout
cin>>X>>Y>>Z;
double t,m,n, P,k,B0;
m=Z/sqrt(X*X+Y*Y); //t0
B0=atan(m); //初值
n=Z/sqrt(X*X+Y*Y);
P=c*e*e/sqrt(X*X+Y*Y);
k=1+(a*a-b*b)/(b*b);
t=m+P*n/sqrt(k+n*n); //现在为t1,之后代替t2,t3...
B=atan(t);
W=sqrt(1-e*e*sin(B)*sin(B));
N=a/W;
H=Z/sin(B) - N*(1-e*e);
int i;
for(i=1;fabs(B-B0)>10E-10;i++)//每一次新的B与上一次计算的B比较,误差小于10E-10 rad
{B0=B;
n=t;
t=m+P*n/sqrt(k+n*n);//迭代
B=atan(t);
}
W=sqrt(1-e*e*sin(B)*sin(B));
N=a/W;
//if((X0))
//L=atan(Y/X)+PI;
//if((X
// L=atan(Y/X)+PI;
// if((X>0)&(Y
//L=2*PI-atan(Y/X);
L=atan2(Y,X);
H=sqrt(X*X+Y*Y)/cos(B)-N;
int Bd,Bf,Ld,Lf;
double Bm,Lm;
B=180*B/PI;//B转化为度做单位
Bd=B;
Bf=(B-Bd)*60;
Bm=((B-Bd)*60-Bf)*60;
L=180*L/PI;//L转化为度做单位
Ld=L;
Lf=(L-Ld)*60;
Lm=((L-Ld)*60-Lf)*60;
cout
6)
break;
}
}
}
运行结果