大地坐标与空间直角坐标的转换程序代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "iostream"
#define PI 3.1415926535897323
double a,b,c,e2,ep2;
int main()
{
int m,n,t;
double RAD(double d,double f,double m);
void RBD(double hd);
void BLH_XYZ();
void XYZ_BLH();
void B_ZS();
void B_FS();
void GUS_ZS();
void GUS_FS();
printf(" 大地测量学\n");
sp1:printf("请选择功能:\n");
printf("1.大地坐标系到大地空间直角坐标的转换\n");
printf("2.大地空间直角坐标到大地坐标系的转换\n");
printf("3.贝塞尔大地问题正算\n");
printf("4.贝塞尔大地问题反算\n");
printf("5.高斯投影正算\n");
printf("6.高斯投影反算\n");
printf("0.退出程序\n");
scanf("%d",&m);
if(m==0)exit(0);
sp2:printf("请选择椭球参数(输入椭球序号):\n");
printf("1.克拉索夫斯基椭球参数\n");
printf("2.IUGG_1975椭球参数\n");
printf("3.CGCS_2000椭球参数\n");
printf("0.其他椭球参数(自行输入)\n");
scanf("%d",&n);
switch(n)
{
case
1:a=6378245.0;b=6356863.0188;c=6399698.9018;e2=0.00669342162297;ep2=0.0067385254146 8;break;
case
2:a=6378140.0;b=6356755.2882;c=6399596.6520;e2=0.00669438499959;ep2=0.0067395018194 7;break;
case
3:a=6378137.0;b=6356752.3141;c=6399593.6259;e2=0.00669438002290;ep2=0.0067394967754 7;break;
case 0:{
printf("请输入椭球参数:\n");
printf("长半径a=");scanf("%lf",&a);
printf("短半径b=");scanf("%lf",&b);
c=a*a/b;
ep2=(a*a-b*b)/(b*b);
e2=(a*a-b*b)/(a*a);
break;
}
default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp2 ;
}
while(1)
{
switch(m)
{
case 1:BLH_XYZ();break;
case 2:XYZ_BLH();break;
case 3:B_ZS();break;
case 4:B_FS();break;
case 5:GUS_ZS();break;
case 6:GUS_FS();break;
default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp1 ;
}
printf("是否继续进行此功能计算? \n\n");
printf("(若继续进行此功能计算,则输入1;\n 若选择其他功能进行计算,则输入2;\n 若退出,则输入0. )\n");
scanf("%d",&t);
switch(t)
{
case 1:break;
case 2:goto sp1;
case 0:exit(0);
}
}
}
double RAD(double d,double f,double m)
{
double e;
double sign=(d<0.0)?-1.0:1.0;
if(d==0)
{
sign=(f<0.0)?-1.0:1.0;
if(f==0)
{
sign=(m<0.0)?-1.0:1.0;
}
}
if(d<0)
d=d*(-1.0);
if(f<0)
f=f*(-1.0);
if(m<0)
m=m*(-1.0);
e=sign*(d*3600+f*60+m)*PI/(3600*180);
return e;
}
void RBD(double hd)
{
int t;
int d,f;
double m;
double sign=(hd<0.0)?-1.0:1.0;
if(hd<0)
hd=fabs(hd);
hd=hd*3600*180/PI;
t=int(hd/3600);
d=sign*t;
hd=hd-t*3600;
f=int(hd/60);
m=hd-f*60;
printf("%d'%d'%lf'\n",d,f,m);
}
void BLH_XYZ()
{
double B,L,H,N,W;
double d,f,m;
double X,Y,Z;
printf(" 请输入大地坐标(输入格式为角度(例如:30'40'50')):\n");