空间直角坐标系与大地坐标系转换程序

空间直角坐标系与大地坐标系转换程序
空间直角坐标系与大地坐标系转换程序

.

空间直角坐标系与大地坐标系转换程序

#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;

??潣瑵?请分别输入椭球的长半轴、短半轴(国际单位)<

//cin>>a>>b;

a=6378137; //以WGS84为例

b=6356752.3142;

e=sqrt(a*a-b*b)/a;

c=a*a/b;

int x;

潣瑵?请输入0或1,0:大地坐标系到空间直角坐标系;1:空间直角坐标系到大地坐标系<>x;

switch(x)

{

case 0:

{

潣瑵?请分别输入该点大地纬度、经度、大地高(国际单位,纬度经度请按度分秒,分别输入)<

cin>>d1>>f1>>m1>>d2>>f2>>m2>>H;

B=PI*(d1+f1/60+m1/3600)/180;

1 / 4

.

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

潣瑵?空间直角坐标系中X,Y,Z,坐标值(国际单位)分别为

<

<

<

}

case 1:

{

潣瑵?请分别输入空间直角坐标系中X,Y,Z的值(国际单位)<

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;

2 / 4

.

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((X<0)&(Y>0))

//L=atan(Y/X)+PI;

//if((X<0)&(Y<0))

// L=atan(Y/X)+PI;

// if((X>0)&(Y<0))

//L=2*PI-atan(Y/X);

,X); L=atan2(Y 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;

3 / 4

.

Lf=(L-Ld)*60;

Lm=((L-Ld)*60-Lf)*60;

潣瑵?大地坐标系中纬度,经度,大地高(国际单位)分别为<

<

<

break;

}

}

}

运行结果

4 / 4

相关主题
相关文档
最新文档