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

合集下载

大地坐标转空间直角坐标方法

大地坐标转空间直角坐标方法

大地坐标转空间直角坐标方法1.准备工作:在进行大地坐标转换之前,首先要明确所采用的基准椭球参数,并且将大地坐标系转换为所采用的基准椭球上的坐标。

通常采用的基准椭球有WGS84、北京54和CGCS2000等。

这些基准椭球都有自己的参数,如长半轴a、偏心率e等。

根据所采用的基准椭球的参数,可以计算出该基准椭球的第一偏心率的平方(e^2)和扁率(f)等重要参数。

2.大地坐标转换为大地球面坐标:大地坐标的表示方法通常为经纬度(经度、纬度和高程)。

将经度和纬度转换为弧度形式,通过正弦定理和余弦定理等基本几何关系,可以计算出大地坐标在基准椭球上的投影参数。

利用这些参数,可以将大地坐标转换为大地球面坐标。

3.大地球面坐标转换为空间直角坐标:大地球面坐标是指基于基准椭球的坐标系,它只考虑地球的曲率而不考虑地球的引力场。

为了将其转换为直角坐标系,需要引入地球的引力场因素。

一种常见的方法是采用摄动参数法。

摄动参数法是通过导引纬度和经度等参数,计算出地球的重力梯度和坐标变换矩阵,并利用这些参数将大地球面坐标转换为空间直角坐标。

4.空间直角坐标的后处理:在将大地坐标转换为空间直角坐标之后,还需要进行一些后处理工作,以满足具体应用的要求。

例如,需要确定一个局部坐标系的原点和方向,进行坐标轴旋转和缩放等操作。

这些后处理工作可以在计算中进行,也可以在实际应用中进行。

总结起来,大地坐标到空间直角坐标的转换过程包括准备工作、大地坐标转大地球面坐标和大地球面坐标转空间直角坐标三个步骤。

在每个步骤中,需要根据具体问题选择合适的算法和参数。

同时,还需要注意坐标系之间的转换精度和误差控制,以确保转换结果的准确性。

坐标转换中的大地坐标系与空间直角坐标系转换公式

坐标转换中的大地坐标系与空间直角坐标系转换公式

坐标转换中的大地坐标系与空间直角坐标系转换公式在测量与地理信息领域,坐标转换是一个非常重要的概念。

它涉及将不同坐标系下的位置互相转换,使得地理空间信息能够得到准确而一致地表达。

而在坐标转换的过程中,大地坐标系与空间直角坐标系的相互转换公式则是至关重要的工具。

大地坐标系是一种常用的坐标系,在地理测量和导航等领域广泛应用。

它采用了经纬度和大地高作为坐标参数,可以精确地描述地球上任意一点的位置。

经度表示东西方向上的位置,纬度表示南北方向上的位置,而大地高则表示相对于海平面的高度。

在大地坐标系下,地球被近似看作一个椭球体,因此大地坐标系也被称为椭球坐标系。

然而,由于大地坐标系的曲线性质,它并不适合直接参与复杂三维计算,尤其是在工程测量中需要使用的情况。

因此,我们需要将大地坐标系转换为空间直角坐标系,以便进行进一步的计算和分析。

空间直角坐标系采用了直角坐标的表示方式,其坐标参数分别为X、Y、Z,可以方便地进行几何运算。

在进行坐标转换时,我们需要采用适当的公式来实现大地坐标系到空间直角坐标系的转换。

下面将介绍两种常用的转换公式。

1. 大地坐标系到空间直角坐标系的转换公式大地坐标系到空间直角坐标系的转换公式可以通过三个连续的旋转和平移变换来实现。

具体而言,我们首先将大地坐标系的原点O与空间直角坐标系原点重合,然后进行三次坐标轴的旋转,使得大地坐标系的纬度线与空间直角坐标系的Z轴重合。

接着,我们对大地坐标系进行一个小角度的旋转,使得大地纬线与空间直角坐标系的Y轴重合。

最后,再进行一个小角度的旋转,将大地经线与空间直角坐标系的X轴重合。

通过以上步骤,即可完成大地坐标系到空间直角坐标系的转换。

2. 空间直角坐标系到大地坐标系的转换公式与大地坐标系到空间直角坐标系的转换相反,空间直角坐标系到大地坐标系的转换需要进行三次逆变换。

即首先将空间直角坐标系的原点与大地坐标系原点重合,然后进行三次逆变换,回到大地坐标系。

为了实现空间直角坐标系到大地坐标系的转换,我们需要利用解析几何的知识。

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

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

空间直角坐标系与大地坐标系转换程序.doc本文将介绍一种实现空间直角坐标系与大地坐标系转换的程序实现方法。

在编写程序时,需要使用一些数学库和函数,比如C++标准库中的cmath和iostream 等。

首先,我们需要了解空间直角坐标系和大明坐标系之间的转换公式。

假设空间直角坐标系为(x, y, z),大地坐标系为(L, B, H),则它们之间的转换公式为:x = cosLcosBsinHy = cosLsinBsinHz = sinLsinH其中,L为经度,B为纬度,H为高程。

根据上述公式,我们可以编写一个C++程序来实现空间直角坐标系与大地坐标系之间的转换。

程序实现如下:#include <iostream>#include <cmath>using namespace std;void transform() {double x, y, z;double L, B, H;cout << "Enter x, y, and z coordinates: ";cin >> x >> y >> z;cout << "Enter L and B coordinates: ";cin >> L >> B;H = acos(z / sqrt(x * x + y * y + z * z));cout << "The converted coordinates are: " << x << " " << y << " " << H << endl;}int main() {transform();return 0;}在上述程序中,我们首先定义了变量x、y、z、L、B和H,分别代表空间直角坐标系和大明坐标系的坐标值。

空间直角坐标系与空间大地坐标系的相互转换及其C++源程序

空间直角坐标系与空间大地坐标系的相互转换及其C++源程序

空间直角坐标系与空间大地坐标系的相互转换1.空间直角坐标系/笛卡尔坐标系坐标轴相互正交的坐标系被称作笛卡尔坐标系。

三维笛卡尔坐标系也被称为空间直角坐标系。

在空间直角坐标系下,点的坐标可以用该点所对应的矢径在三个坐标轴上的投影长度来表示,只有确定了原地、三个坐标轴的指向和尺度,就定义了一个在三维空间描述点的位置的空间直角坐标系。

以椭球体中心O为原点,起始子午面与赤道面交线为X轴,在赤道面上与X轴正交的方向为Y轴,椭球体的旋转轴为Z轴构成右手坐标系O.XYZ,在该坐标系中,P点的位置用X,Y,Z表示。

在测量应用中,常将地球空间直角坐标系的坐标原点选在地球质心(地心坐标系)或参考椭球中心(参心坐标系),z轴指向地球北极,x轴指向起始子午面与地球赤道的交点,y轴垂直于XOZ面并构成右手坐标系。

空间直角坐标系2.空间大地坐标系由于空间直角坐标无法明确反映出点与地球之间的空间关系,为了解决这一问题,在测量中引入了大地基准,并据此定义了大地坐标系。

