您好,欢迎来到微智科技网。
搜索
您的当前位置:首页大地坐标系和空间直角坐标系转换

大地坐标系和空间直角坐标系转换

来源:微智科技网
#include

#include

#include

#include

#define MAX 100

#define PI 3.1415926

/////////////////////////////////// struct BLH

{char name1[20];

char name2[20];

double B;

char name3[20];

double L;

结构体存放B,L,H

char name4[20];

double H;

};

/////////////////////////////// struct XYZ

{char name1[20];

char name2[20];

double X;

char name3[20];

double Y;

char name4[20];

double Z;

};

结构体存放X,Y,Z

///////////////////////////////// 文件输入B,L,H

double FILEIN(BLH &b,char *fname)

{

ifstream in(fname,ios::nocreate); // 建立文件流,并与输入文件名建立关联if(!in)

{

cout<cout<<\"--------------------------请手动输入数-------------------------\\n\"<return 0;

}

in>>b.name1;

in>>b.name2;

in>>b.B;

in>>b.name3;

in>>b.L;

in>>b.name4;

in>>b.H;

in.close();

return 1;

}

//////////////////////////////////////////////// 文件输入X,Y,Z

double FILEIN1(XYZ &b,char *fname)

{

ifstream in(fname,ios::nocreate); // 建立文件流,并与输入文件名建立关联

if(!in)

{

cout<cout<<\"-------------------------- -------------------------\\n\"<请手动输入数据

return 0;

}

in>>b.name1;

in>>b.name2;

in>>b.X;

in>>b.name3;

in>>b.Y;

in>>b.name4;

in>>b.Z;

in.close();

return 1;

}

////////////////////////////////////////////////////////

double d_h(double angle) //角度化弧度

{

double a,b;

angle=modf(angle,&a);

angle=modf(angle*100.0,&b);

return (a+b/60.0+angle/36.0)*(PI+3.0E-16)/180.0;

}

///////////////////////////////////////////////////////////

double h_d(double angle) //弧度化角度

{

double a,b,c;

angle=modf(angle*180.0/(PI-3.0E-16),&a);

angle=modf(angle*60.0,&b);

angle=modf(angle*60.0,&c);

return a+b*0.01+c*0.0001+angle*0.0001;

}

/////////////////////////////////////////// jianpan(BLH &a)

{cout<<\"请输入大地坐标B \"<cin>>a.B;

cout<<\"请输入大地坐标L \"<cin>>a.L;

cout<<\"请输入大地坐标H \"<cin>>a.H;

键盘输入B,L,H

}

///////////////////////////////////////// 键盘输入X,Y,Z

jianpan1(XYZ &a)

{

cout<<\"请输入空间直角坐标X \"<cin>>a.X;

cout<<\"请输入空间直角坐标Y \"<cin>>a.Y;

cout<<\"请输入空间直角坐标Z \"<cin>>a.Z;

}

////////////////////////////////////////////////////// 间直角坐标系

double B_X(BLH &a)

大地坐标系换算到空

