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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

#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<<"请输入0或1,0:大地坐标系到空间直角坐标系;1:空间直角坐标系到大地坐标系"<

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<<"空间直角坐标系中X,Y,Z,坐标值(国际单位)分别为"<

}

case 1:

{

cout<<"请分别输入空间直角坐标系中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;

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

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<<"大地坐标系中纬度,经度,大地高(国际单位)分别为"<

break;

}

}

}

运行结果

相关文档
最新文档