大地基准指的是用于定义地球参考椭球的一系列参数,包括如下常量:2.1椭球的大小和形状2.2椭球的短半轴的指向:通常与地球的平自转轴平息。

2.3椭球中心的位置:根据需要确定。

若为地心椭球,则其中心位于地球质心。

2.4本初子午线:通过固定平极和经度原点的天文子午线,通常为格林尼治子午线。

以大地基准为基础建立的坐标系被称为大地坐标系。

由于大地基准又以参考椭球为基准,因此,大地坐标系又被称为椭球坐标系。

大地坐标系是参心坐标系,其坐标原点位于参考椭球中心,以参考椭球面为基准面,用大地经度L、纬度B 和大地高H表示地面点位置。

过地面点P的子午面与起始子午面间的夹角叫P 点的大地经度。

由起始子午面起算,向东为正,叫东经(0°~180°),向西为负,叫西经(0°~-180°)。

过P点的椭球法线与赤道面的夹角叫P点的大地纬度。

由赤道面起算,向北为正,叫北纬(0°~90°),向南为负,叫南纬(0°~-90°)。

大地坐标与空间直角坐标的转换程序代码

大地坐标与空间直角坐标的转换程序代码

#include "stdio、h"#include "math、h"#include "stdlib、h"#include "iostream"#define PI 3、14323double 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、297;ep2=0、468;break;case 2:a=6378140、0;b=6356755、2882;c=6399596、6520;e2=0、959;ep2=0、947;break;case 3:a=6378137、0;b=6356752、3141;c=6399593、6259;e2=0、290;ep2=0、547;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");printf(" 大地经度L=");scanf("%lf'%lf'%lf'",&d,&f,&m);L=RAD(d,f,m);printf(" 大地纬度B=");scanf("%lf'%lf'%lf'",&d,&f,&m);B=RAD(d,f,m);printf(" 大地高H=");scanf("%lf",&H);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*sin(L);Z=(N*(1-e2)+H)*sin(B);printf("\n\n 转换后得到大地空间直角坐标为:\n\n");printf("X=%lf\nY=%lf\nZ=%lf\n\n",X,Y,Z);}void XYZ_BLH(){double B,L,H,N,W;double X,Y,Z;double tgB0,tgB1;printf(" 请输入大地空间直角坐标:\n");printf(" X=");scanf("%lf",&X);printf(" Y=");scanf("%lf",&Y);printf(" Z=");scanf("%lf",&Z);printf("\n\n 转换后得到大地坐标为:\n\n");L=atan(Y/X);printf(" 大地经度为: L=");RBD(L);printf("\n");tgB0=Z/sqrt(X*X+Y*Y);tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));while(fabs(tgB0-tgB1)>5*pow(10,-10)){tgB0=tgB1;tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));}B=atan(tgB1);printf(" 大地纬度为:B=");RBD(B);printf("\n");W=sqrt(1-e2*sin(B)*sin(B));N=a/W;H=sqrt(X*X+Y*Y)/cos(B)-N;printf(" 大地高为:H=%lf\n\n",H);}void B_ZS(){double L1,B1,A1,s,d,f,mi;double u1,u2,m,M,k2,alfa,bt,r,kp2,alfap,btp,rp;double sgm0,sgm1,lmd,lmd1,lmd2,A2,B2,l,L2;printf("请输入已知点的大地坐标(输入格式为角度(例如:30'40'50'),下同):\nL1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);L1=RAD(d,f,mi);printf("\nB1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);B1=RAD(d,f,mi);printf("请输入大地方位角:\nA1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);A1=RAD(d,f,mi);printf("请输入该点至另一点的大地线长:\ns=");scanf("%lf",&s);u1=atan(sqrt(1-e2)*tan(B1));m=asin(cos(u1)*sin(A1));M=atan(tan(u1)/cos(A1));m=(m>0)?m:m+2*PI;M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;sgm0=alfa*s;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0); while(fabs(sgm0-sgm1)>2、8*PI/180*pow(10,-7)){sgm0=sgm1;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0); }sgm0=sgm1;A2=atan(tan(m)/cos(M+sgm0));A2=(A2>0)?A2:A2+PI;A2=(A1>PI)?A2:A2+PI;u2=atan(-cos(A2)*tan(M+sgm0));lmd1=atan(sin(u1)*tan(A1));lmd1=(lmd1>0)?lmd1:lmd1+PI;lmd1=(m<PI)?lmd1:lmd1+PI;lmd2=atan(sin(u2)*tan(A2));lmd2=(lmd2>0)?lmd2:lmd2+PI;lmd2=(m<PI)?(((M+sgm0)<PI)?lmd2:lmd2+PI):(((M+sgm0)>PI)?lmd2:lmd2+PI);lmd=lmd2-lmd1;B2=atan(sqrt(1+ep2)*tan(u2));kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;l=lmd-sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos(2*M+sgm0)+rp*sin(2*sgm0)*cos(4*M+2*sg m0));L2=L1+l;printf("\n\n得到另一点的大地坐标与大地线在该点的大地方位角为:\n\n");printf("L2=");RBD(L2);printf("\n");printf("B2=");RBD(B2);printf("\n");printf("A2=");RBD(A2);printf("\n");}void B_FS(){double L1,B1,L2,B2,s,A1,A2,du,f,mi,m0,m,M;double l,u1,u2,alfa,bt,r,lmd0,dit_lmd,lmd,sgm,dit_sgm,sgm0,sgm1,alfap,btp,rp,k2,kp2;printf("请输入第一个点大地坐标(输入格式为角度(例如:30'40'50'),下同):\n大地经度L1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L1=RAD(du,f,mi);printf("大地纬度B1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B1=RAD(du,f,mi);printf("\n请输入第二个点大地坐标:\n大地经度:L2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L2=RAD(du,f,mi);printf("大地纬度:B2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B2=RAD(du,f,mi);l=L2-L1;u1=atan(sqrt(1-e2)*tan(B1));u2=atan(sqrt(1-e2)*tan(B2));sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));m0=asin(cos(u1)*cos(u2)*sin(l)/sin(sgm0));dit_lmd=0、003351831*sgm0*sin(m0);lmd0=l+dit_lmd;dit_sgm=sin(m0)*dit_lmd;sgm1=sgm0+dit_sgm;m=asin(cos(u1)*cos(u2)*sin(lmd0)/sin(sgm1));A1=atan(sin(lmd0)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd0)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;M=atan(sin(u1)*tan(A1)/sin(m));M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));while(fabs(sgm0-sgm1)>1*PI/180*pow(10,-8)){sgm0=sgm1;sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));}sgm=sgm1;lmd=l+sin(m)*(alfap*sgm+btp*sin(sgm)*cos(2*M+sgm));s=(sgm-bt*sin(sgm)*cos(2*M+sgm)-r*sin(2*sgm)*cos(4*M+2*sgm))/alfa;A1=atan(sin(lmd)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;A2=atan(sin(lmd)/(sin(u2)*cos(lmd)-tan(u1)*cos(u2)));A2=(A2>0)?A2:A2+PI;A2=(m<0)?A2:A2+PI;printf("\n\n得到两点间大地线长S与大地正反方位角A1、A2如下:\n\n");printf("s=%lf\n",s);printf("A1=");RBD(A1);printf("\n");printf("A2=");RBD(A2);printf("\n");}void GUS_ZS(){double B,L,x3,x6,y3,y6,Y3,Y6,du,f,mi,X,N,n,t;double At,Bt,Ct,Dt,m3,m6,l3,l6,W,L03,L06;int DH3,DH6;printf("请输入大地坐标(输入格式为角度(例如:30'40'50')):\n大地经度L=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L=RAD(du,f,mi);printf("\n大地纬度B=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B=RAD(du,f,mi);At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;X=a*(1-e2)*(At*B-Bt*sin(2*B)/2+Ct*sin(4*B)/4-Dt*sin(6*B)/6);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;n=sqrt(ep2)*cos(B);t=tan(B);DH3=(L-(1、5*PI/180))/(3*PI/180)+1;DH6=L/(6*PI/180)+1;L03=DH3*(3*PI/180);L06=DH6*(6*PI/180)-(3*PI/180);l3=L-L03;l6=L-L06;m3=cos(B)*l3;m6=cos(B)*l6;x3=X+N*t*(m3*m3/2+(5-t*t+9*n*n+4*n*n*n*n)*m3*m3*m3*m3/24+(61-58*t*t+t*t*t*t)* m3*m3*m3*m3*m3*m3/720);x6=X+N*t*(m6*m6/2+(5-t*t+9*n*n+4*n*n*n*n)*m6*m6*m6*m6/24+(61-58*t*t+t*t*t*t)* m6*m6*m6*m6*m6*m6/720);y3=N*(m3+(1-t*t+n*n)*m3*m3*m3/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m3*m3*m3 *m3*m3/120);y6=N*(m6+(1-t*t+n*n)*m6*m6*m6/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m6*m6*m6 *m6*m6/120);Y3=DH3*1000000+500000+y3;Y6=DH6*1000000+500000+y6;printf("\n\n 得到的高斯平面坐标为:\n\n");printf(" 对于3度带:\n 纵坐标x=%、3lf\n 横坐标y=%、3lf(通用坐标Y=%、3lf)\n\n",x3,y3,Y3);printf(" 对于6度带:\n 纵坐标x=%、3lf\n 横坐标y=%、3lf(通用坐标Y=%、3lf)\n\n",x6,y6,Y6);}void GUS_FS(){double x,y,Y,B,B0,B1,Bf,Vf,tf,Nf,nf,L,At,Bt,Ct,Dt,L3,L6;long DH;printf(" 请输入高斯平面坐标:\n\n");printf(" 纵坐标X=");scanf("%lf",&x);printf("\n");printf(" 自然坐标y=");scanf("%lf",&y);printf("\n");printf(" 通用坐标Y=");scanf("%lf",&Y);printf("\n");At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;B0=x/(a*(1-e2)*At);B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);while(fabs(B1-B0)>1*pow(10,-8)){B0=B1;B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);}Bf=B1;nf=sqrt(ep2)*cos(Bf);tf=tan(Bf);Vf=sqrt(1+ep2*cos(Bf)*cos(Bf));Nf=c/Vf;B=Bf-Vf*Vf*tf/2*((y/Nf)*(y/Nf)-(5+3*tf*tf+nf*nf-9*nf*nf*tf*tf)*pow((y/Nf),4)/12+(61+90*tf *tf+45*tf*tf)*pow((y/Nf),6)/360);L=((y/Nf)-(1+2*tf*tf+nf*nf)*(y/Nf)*(y/Nf)*(y/Nf)/6+(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf *nf*tf*tf)*pow((y/Nf),5)/120)/cos(Bf);DH=Y/1000000;L3=3*PI/180*double(DH)+L;L6=6*PI/180*double(DH)-3*PI/180+L;printf("\n\n 得到的大地坐标为:\n\n");printf(" 大地纬度B=");RBD(B);printf("\n");printf(" 若为6度带,大地经度L=");RBD(L6);printf("\n");printf(" 若为3度带,大地经度L=");RBD(L3);printf("\n"); }。