{double aa[MAX][MAX];

double a1,b1,N,E1,X,Y,Z;

int k,n,m;

char outfilename[20],fname[20];

cout<<\"请选择:\"<cout<<\"2:键盘输入\"<cin>>m;

if(m==1)

{cout<<\"请输入文件名\"<cin>>fname;

if(FILEIN(a,fname));

else

//选择数据输入方式

{if(jianpan(a));

else

{cout<<\"输入有误,程序中止,请重新运行\"<return false;

}

}

}

else if(m==2)

jianpan(a);

else

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

if(a.B<-90||a.B>90)

{cout<<\"输入B有误,程序中止,请重新运行\"<return false;}

if(a.L<0||a.L>360)

{cout<<\"输入L有误,程序中止,请重新运行\"<return false;}

if(a.H<0)

{cout<<\"输入H有误,程序中止,请重新运行\"<return false;}

aa[0][0]=6378245.0000000000; aa[0][1]=6356863.0187730473;

aa[1][0]=6378140.0000000000; aa[1][1]=6356755.2881575287;

aa[2][0]=6378137.0000000000; aa[2][1]=6356752.3142;

aa[3][0]=6378137.000; aa[3][1]=6356752.314;

cout<<\"请选择椭球体\"<cout<<\"0: 克拉索夫斯基椭球体\"<cout<<\"1: 1975年国际椭球体\"<cout<<\"2: WGS-84椭球体\"<cout<<\"3: 2000中国大地坐标系\"<cin>>k;

if(k!=0&&k!=1&&k!=2&&k!=3)

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

cout<a1=aa[k][0];

b1=aa[k][1];

E1=(a1*a1-b1*b1)/(a1*a1);

a.B=d_h(a.B);

a.L=d_h(a.L);

N=a1/sqrt(1-E1*sin(a.B)*sin(a.B));

X=(N+a.H)*cos(a.B)*cos(a.L);

Y=(N+a.H)*cos(a.B)*sin(a.L);

Z=(N*(1-E1)+a.H)*sin(a.B);

cout<<\"转换后的空间直角坐标是:\"<cout<<\"X \"<cout<<\"Y \"<cout<<\"Z \"<cout<<\"要保存数据吗?\"<cout<<\"1:保存\"<cout<<\"2不保存\"<cin>>n;

//屏

if(n==1)

{cout<<\"请输入保存的文件名\"<cin>>outfilename;

ofstream out(outfilename);

out.precision(10);

if(!out) cout<<\"can not open save file!\"<out<<\"空间直角坐标\"<out<<\"X\"<out<out<<\"Y\"<out<out<<\"Z\"<out<out.close();

}

else if(n==2);

else

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

cout<<\" 谢谢您使用龚晓鹏编的程序,所有任务均已完成,欢迎下次使用,祝生活愉快 \"<}

////////////////////////////////////////////////////////

////////////////////////////////////////////////////////// 空间直角坐标系换算到大地坐标系

double X_B(XYZ &a)

{double a1,b1,N,E1,B,L,H,B0,aa[MAX][MAX];

double tanB[MAX][1];

int i=0,n,k,m;

char outfilename[20],fname[20]; //选择数据输入方式

cout<<\"请选择:\"<cout<<\"1:文件输入\"<cout<<\"2:键盘输入\"<cin>>m;

if(m==1)

{cout<<\"请输入文件名\"<cin>>fname;

if(FILEIN1(a,fname));

else

{if(jianpan1(a));

else

{cout<<\"输入有误,程序中止,请重新运行\"<return false;

}

}

}

else if(m==2)

jianpan1(a);

else

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

aa[0][0]=6378245.0000000000; aa[0][1]=6356863.0187730473;

aa[1][0]=6378140.0000000000; aa[1][1]=6356755.2881575287;

aa[2][0]=6378137.0000000000; aa[2][1]=6356752.3142;

aa[3][0]=6378137.000; aa[3][1]=6356752.314;

cout<<\"请选择椭球体\"<cout<<\"0: 克拉索夫斯基椭球体\"<cout<<\"1: 1975年国际椭球体\"<cout<<\"2: WGS-84椭球体\"<cout<<\"3: 2000中国大地坐标系\"<cin>>k;

if(k!=0&&k!=1&&k!=2&&k!=3)

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

a1=aa[k][0];

b1=aa[k][1];

//

E1=(a1*a1-b1*b1)/(a1*a1);

L=atan(a.Y/a.X);

tanB[0][0]=a.Z*(1+E1)/sqrt(a.X*a.X+a.Y*a.Y);

do{B0=atan(tanB[i][0]);

tanB[i+1][0]=(1/sqrt(a.X*a.X+a.Y*a.Y)*(a.Z+a1*E1*tanB[i][0]/sqrt(1+(1-E1)*tanB[i][0]*tanB[i][0])));

B=atan(tanB[i+1][0]);

i++;

}while(B-B0>0.000000000000001);

cout<N=a1/sqrt(1-E1*sin(B)*sin(B));

H=sqrt(a.X*a.X+a.Y*a.Y)/cos(B)-N;

B=h_d(B);

L=h_d(L);

if(a.X<0&&a.Y<0)

L=180+L;

else if(a.X<0&&a.Y>0)

L=180+L;

else if(a.X>0&&a.Y<0)

L=360+L;

cout<<\"转换后的//屏幕输出结果

cout<<\"B \"<cout<<\"L \"<cout<<\"H \"<cout<<\"要保存数据吗?\"<cout<<\"1:保存\"<cout<<\"2不保存\"<大地坐标是:\"<cin>>n;

if(n==1)

{cout<<\"请输入保存的文件名\"<cin>>outfilename;

ofstream out(outfilename);

out.precision(15);

if(!out) cout<<\"can not open save file!\"<out<<\"空间直角坐标\"<out<<\"B\"<out<out<<\"L\"<out<out<<\"H\"<out<out.close();}

else if(n==2);

else

{cout<<\"输入代码有误,程序中止,请重新运行\"<return false;}

cout<<\" 谢谢您使用龚晓鹏编的程序,所有任务均已完成,欢迎下次使用,祝生活愉快 \"<}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////

main()

{cout.precision(15);

int m;

BLH a;

XYZ b;

cout<<\"请选择:\"<cout<<\"1,大地坐标系转换成空间直角坐标系\"<cout<<\"2,空间直角坐标系转换成大地坐标系\"<cin>>m;

if(m==1)

B_X(a);

else if(m==2)

X_B(b);

else cout<<\"输入代码有误,程序中止,请重新运行\";

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务