大地坐标转空间直角坐标方法

大地坐标转空间直角坐标方法

大地坐标转空间直角坐标方法大地坐标(经纬度)是地球表面上用于描述位置的一种坐标系统,常用的表示方式是用经度和纬度来表示一个位置。

而空间直角坐标是一种三维坐标系统,它由东西、南北和垂直地面三个方向组成。

大地坐标转换为空间直角坐标的方法分为两步:首先将大地坐标转换为大地平面坐标系坐标,然后再将大地平面坐标转换为空间直角坐标。

第一步,将大地坐标转换为大地平面坐标系坐标,常用的方法有三角形式法和高斯投影法。

1.三角形式法:三角形式法是根据大地三角形的性质,通过计算大地纬度和经度的变化量,将大地坐标转换为大地平面坐标。

具体步骤如下:(1)选取一个参考点,确定该点的大地坐标和大地平面坐标。

(2)计算待转换点的纬度和经度的变化量,即ΔB和ΔL。

(3)根据大地坐标的定义,计算待转换点的大地平面坐标,即X和Y。

2.高斯投影法:高斯投影法是一种常用的大地平面坐标投影方法,它是根据高斯球面正轴投影的原理,通过计算大地纬度和经度的变化量,将大地坐标转换为大地平面坐标。

具体步骤如下:(1)确定投影中央经线,选择一个参考点,确定该点的大地坐标和大地平面坐标。

(2)计算待转换点的纬度和经度的变化量,即ΔB和ΔL。

(3)根据高斯投影的计算公式,计算待转换点的大地平面坐标,即X和Y。

第二步,将大地平面坐标转换为空间直角坐标,常用的方法有高斯变换法和椭球投影法。

1.高斯变换法:高斯变换法是将大地平面坐标通过高斯投影法计算得到的坐标转换为空间直角坐标。

具体步骤如下:(1)选择一个参考点,确定参考点的大地平面坐标和空间直角坐标。

(2)计算待转换点的大地平面坐标与参考点的大地平面坐标之差,即ΔX和ΔY。

(3)根据高斯变换的计算公式,计算待转换点的空间直角坐标,即X、Y和Z。

2.椭球投影法:椭球投影法是将大地平面坐标通过椭球投影的原理,将大地平面坐标转换为空间直角坐标。

具体步骤如下:(1)选择一个参考点,确定参考点的大地平面坐标和空间直角坐标。

大地坐标系与空间直角坐标系的相互转换python

大地坐标系与空间直角坐标系的相互转换python

大地坐标系与空间直角坐标系的相互转换Python在地理信息系统(GIS)中,常常需要将大地坐标系(地理坐标系)与空间直角坐标系(笛卡尔坐标系)进行相互转换。

大地坐标系使用经纬度来表示地球表面上的任意点,而空间直角坐标系使用直角坐标来表示点在三维空间中的位置。

Python提供了一些库和工具,可以方便地进行这种转换。

大地坐标系与空间直角坐标系的基本概念大地坐标系(地理坐标系)大地坐标系是一种用经纬度来表示地球表面上任意点的坐标系。

经度表示点相对于本初子午线的位置(东经为正、西经为负),纬度表示点相对于赤道的位置(北纬为正、南纬为负)。

空间直角坐标系(笛卡尔坐标系)空间直角坐标系是一种使用直角坐标来表示点在三维空间中的位置的坐标系。

在空间直角坐标系中,每个点的位置由其相对于三个互相垂直的坐标轴的坐标值确定。

大地坐标系与空间直角坐标系的转换大地坐标系与空间直角坐标系之间的转换涉及到各种地球椭球参数和数学公式。

幸运的是,Python的一些库和工具已经实现了这些转换,使得我们可以很方便地进行转换操作。

Geopy库Geopy是一个Python库,提供了许多地理坐标系之间相互转换的功能。

使用Geopy,我们可以方便地进行大地坐标系到空间直角坐标系的转换。

首先,我们需要安装Geopy库。

可以使用pip命令来进行安装:pip install geopy接着,我们可以使用以下代码将大地坐标系的经纬度转换为空间直角坐标系的三维坐标:```python from geopy import Point from geopy.distance import distance定义大地坐标系的经纬度latitude = 40.7128 longitude = -74.0060将经纬度转换为空间直角坐标系的三维坐标point = Point(latitude, longitude) x, y, z = point.to_cartesian() print(f。

大地坐标与空间直角坐标转换

大地坐标与空间直角坐标转换

大地坐标与空间直角坐标转换在地理空间相关的领域中,大地坐标和空间直角坐标是两种常用的坐标系统。

大地坐标通常用经度和纬度表示,是为了描述地球表面上的点的位置而设计的坐标系统;而空间直角坐标则是一种常用的三维笛卡尔坐标系,用来描述平面内的点的位置。

在实际应用中,有时候我们需要将一个点从大地坐标系转换到空间直角坐标系,或者反过来进行转换,这就需要进行一定的坐标转换计算。

大地坐标的表示大地坐标通常是以经度(Longitude)和纬度(Latitude)表示的。

经度表示东西方向,是一个0到360度的值,通常以东经为正值,西经为负值。

纬度表示南北方向,是一个-90到90度的值,赤道为0度,南纬为负值,北纬为正值。

空间直角坐标的表示空间直角坐标是以直角坐标系表示的,通常是三维笛卡尔坐标系,包括X、Y和Z三个坐标轴。

X轴和Y轴在平面内垂直,Z轴垂直于平面,组成一个右手坐标系。

一个点在空间直角坐标系中的位置可以由其X、Y和Z坐标值表示。

大地坐标与空间直角坐标的转换大地坐标和空间直角坐标之间的转换涉及到地球的椭球面和大地水准面的关系,通常需要考虑椭球体参数、大地水准面的高度等因素。

实际转换过程中可能涉及到大圆距离、球面三角计算等复杂的数学运算。

结论大地坐标与空间直角坐标之间的转换是地理信息处理中一个重要的问题,通常需要借助专业的地理信息系统软件或者编程语言进行计算。

在进行坐标转换时,需要考虑到地球的椭球体特征以及大地水准面的高度影响,以确保转换的准确性。

对于从事地理测绘、地图制作、地理信息系统等领域的人员,熟练掌握大地坐标与空间直角坐标之间的转换方法是非常重要的。

以上就是关于大地坐标与空间直角坐标转换的一些内容,希望对您有所帮助。

测绘程序设计结业考核报告大地坐标和大地空间直角坐标的互换

测绘程序设计结业考核报告大地坐标和大地空间直角坐标的互换

测绘程序设计结业考核报告大地坐标和大地空间直角坐标的互换学生姓名班级成绩指导教师(签字)地质与测绘学院测绘工程系年月日一、目的和意义坐标转换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。

通过建立两个坐标系统之间一一对应关系来实现。

是各种比例尺地图测量和编绘中建立地图数学基础必不可少的步骤。

在实际应用中必须变换到国家统一坐标系或地方独立坐标系上来。

因此, 这种坐标转换具有很大的现实意义, 使各种测量工作得到实时、快捷的同时得到坐标系统的统一。

二、原理和过程本程序数以大地坐标和大地空间直角坐标的相互换为内容展开的,其中包括了大地坐标系转化为大地空间直角坐标系,大地空间直角坐标系转化为大地坐标系,参数设置,打开文件,保存文件等功能。

界面清晰,简洁,易懂,可视化好。

(一)原理空间直角坐标系的坐标系原点位于参考椭球的中心,Z 轴指向参考椭球的北极,X,Y 轴位于赤道面上且按右手系与X 轴呈90°夹角。

某点在空间中的坐标可轴指向起始子午面与赤道的交点用该点在此坐标系的各个坐标轴上的投影来表示。

空间直角坐标系可用图所示:空间大地坐标系是采用大地经、纬度和大地高来描述空间位置的。

纬度是空间的点与参考椭球面的法线与赤道面的夹角;经度是空间中的点与参考椭球的自转轴所在的面与参考椭球的起始子午面的夹角;大地高是空间点沿参考椭球的法线方向到参考椭球面的距离。

空间大地坐标系可用所示:大地空间直角坐标系大地坐标系空间直角坐标系与空间大地坐标系间的转换,图表示了空间直角坐标系与空间大地坐标系之间的关系:地球空间直角坐标系与大地坐标系在相同的基准下空间大地坐标系向空间直角坐标系的转换公式为:⎪⎭⎪⎬⎫+-=+=+=B H e N Z L B H N Y L B H N X sin ])1([sin cos )(cos cos )(2 (2-1) 式中, WaN =,a 为椭球的长半轴,N 为椭球的卯酉圈曲率半径 a =6378.137km b =6356.7523141km B e W 22sin 1-=2222a b a e -=,e 为椭球的第一偏心率,b 为椭球的短半轴在相同的基准下空间直角坐标系向空间大地坐标系的转换公式为⎪⎪⎪⎪⎭⎪⎪⎪⎪⎬⎫-Φ=⎪⎭⎫⎝⎛=⎥⎦⎤⎢⎣⎡⎪⎪⎭⎫ ⎝⎛+Φ=N B R H X Y arctg L W B Z ae tg arctg B cos cos sin 12 (2-2)式中 ⎥⎦⎤⎢⎣⎡+=Φ22YX Zarctg 222Z Y X R ++=(二)过程由源坐标类型转化为目标坐标类型,根据所选的椭球基准(椭球七参数),再计算出所需的参数,而后根据原理中的转换公式计算出所要求得的目标坐标的未知量。

空间大地坐标系的转换

空间大地坐标系的转换
相邻三点构成三角形的方法可以应用计算机制图软件
实现,应用中应注意的是,所有用于计算机的公共点 事先必须经过筛选,即先进行所有公共点的坐标转换, 剔除误差大的公共点。
其他转换方法
用约束平差法进行坐标转换
用GPS定位测量方法建立大地控制网时,对于GPS基
线向量进行约束平差时,如果将已知点的坐标固定为 转换后的坐标,并将坐标转换参数作为未知数与平差 中的坐标改正数未知数一起进行平差计算,则通过约 束平差,使可以得到坐标转换参数和所有GPS点的转 换后的坐标。
七参数
实际应用中,当公共点较多时,因为公共点的已知坐
标与测量的新坐标不可避免的含有误差。影响精度。 这时可以先选择部分已知公共点求解转换参数,转换 后的公共点的坐标与已知坐标比较,差异大的公共点 剔除不再作为公共点,选择差异小的公共点再求解转 换参数,这样进行坐标转换后,转换后的公共点的坐 标差异会减至最小。当公共点较多时,还可以增加转 换参数的个数。
大地坐标系的转换
大地坐标微分公式
大地坐标系的转换
广义坐标微分公式
大地坐标系的转换
利用空间直角坐标作介质进行不同大地坐标系的转换流程
大地坐标系的转换
不同二维大地坐标系的转换
其他转换方法
三角形法简介
三角形法是利用相邻的三个公共点组成的三角形,按
三个公共点求取转换参数,然后用求出的参数进行该 三角形内的坐标点的坐标转换。
坐标轴互不平行时,坐标系间除了三个平移 参数外,还有三个欧勒角,考虑到两个坐标 系的尺度不一样,再设一个尺度参数m,总 共七个参数。 用七参数进行空间直角坐标转换有布尔莎 公式,莫洛琴斯基公式和范氏公式等。下面 给出布尔莎七参数公式
七参数

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

大地坐标系和空间直角坐标系转换
double FILEIN1(XYZ &b,char *fname)
{
ifstream in(fname,ios::nocreate); //建立文件流,并与输入文件名建立关联
if(!in)
{
cout<<fname<<" error: file does not exist! "<<endl;
cout<<"--------------------------请手动输入数据-------------------------\n"<<endl;
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])));
Z=(N*(1-E1)+a.H)*sin(a.B);
cout<<"转换后的空间直角坐标是:"<<endl; //屏幕输出结果
cout<<"X "<<X<<endl;
cout<<"Y "<<Y<<endl;
cout<<"Z "<<Z<<endl;

大地坐标与空间直角坐标的转换程序代码

大地坐标与空间直角坐标的转换程序代码

#include "stdio.h"#include "math.h"#include "stdlib.h"#include "iostream"#define PI 3.1415926535897323double 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){case1:a=6378245.0;b=6356863.0188;c=6399698.9018;e2=0.00669342162297;ep2=0.0067385254146 8;break;case2:a=6378140.0;b=6356755.2882;c=6399596.6520;e2=0.00669438499959;ep2=0.0067395018194 7;break;case3: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");printf(" 大地经度L=");scanf("%lf'%lf'%lf'",&d,&f,&m);L=RAD(d,f,m);printf(" 大地纬度B=");scanf("%lf'%lf'%lf'",&d,&f,&m);B=RAD(d,f,m);printf(" 大地高H=");scanf("%lf",&H);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*sin(L);Z=(N*(1-e2)+H)*sin(B);printf("\n\n 转换后得到大地空间直角坐标为:\n\n");printf("X=%lf\nY=%lf\nZ=%lf\n\n",X,Y,Z);}void XYZ_BLH(){double B,L,H,N,W;double X,Y,Z;double tgB0,tgB1;printf(" 请输入大地空间直角坐标:\n");printf(" X=");scanf("%lf",&X);printf(" Y=");scanf("%lf",&Y);printf(" Z=");scanf("%lf",&Z);printf("\n\n 转换后得到大地坐标为:\n\n");L=atan(Y/X);printf(" 大地经度为:L=");RBD(L);printf("\n");tgB0=Z/sqrt(X*X+Y*Y);tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));while(fabs(tgB0-tgB1)>5*pow(10,-10)){tgB0=tgB1;tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));}B=atan(tgB1);printf(" 大地纬度为:B=");RBD(B);printf("\n");W=sqrt(1-e2*sin(B)*sin(B));N=a/W;H=sqrt(X*X+Y*Y)/cos(B)-N;printf(" 大地高为:H=%lf\n\n",H);}void B_ZS(){double L1,B1,A1,s,d,f,mi;double u1,u2,m,M,k2,alfa,bt,r,kp2,alfap,btp,rp;double sgm0,sgm1,lmd,lmd1,lmd2,A2,B2,l,L2;printf("请输入已知点的大地坐标(输入格式为角度(例如:30'40'50'),下同):\nL1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);L1=RAD(d,f,mi);printf("\nB1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);B1=RAD(d,f,mi);printf("请输入大地方位角:\nA1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);A1=RAD(d,f,mi);printf("请输入该点至另一点的大地线长:\ns=");scanf("%lf",&s);u1=atan(sqrt(1-e2)*tan(B1));m=asin(cos(u1)*sin(A1));M=atan(tan(u1)/cos(A1));m=(m>0)?m:m+2*PI;M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;sgm0=alfa*s;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0);while(fabs(sgm0-sgm1)>2.8*PI/180*pow(10,-7)){sgm0=sgm1;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0);}sgm0=sgm1;A2=atan(tan(m)/cos(M+sgm0));A2=(A2>0)?A2:A2+PI;A2=(A1>PI)?A2:A2+PI;u2=atan(-cos(A2)*tan(M+sgm0));lmd1=atan(sin(u1)*tan(A1));lmd1=(lmd1>0)?lmd1:lmd1+PI;lmd1=(m<PI)?lmd1:lmd1+PI;lmd2=atan(sin(u2)*tan(A2));lmd2=(lmd2>0)?lmd2:lmd2+PI;lmd2=(m<PI)?(((M+sgm0)<PI)?lmd2:lmd2+PI):(((M+sgm0)>PI)?lmd2:lmd2+PI);lmd=lmd2-lmd1;B2=atan(sqrt(1+ep2)*tan(u2));kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;l=lmd-sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos(2*M+sgm0)+rp*sin(2*sgm0)*cos(4*M+2*sgm0));L2=L1+l;printf("\n\n得到另一点的大地坐标和大地线在该点的大地方位角为:\n\n");printf("L2=");RBD(L2);printf("\n");printf("B2=");RBD(B2);printf("\n");printf("A2=");RBD(A2);printf("\n");}void B_FS(){double L1,B1,L2,B2,s,A1,A2,du,f,mi,m0,m,M;double l,u1,u2,alfa,bt,r,lmd0,dit_lmd,lmd,sgm,dit_sgm,sgm0,sgm1,alfap,btp,rp,k2,kp2;printf("请输入第一个点大地坐标(输入格式为角度(例如:30'40'50'),下同):\n大地经度L1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L1=RAD(du,f,mi);printf("大地纬度B1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B1=RAD(du,f,mi);printf("\n请输入第二个点大地坐标:\n大地经度:L2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L2=RAD(du,f,mi);printf("大地纬度:B2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B2=RAD(du,f,mi);l=L2-L1;u1=atan(sqrt(1-e2)*tan(B1));u2=atan(sqrt(1-e2)*tan(B2));sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));m0=asin(cos(u1)*cos(u2)*sin(l)/sin(sgm0));dit_lmd=0.003351831*sgm0*sin(m0);lmd0=l+dit_lmd;dit_sgm=sin(m0)*dit_lmd;sgm1=sgm0+dit_sgm;m=asin(cos(u1)*cos(u2)*sin(lmd0)/sin(sgm1));A1=atan(sin(lmd0)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd0)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;M=atan(sin(u1)*tan(A1)/sin(m));M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));while(fabs(sgm0-sgm1)>1*PI/180*pow(10,-8)){sgm0=sgm1;sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));}sgm=sgm1;lmd=l+sin(m)*(alfap*sgm+btp*sin(sgm)*cos(2*M+sgm));s=(sgm-bt*sin(sgm)*cos(2*M+sgm)-r*sin(2*sgm)*cos(4*M+2*sgm))/alfa;A1=atan(sin(lmd)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;A2=atan(sin(lmd)/(sin(u2)*cos(lmd)-tan(u1)*cos(u2)));A2=(A2>0)?A2:A2+PI;A2=(m<0)?A2:A2+PI;printf("\n\n得到两点间大地线长S和大地正反方位角A1、A2如下:\n\n");printf("s=%lf\n",s);printf("A1=");RBD(A1);printf("\n");printf("A2=");RBD(A2);printf("\n");}void GUS_ZS(){double B,L,x3,x6,y3,y6,Y3,Y6,du,f,mi,X,N,n,t;double At,Bt,Ct,Dt,m3,m6,l3,l6,W,L03,L06;int DH3,DH6;printf("请输入大地坐标(输入格式为角度(例如:30'40'50')):\n大地经度L=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L=RAD(du,f,mi);printf("\n大地纬度B=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B=RAD(du,f,mi);At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;X=a*(1-e2)*(At*B-Bt*sin(2*B)/2+Ct*sin(4*B)/4-Dt*sin(6*B)/6);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;n=sqrt(ep2)*cos(B);t=tan(B);DH3=(L-(1.5*PI/180))/(3*PI/180)+1;DH6=L/(6*PI/180)+1;L03=DH3*(3*PI/180);L06=DH6*(6*PI/180)-(3*PI/180);l3=L-L03;l6=L-L06;m3=cos(B)*l3;m6=cos(B)*l6;x3=X+N*t*(m3*m3/2+(5-t*t+9*n*n+4*n*n*n*n)*m3*m3*m3*m3/24+(61-58*t*t+t*t*t*t)*m3*m3*m3*m3*m3*m3/720);x6=X+N*t*(m6*m6/2+(5-t*t+9*n*n+4*n*n*n*n)*m6*m6*m6*m6/24+(61-58*t*t+t*t*t*t)*m6*m6*m6*m6*m6*m6/720);y3=N*(m3+(1-t*t+n*n)*m3*m3*m3/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m3*m3*m3*m3*m3/120);y6=N*(m6+(1-t*t+n*n)*m6*m6*m6/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m6*m6*m6*m6*m6/120);Y3=DH3*1000000+500000+y3;Y6=DH6*1000000+500000+y6;printf("\n\n 得到的高斯平面坐标为:\n\n");printf(" 对于3度带:\n 纵坐标x=%.3lf\n 横坐标y=%.3lf(通用坐标Y=%.3lf)\n\n",x3,y3,Y3);printf(" 对于6度带:\n 纵坐标x=%.3lf\n 横坐标y=%.3lf(通用坐标Y=%.3lf)\n\n",x6,y6,Y6);}void GUS_FS(){double x,y,Y,B,B0,B1,Bf,Vf,tf,Nf,nf,L,At,Bt,Ct,Dt,L3,L6;long DH;printf(" 请输入高斯平面坐标:\n\n");printf(" 纵坐标X=");scanf("%lf",&x);printf("\n");printf(" 自然坐标y=");scanf("%lf",&y);printf("\n");printf(" 通用坐标Y=");scanf("%lf",&Y);printf("\n");At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;B0=x/(a*(1-e2)*At);B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);while(fabs(B1-B0)>1*pow(10,-8)){B0=B1;B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);}Bf=B1;nf=sqrt(ep2)*cos(Bf);tf=tan(Bf);Vf=sqrt(1+ep2*cos(Bf)*cos(Bf));Nf=c/Vf;B=Bf-Vf*Vf*tf/2*((y/Nf)*(y/Nf)-(5+3*tf*tf+nf*nf-9*nf*nf*tf*tf)*pow((y/Nf),4)/12+(61+90*tf*tf+45*tf*tf)*pow((y/Nf),6)/360);L=((y/Nf)-(1+2*tf*tf+nf*nf)*(y/Nf)*(y/Nf)*(y/Nf)/6+(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf*nf*tf*tf)*po w((y/Nf),5)/120)/cos(Bf);DH=Y/1000000;L3=3*PI/180*double(DH)+L;L6=6*PI/180*double(DH)-3*PI/180+L;printf("\n\n 得到的大地坐标为:\n\n");printf(" 大地纬度B=");RBD(B);printf("\n");printf(" 若为6度带,大地经度L=");RBD(L6);printf("\n");printf(" 若为3度带,大地经度L=");RBD(L3);printf("\n");}。

大地坐标系与空间直角坐标系的相互转换方法

大地坐标系与空间直角坐标系的相互转换方法

大地坐标系与空间直角坐标系的相互转换方法1. 引言在测量和定位中,我们经常会用到坐标系来描述物体的位置。

大地坐标系和空间直角坐标系是常见的两种坐标系统,它们分别适用于地理测量和空间定位。

本文将介绍大地坐标系和空间直角坐标系之间的相互转换方法。

2. 大地坐标系大地坐标系是一种用来描述地球表面点位的坐标系统。

它采用经度、纬度和高度三个参数来确定点的位置。

2.1 经度和纬度经度是指地球表面上某点所在的东西方向线上的投影长度。

纬度是指地球表面上某点所在的南北方向线上的投影长度。

经度的取值范围是-180度到180度,纬度的取值范围是-90度到90度。

2.2 高度高度是指地球表面某点与平均海平面的距离。

它可以是正值,表示点位位于平均海平面之上,也可以是负值,表示点位位于平均海平面之下。

3. 空间直角坐标系空间直角坐标系是一种用来描述物体在空间中位置的坐标系统。

它采用直角坐标表示物体的位置,即用X、Y、Z三个参数表示点在空间中的位置。

3.1 X、Y、Z坐标X坐标表示点在东西方向上的位置,Y坐标表示点在南北方向上的位置,Z坐标表示点在垂直方向上的位置。

4. 大地坐标系转换为空间直角坐标系将大地坐标系中的经度、纬度和高度转换为空间直角坐标系中的X、Y、Z坐标,可以采用以下公式:X = (N + h) * cos(φ) * cos(λ)Y = (N + h) * cos(φ) * sin(λ)Z = (N * (1 - e^2) + h ) * sin(φ)其中,N为椭球面半径,h为高度,φ为纬度,λ为经度,e为第一偏心率。

5. 空间直角坐标系转换为大地坐标系将空间直角坐标系中的X、Y、Z坐标转换为大地坐标系中的经度、纬度和高度,可以采用以下公式:φ = atan(Z / sqrt(X^2 + Y^2))λ = atan(Y / X)h = sqrt(X^2 + Y^2 + Z^2) - N其中,N为椭球面半径,φ为纬度,λ为经度,h为高度。

大地坐标系与空间直角坐标系的相互转换公式

大地坐标系与空间直角坐标系的相互转换公式

大地坐标系与空间直角坐标系的相互转换公式概述大地坐标系和空间直角坐标系是地理信息系统中两种常用的坐标系。

大地坐标系主要用于描述地球上点的位置,而空间直角坐标系则是使用笛卡尔坐标系的三维空间中的坐标来表示点的位置。

在地理信息系统中,需要经常进行大地坐标系和空间直角坐标系之间的转换,以便在不同的坐标系统之间进行数据交互和分析。

大地坐标系大地坐标系是一种基于地球椭球体的坐标系统,常用来描述地球上点的位置。

一般采用经度(longitude)、纬度(latitude)和高程(elevation)来表示点在地球表面的位置。

经度表示点在东经或西经的位置,纬度表示点在北纬或南纬的位置,高程表示点相对于海平面的高度。

大地坐标系中经度的表示方式有多种,常见的有度分秒制和十进制制。

而纬度则一般用度制表示。

对于高程的表示方式,通常使用米作为单位。

空间直角坐标系空间直角坐标系是使用笛卡尔坐标系的三维空间中的坐标来表示点的位置。

在空间直角坐标系中,每个点的位置由三个数值组成,分别表示点在X轴、Y轴和Z轴方向上的位置。

这三个数值通常以米为单位。

空间直角坐标系中的原点可以选择任意位置,常见的有地心、地心地固、地心地独立三种坐标系。

地心坐标系以地球质心为原点,地心地固坐标系以地球上某一固定点为原点,地心地独立坐标系则是相对于地轴的一个旋转坐标系。

大地坐标系到空间直角坐标系的转换将大地坐标系中的点转换为空间直角坐标系中的点需要使用转换公式。

常用的转换方法有大地测量学和地心测量学两种。

### 大地测量学方法大地测量学方法中,将地球近似为椭球体,利用椭球体的形状参数和点的大地坐标来进行转换。

该方法的核心思想是通过计算点在曲线面上的法线方向,将大地坐标系的点转换为空间直角坐标系的点。

### 地心测量学方法地心测量学方法中,将地球近似为球体,并以地球质心或地球上某一固定点为原点。

该方法利用球面三角学的原理,根据点的经纬度和高程来进行转换。

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

大地坐标与空间直角坐标地转换程序代码
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");
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);
printf("\n\n转换后得到坐标为:\n\n");
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;break;
case 2:XYZ_BLH();break;
#include "stdio.h"

空间直角坐标系与空间大地坐标系的相互转换及其C++源程序

空间直角坐标系与空间大地坐标系的相互转换及其C++源程序

空间直角坐标系与空间大地坐标系的相互转换及其C++源程序空间直角坐标系与空间大地坐标系的相互转换1.空间直角坐标系/笛卡尔坐标系坐标轴相互正交的坐标系被称作笛卡尔坐标系。

三维笛卡尔坐标系也被称为空间直角坐标系。

在空间直角坐标系下,点的坐标可以用该点所对应的矢径在三个坐标轴上的投影长度来表示,只有确定了原地、三个坐标轴的指向和尺度,就定义了一个在三维空间描述点的位置的空间直角坐标系。

以椭球体中心O为原点,起始子午面与赤道面交线为X轴,在赤道面上与X轴正交的方向为Y轴,椭球体的旋转轴为Z轴构成右手坐标系O.XYZ,在该坐标系中,P点的位置用X,Y,Z表示。

在测量应用中,常将地球空间直角坐标系的坐标原点选在地球质心(地心坐标系)或参考椭球中心(参心坐标系),z轴指向地球北极,x轴指向起始子午面与地球赤道的交点,y轴垂直于XOZ面并构成右手坐标系。

空间直角坐标系2.空间大地坐标系由于空间直角坐标无法明确反映出点与地球之间的空间关系,为了解决这一问题,在测量中引入了大地基准,并据此定义了大地坐标系。

大地基准指的是用于定义地球参考椭球的一系列参数,包括如下常量:2.1椭球的大小和形状2.2椭球的短半轴的指向:通常与地球的平自转轴平息。

2.3椭球中心的位置:根据需要确定。

若为地心椭球,则其中心位于地球质心。

2.4本初子午线:通过固定平极和经度原点的天文子午线,通常为格林尼治子午线。

以大地基准为基础建立的坐标系被称为大地坐标系。

由于大地基准又以参考椭球为基准,因此,大地坐标系又被称为椭球坐标系。

大地坐标系是参心坐标系,其坐标原点位于参考椭球中心,以参考椭球面为基准面,用大地经度L、纬度B 和大地高H表示地面点位置。

过地面点P的子午面与起始子午面间的夹角叫P 点的大地经度。

由起始子午面起算,向东为正,叫东经(0°~180°),向西为负,叫西经(0°~-180°)。

过P点的椭球法线与赤道面的夹角叫P点的大地纬度。

空间大地坐标系平面直角坐标系转换公式

空间大地坐标系平面直角坐标系转换公式

空间大地坐标系平面直角坐标系转换公式————————————————————————————————作者:————————————————————————————————日期:§2.3.1 坐标系的分类正如前面所提及的,所谓坐标系指的是描述空间位置的表达形式,即采用什么方法来表示空间位置。

人们为了描述空间位置,采用了多种方法,从而也产生了不同的坐标系,如直角坐标系、极坐标系等。

在测量中常用的坐标系有以下几种:一、空间直角坐标系空间直角坐标系的坐标系原点位于参考椭球的中心,Z 轴指向参考椭球的北极,X 轴指向起始子午面与赤道的交点,Y 轴位于赤道面上且按右手系与X 轴呈90°夹角。

某点在空间中的坐标可用该点在此坐标系的各个坐标轴上的投影来表示。

空间直角坐标系可用图2-3来表示:图2-3 空间直角坐标系二、空间大地坐标系空间大地坐标系是采用大地经、纬度和大地高来描述空间位置的。

纬度是空间的点与参考椭球面的法线与赤道面的夹角;经度是空间中的点与参考椭球的自转轴所在的面与参考椭球的起始子午面的夹角;大地高是空间点沿参考椭球的法线方向到参考椭球面的距离。

空间大地坐标系可用图2-4来表示:图2-4空间大地坐标系三、平面直角坐标系平面直角坐标系是利用投影变换,将空间坐标空间直角坐标或空间大地坐标通过某种数学变换映射到平面上,这种变换又称为投影变换。

投影变换的方法有很多,如横轴墨卡托投影、UTM 投影、兰勃特投影等。

在我国采用的是高斯-克吕格投影也称为高斯投影。

UTM 投影和高斯投影都是横轴墨卡托投影的特例,只是投影的个别参数不同而已。

高斯投影是一种横轴、椭圆柱面、等角投影。

从几何意义上讲,是一种横轴椭圆柱正切投影。

如图左侧所示,设想有一个椭圆柱面横套在椭球外面,并与某一子午线相切(此子午线称为中央子午线或轴子午线),椭球轴的中心轴CC ’通过椭球中心而与地轴垂直。

高斯投影满足以下两个条件: 1、 它是正形投影;2、 中央子午线投影后应为x 轴,且长度保持不变。

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

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

空间直角坐标系与大地坐标系转换程序#include<iostream>#include<cmath>#include<iomanip>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<<"请分别输入椭球的长半轴、短半轴(国际单位)"<<endl;//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:空间直角坐标系到大地坐标系"<<endl;cin>>x;switch(x){case 0:{cout<<"请分别输入该点大地纬度、经度、大地高(国际单位,纬度经度请按度分秒,分别输入)"<<endl;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,坐标值(国际单位)分别为"<<fixed<<setprecision(6)<<X<<" "<<fixed<<setprecision(6)<<Y<<" "<<fixed<<setprecision(6)<<Z<<endl;break;}case 1:{cout<<"请分别输入空间直角坐标系中X,Y,Z的值(国际单位)"<<endl;cin>>X>>Y>>Z;double t,m,n, P,k,B0;m=Z/sqrt(X*X+Y*Y); //t0B0=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<<"大地坐标系中纬度,经度,大地高(国际单位)分别为"<<Bd<<" "<<Bf<<" "<<fixed<<setprecision(6)<<Bm<<endl<<Ld<<" "<<Lf<<" "<<fixed<<setprecision(6)<<Lm<<endl<<fixed<<setprecision(6)<<H<<endl;break;}}}运行结果。

WGS-84坐标与国家或地方坐标的转换在excel中的实现

WGS-84坐标与国家或地方坐标的转换在excel中的实现

WGS-84坐标与国家或地方坐标的转换在excel中的实现WGS-84坐标与国家或地方坐标的转换在excel中的实现摘要随着GPS技术的发展,精度的提高,其以全天候,高精度及操作简单的特点被越来越广泛的运用。

GPS平差后结果为大地坐标,而工程中我们常用的为国家坐标系或地方独立坐标系,所以需要进行坐标转换。

本文简要介绍了WGS-84坐标系和西安80坐标系及北京54坐标系等常用坐标系。

通过空间直角坐标系和大地坐标系间的关系公式,用EXCEL表实现了两者的相互转换。

接下来又介绍了两个不同空间直角坐标系的关系,转换原理及模型,使用的是七参数布尔莎方法。

用EXCEL表实现了不同空间直角坐标系间的互相转换,也就实现了WGS-84同其他坐标系间的互相转换,因为还涉及到换带计算,文中有添加了间接换带计算方法。

关键词:EXCEL表,WGS-84坐标系,坐标转换ABSTRACTAlong with the development of GPStechnology,higher and higher precision , it is more and morewidely applied for its simple operation, accuracy andall-weather. The GPS resultsafter adjustmentbelong to WGS-84.But coordinate used in engineering is usuallyour national coordinate system or local independentcoordinate system, so weneed coordinatetransformation. This paper briefly introduces the WGS -84coordinate system andxi an 80 coordinate system and Beijing54 coordinatesystem and coordinate system. Throughthe relational formula between t Spaceright-anglecoordinateand Geodetic coordinates, we use EXCEL table toprocess coordinateconversion. Then introduces twodifferent spaces, the relationship, theprinciple andthe model parameters which are seven Boolean Sally method.EXCELachieve conversion between deferent Space cartesian coordinate system, also canachieve WGS - 84熟,实践证明,在缩短工期、降低成本和设计的灵活性方面,GPS测量较常规测量更为优越。

大地坐标与直角空间坐标转换计算公式

大地坐标与直角空间坐标转换计算公式

大地坐标与直角空间坐标转换计算公式大地坐标与直角空间坐标转换计算公式一、参心大地坐标与参心空间直角坐标转换1名词解释:A :参心空间直角坐标系:a) 以参心0为坐标原点;b) Z 轴与参考椭球的短轴(旋转轴)相重合; c) X 轴与起始子午面和赤道的交线重合;d) Y 轴在赤道面上与X 轴垂直,构成右手直角坐标系0-XYZ ; e)地面点P 的点位用(X ,Y ,Z )表示;B :参心大地坐标系:a)以参考椭球的中心为坐标原点,椭球的短轴与参考椭球旋转轴重合;b)大地纬度B :以过地面点的椭球法线与椭球赤道面的夹角为大地纬度B ;c)大地经度L :以过地面点的椭球子午面与起始子午面之间的夹角为大地经度L ;d) 大地高H :地面点沿椭球法线至椭球面的距离为大地高H ; e)地面点的点位用(B ,L ,H )表示。

2 参心大地坐标转换为参心空间直角坐标:+-=+=+=B H e N Z L B H N Y L B H N X sin *])1(*[sin *cos *)(cos *cos *)(2公式中,N 为椭球面卯酉圈的曲率半径,e 为椭球的第一偏心率,a 、b 椭球的长短半径,f 椭球扁率,W 为第一辅助系数a b a e 22-=或 f f e 1*2-= WaN B W e =-=22sin *1(西安80椭球参数:长半轴a=6378140±5(m )短半轴b=6356755.2882m 扁率α=1/298.2573 参心空间直角坐标转换参心大地坐标[]NBY X H He N Y X H N Z B X YL -+=+-++==cos ))1(**)()(*arctan()arctan(22222二高斯投影及高斯直角坐标系1、高斯投影概述高斯-克吕格投影的条件:1. 是正形投影;2. 中央子午线不变形高斯投影的性质:1. 投影后角度不变;2. 长度比与点位有关,与方向无关; 3. 离中央子午线越远变形越大为控制投影后的长度变形,采用分带投影的方法。

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

空间直角坐标系与大地坐标系转换程序
#include<iostream>
#include<cmath>
#include<iomanip>
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<<"请分别输入椭球的长半轴、短半轴(国际单位)"<<endl;
//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:空间直角坐标系到大地坐标系"<<endl;
cin>>x;
switch(x)
{
case 0:
{
cout<<"请分别输入该点大地纬度、经度、大地高(国际单位,纬度经度请按度分秒,分别输入)"<<endl;
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,坐标值(国际单位)分别为"<<fixed<<setprecision(6)<<X<<" "<<fixed<<setprecision(6)<<Y<<" "<<fixed<<setprecision(6)<<Z<<endl;break;
}
case 1:
{
cout<<"请分别输入空间直角坐标系中X,Y,Z的值(国际单位)"<<endl;
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<<"大地坐标系中纬度,经度,大地高(国际单位)分别为"<<Bd<<" "<<Bf<<" "<<fixed<<setprecision(6)<<Bm<<endl<<Ld<<" "<<Lf<<" "<<fixed<<setprecision(6)<<Lm<<endl<<fixed<<setprecision(6)<<H<<endl;
break;
}
}
}
运行结果
Welcome !!! 欢迎您的下载,资料仅供参考!。

相关文档
最新文档