大地坐标与空间直角坐标的转换程序代码
#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");
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 lmd2=atan(sin(u2)*tan(A2)); lmd2=(lmd2>0)?lmd2:lmd2+PI; lmd2=(m 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*m 3*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*m 6*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*t f*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"); } 坐标转换方法 空间直角坐标系如果其原点不动,绕着某一个轴旋转而构成的新的坐标系,这个过程就叫做坐标旋转。在旧坐标系中的坐标与在旋转后新坐标系中的坐标有一定的转换关系,这种转换关系可以用转换矩阵来表示。 如图5.7,直角坐标系XYZ,P点的坐标为(x, y, z),其相应的在XY 平面,XZ平面,YZ平面分别为M(x, y,0),Q(x,0, z)和N(0, y, z)。 图5.7直角坐标系XYZ 设?表示第j 轴的旋转角度,R j (?) 表示绕第j 轴的旋转,其正方向是沿坐标轴向原点看去的逆时针方向。很明显当j 轴为旋转轴时,它对应的坐标中的j 分量是不变的。由于直角坐标系是对称的,下面我们以绕Z轴旋转为例推导其旋转变换矩阵,其它两个轴推导和它是一样的。 设图5.7的坐标绕Z轴逆时针旋转θ角度,新坐标为X 'Y'Z',如图5.8所示: 图5.8 坐标绕Z 轴逆时针旋转θ角度 由于坐标中的z 分量不变,我们可以简化地在XY 平面进行分分析,如图 5.9所示: 图5.9坐标绕Z 轴逆时针旋转θ 角度的XY 平面示意图 点 M X 和点M X ' 分别是M 点在X 轴和X '轴的投影。如图5.9 cos cos() sin sin() X X X X x OM OM MOM OM y MM OM MOM OM ?θ?θ==∠=-??==∠=-? (5-1) cos cos sin sin X X X X x OM OM MOM OM y MM OM MOM OM ? ?'''''==∠=??'==∠=? (5-2) 把(5-1)式按照三角函数展开得: cos cos sin sin sin cos cos sin x OM OM y OM OM ?θ?θ ?θ?θ=+??=+? (5-3) 把(5-2)式代入(5-3)式得: cos sin sin cos x x y y x y θθ θθ''=+??''=-+? (5-4) 坐标中的z 分量不变,即z = z'这样整个三维坐标变换就可以写成(用新坐标表 示旧坐标) cos sin sin cos x x y y x y z z θθ θθ''=+? ?''=-+??' =? (5-5) 把式(5-5)用一个坐标旋转变换矩阵R Z (θ) 表示可以写成: 空间直角坐标系与大地坐标系转换程序 #include 不同空间直角坐标系的转换 欧勒角 不同空间直角坐标系的转换,包括三个坐标轴的平移和坐标轴的旋转,以及两个坐标系的尺度比参数,坐标轴之间的三个旋转角叫欧勒角。 三参数法 三参数坐标转换公式是在假设两坐标系间各坐标轴相互平行,轴系间不存在欧勒角的条件下得出的。实际应用中,因为欧勒角不大,可以用三参数公式近似地进行空间直角坐标系统的转换。公共点只有一个时,采用三参数公式进行转换。 七参数法 用七参数进行空间直角坐标转换有布尔莎公式,莫洛琴斯基公式和范氏公式等。下面给出布尔莎七参数公式: 坐标转换多项式回归模型 坐标转换七参数公式属于相似变换模型。大地控制网中的系统误差一般呈区域性,当区域较小时,区域性的系统误差被相似变换参数拟合,故局部区域的坐标转换采用七参数公式模型是比较适宜的。但对全国或一个省区范围内的坐标转换,可以采用多项式回归模型,将各区域的系统偏差拟合到回归参数中,从而提高坐标转换精度。 两种不同空间直角坐标系转换时,坐标转换的精度取决于坐标转换的数学模型和求解转换系数的公共点坐标精度,此外,还与公共点的分布有关。鉴于地面控制网系统误差在???? ??????+??????????=??????????000111222Z Y X Z Y X Z Y X ???? ??????+????????????????????---+??????????+=??????????000111111222000)1(Z Y X Z Y X Z Y X m Z Y X X Y X Z Y Z εεεεεε 不同区域并非是一个常数,所以采用分区进行坐标转换能更好地反映实际情况,提高坐标转换的精度。 空间坐标转换说明 集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988) 坐标转换说明 GPS 接收机接收到GPS (大地坐标:经度、纬度和高度值)信号后,并不利于显示,需要将大地坐标进行转换,现选用东北天坐标系(也叫站心坐标系)作为显示的依据。 GPS 接收机接收到的第一个信号L (经度)、B (纬度)和H (高度),作为东北天坐标系的原点。当接收到第二个信号时L 1、B 1和H 1,应用坐标转换公式,转换到东北天坐标系下进行显示。依次类推,凡是接收到的GPS 信号都转换到东北天坐标系下进行显示,在东北天坐标系下预测出来的坐标值通过坐标转换公式在显示屏上显示大地坐标(经度、纬度和高度)。 1.大地坐标与直角坐标的相互转化 对空间某一点,大地坐标系(L ,B ,H )到直角坐标系(X ,Y ,Z )的转换关系如下: ?? ? ?? +-=+=+=B H e N Z L B H N Y L B H N X sin ])1([sin cos )(cos cos )(2(1) 由直角坐标系(X ,Y ,Z )转化到大地坐标系(L ,B ,H )的公式如下: ??? ? ??? --=+-++==)1(sin /]})1((/[)(arctan{) /arctan(2222e N B Z H H e N Y X H N Z B X Y L (2) 式中:B e a N 22sin 1/-=,N 为该点的卯酉圈曲率半径;2222/)(a b a e -=,a 、 b 、e 分别为该大地坐标系对应参考椭球的长半轴、短半轴和第一偏心率。长半轴 a =6378137±2m ,短半轴 b =6356.7523142km ,90130066943799.02=e 。 从公式(2)看出,经度比较容易求得,纬度和高度必须通过迭代计算获直接计算得到。迭代计算的次序为:N H B →→,通常迭代四次可以达到H 优于0.001m ,B 优于0.00001''的计算精度;教科书中给出的直接法计算公式比较繁琐,有的计算公式的应用条件受到一定限制,例如要求大地高度小于10000m 时,才能使B 、H 达到上述计算精度,有的直接计算公式精度较低。 根据[张华海]提供的方法,本文建议采用该方法将直角坐标(X ,Y ,Z )转变成大地坐标(L ,B ,H )。该方法的公式形式比较简便,B 、H 的计算精度高;用计算出 坐标转换之计算公式 一、参心大地坐标与参心空间直角坐标转换 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 2 2-= 或 f f e 1*2-= W a N B W e =-=22sin *1( 3 参心空间直角坐标转换参心大地坐标 []N B Y X H H e N Y X H N Z B X Y L -+=+-++==cos ))1(**)()(*arctan( )arctan(2 2222 二 高斯投影及高斯直角坐标系 1、高斯投影概述 高斯-克吕格投影的条件:1. 是正形投影;2. 中央子午线不变形 高斯投影的性质:1. 投影后角度不变;2. 长度比与点位有关,与方向无关; 3. 离中央子午线越远变形越大 为控制投影后的长度变形,采用分带投影的方法。常用3度带或6度带分带,城市或工 程控制网坐标可采用不按3度带中央子午线的任意带。 2、高斯投影正算公式: 5 2224253 2236 4254 42232)5814185(cos 120 )1(cos 6 cos )5861(cos sin 720 495(cos sin 24 cos sin 2l t t t B N l t B N Bl N y l t t B B N l t B B N Bl B N X x ηηηηη-++-++-+=+-+++-++=) 3、高斯投影反算公式: 空间直角坐标系的旋转转换 using System; using System.Collections.Generic; using https://www.360docs.net/doc/471102317.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; namespace ReferenceTransition { public partial class Form1 : Form { public Form1() { this.MaximizeBox = false; InitializeComponent(); } private double x, y, z; private double i, j, k; private double a1,a2,a3; private double b1, b2, b3; private double c1, c2, c3; private double rx, ry, rz; private string t1, t2, t3; private string k1, k2, k3; private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; textBox4.Text = ""; textBox5.Text = ""; textBox6.Text = ""; textBox7.Text = ""; textBox8.Text = ""; textBox9.Text = ""; richTextBox1.Text = ""; } private void button4_Click(object sender, EventArgs e) { try { 空间直角坐标系与空间大地坐标系的相互转换 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°)。从地面点P沿椭球法线到椭球面的距离叫大地高。大地坐标坐标系中,P点的位置用L,B表示。如果点不在椭球面上,表示点的位置除L,B外,还要附加另一参数——大地高H。 空间大地坐标系 3.空间直角坐标与大地坐标间的转换 3.1大地坐标转换为空间直角坐标 坐标转换说明 GPS 接收机接收到GPS (大地坐标:经度、纬度和高度值)信号后,并不利于显示,需要将大地坐标进行转换,现选用东北天坐标系(也叫站心坐标系)作为显示的依据。 GPS 接收机接收到的第一个信号L (经度)、B (纬度)和H (高度),作为东北天坐标系的原点。当接收到第二个信号时L 1、B 1和H 1,应用坐标转换公式,转换到东北天坐标系下进行显示。依次类推,凡是接收到的GPS 信号都转换到东北天坐标系下进行显示,在东北天坐标系下预测出来的坐标值通过坐标转换公式在显示屏上显示大地坐标(经度、纬度和高度)。 1.大地坐标与直角坐标的相互转化 对空间某一点,大地坐标系(L ,B ,H )到直角坐标系(X ,Y ,Z )的转换关系如下: ?? ???+-=+=+=B H e N Z L B H N Y L B H N X sin ])1([sin cos )(cos cos )(2 (1) 由直角坐标系(X ,Y ,Z )转化到大地坐标系(L ,B ,H )的公式如下: ??? ????--=+-++==)1(sin /]})1((/[)(arctan{)/arctan(2222e N B Z H H e N Y X H N Z B X Y L (2) 式中:B e a N 22sin 1/-=,N 为该点的卯酉圈曲率半径;2222/)(a b a e -=,a 、b 、e 分别为该大地坐标系对应参考椭球的长半轴、短半轴和第一偏心率。长半 轴a =6378137±2m ,短半轴b =6356.7523142km ,90130066943799 .02=e 。 从公式(2)看出,经度比较容易求得,纬度和高度必须通过迭代计算获直接计算得到。迭代计算的次序为:N H B →→,通常迭代四次可以达到H 优于0.001m ,B 优于0.00001''的计算精度;教科书中给出的直接法计算公式比较繁琐,有的计算公式的应用条件受到一定限制,例如要求大地高度小于10000m 时,才能使B 、H 达到上述计算精度,有的直接计算公式精度较低。 根据[张华海]提供的方法,本文建议采用该方法将直角坐标(X ,Y ,Z )转变成大地坐标(L ,B ,H )。该方法的公式形式比较简便,B 、H 的计算精度高;用计算出的具有一定精度的0B ,直接求出H ,一次性计算出满足精度要求的H ;再将H 值代入公式(2)中,求出B 值。 令))/(arctan(22b Y X Za u ?+=,a 、b 分别为长半轴和短半轴。将u 代入下 #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; 大地坐标与直角空间坐标转换计算公式 一、参心大地坐标与参心空间直角坐标转换 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 2 2-= f f e 1 *2-=W a N B W e = -=22 sin *1(西安80椭球参数: 长半轴a=6378140±5(m ) 短半轴b=6356755.2882m 扁 率α=1/298.257 3 参心空间直角坐标转换参心大地坐标 [ ] N B Y X H H e N Y X H N Z B X Y L -+= +-++==cos ) )1(**)() (*arctan(arctan(2 22 2 2 二 高斯投影及高斯直角坐标系 1、高斯投影概述 高斯-克吕格投影的条件:1. 是正形投影;2. 中央子午线不变形 高斯投影的性质:1. 投影后角度不变;2. 长度比与点位有关.与方向无关; 3. 离中央子午线越远变形越大 为控制投影后的长度变形.采用分带投影的方法。常用3度带或6度带分带.城市或工程控制网坐标可采用不按3度带中央子午线的任意带。 2、高斯投影正算公式: 52224253 2236 425442232)5814185(cos 120 )1(cos 6 cos )5861(cos sin 720 495(cos sin 24cos sin 2l t t t B N l t B N Bl N y l t t B B N l t B B N Bl B N X x ηηηηη-++-++-+=+-+++-++ =)3、高斯投影反算公式: §2.3.1 坐标系的分类 正如前面所提及的,所谓坐标系指的是描述空间位置的表达形式,即采用什么方法来表示空间位置。人们为了描述空间位置,采用了多种方法,从而也产生了不同的坐标系,如直角坐标系、极坐标系等。 在测量中常用的坐标系有以下几种: 一、空间直角坐标系 空间直角坐标系的坐标系原点位于参考椭球的中心,Z 轴指向参考椭球的北极,X 轴指向起始子午面与赤道的交点,Y 轴位于赤道面上且按右手系与X 轴呈90°夹角。某点在空间中的坐标可用该点在此坐标系的各个坐标轴上的投影来表示。空间直角坐标系可用图2-3来表示: 图2-3 空间直角坐标系 二、空间坐标系 空间坐标系是采用经、纬度和高来描述空间位置的。纬度是空间的点与参考椭球面的法线与赤道面的夹角;经度是空间中的点与参考椭球的自转轴所在的面与参考椭球的起始子午面的夹角;高是空间点沿参考椭球的法线方向到参考椭球面的距离。空间坐标系可用图2-4来表示: 图2-4空间坐标系 三、平面直角坐标系 平面直角坐标系是利用投影变换,将空间坐标空间直角坐标或空间坐标通过某种数学变换映射到平面上,这种变换又称为投影变换。投影变换的方法有很多,如横轴墨卡托投影、UTM 投影、兰勃特投影等。在我用的是高斯-克吕格投影也称为高斯投影。UTM 投影和高斯投影都是横轴墨卡托投影的特例,只是投影的个别参数不同而已。 高斯投影是一种横轴、椭圆柱面、等角投影。从几何意义上讲,是一种横轴椭圆柱正切投影。如图左侧所示,设想有一个椭圆柱面横套在椭球外面,并与某一子午线相切(此子午线称为中央子午线或轴子午线),椭球轴的中心轴CC ’通过椭球中心而与地轴垂直。 高斯投影满足以下两个条件: 1、 它是正形投影; 2、 中央子午线投影后应为x 轴,且长度保持不变。 将中央子午线东西各一定经差(一般为6度或3度)围的地区投影到椭圆柱面上,再将此柱面沿某一棱线展开,便构成了高斯平面直角坐标系,如下图2-5右侧所示。 图2-5 高斯投影 x 方向指北,y 方向指东。 可见,高斯投影存在长度变形,为使其在测图和用图时影响很小,应相隔一定的地区,另立中央子午线,采取分带投影的办法。我国国家测量规定采用六度带和三度带两种分带方法。六度带和三度带与中央子午线存在如下关系: 366 N L =中; n L 33=中 其中,N 、n 分别为6度带和3度带的带号。 第一章大地坐标 第一节大地坐标系统 科技名词定义 中文名称:大地坐标系 英文名称:geodetic coordinate system 定义:以参考椭球中心为原点、起始子午面和赤道面为基准 面的地球坐标系。 应用学科:测绘学(一级学科);大地测量学(二级学科) 大地坐标系(geodetic coordinate system)是大地测量中以参考椭球面为基准面建立起来的坐标系。地面点的位置用大地经度、大地纬度和大地高度表示。大地坐标系的确立包括选择一个椭球、对椭球进行定位和确定大地起算数据。一个形状、大小和定位、定向都已确定的地球椭球叫参考椭球。参考椭球一旦确定,则标志着大地坐标系已经建立。大地坐标系亦称为地理坐标系。大地坐标系是用来表述地球上点的位置的一种地区坐标系统。它 采用一个十分近似于地球自然形状的参考椭球作为描述和推算地面点位置和相互关系的基准面。一个大地坐标系统必须明确定义其三个坐标轴的方向和其中心的位置。通常人们用旋转椭球的短轴与某一规定的起始子午面分别平行干地球某时刻的平均自转轴和相应的真起始子午面来确定坐标轴的方向。若使参考椭球中心与地球平均质心重合,则定义和建立了地心大地坐标系。它是航天与远程武器和空间科学中各种定位测控测轨的依据。若椭球表面与一个或几个国家的局部大地水准面吻合最好,则建立了一个国家或区域的局部大地坐标系。大地坐标系中点的位置是以其大地坐标表示的,大地坐标均以椭球面的法线来定义。其中,过某点的椭球面法线与椭球赤道面的交角为大地纬度;包含该法线和大地子午面与起始大地子午面的二面角为该点的大地经度;沿法线至椭球面的距离为该点的大地高。大地纬度、大地经度和大地高分别用大写英文字母B、L、H表示。 大地坐标系是以地球椭球赤道面和大地起始子午面为起算面并依地球椭球面为参考面而建立的地球椭球面坐标系。它是大地测量的基本坐标系,其大地经度L、大地纬度B和大地高H为此坐标系的3个坐标分量。它包括地心大地坐标系和参心大地坐标系。 其中,对于地心大地坐标系,其地面上一点的大地经度L为大地起始子午面与该点所在的子午面所构成的二面角,由起始子午面起算,向东为正,称为东经(0~180),向西为负,称为西经 #include #include "" #include "" #include "" #include "iostream" #define PI 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("椭球参数\n"); printf("椭球参数\n"); printf("0.其他椭球参数(自行输入)\n"); scanf("%d",&n); switch(n) { case 1:a=;b=;c=;e2=;ep2=;break; case 2:a=;b=;c=;e2=;ep2=;break; case 3:a=;b=;c=;e2=;ep2=;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); 大地坐标直角空间坐标 转换计算公式 大地坐标与直角空间坐标转换计算公式 一、参心大地坐标与参心空间直角坐标转换 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)表示。 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT 2参心大地坐标转换为参心空间直角坐标: 公式中,N为椭球面卯酉圈的曲率半径,e为椭球的第一偏心率,a、b椭球的长短半径,f椭球扁率,W为第一辅助系数 a b a e 2 2- =或 f f e 1 * 2-= 西安80椭球参数: 长半轴a=6378140±5(m) 短半轴b= 扁率α=1/ 3参心空间直角坐标转换参心大地坐标 二高斯投影及高斯直角坐标系 1、高斯投影概述 高斯-克吕格投影的条件:1.是正形投影;2.中央子午线不变形 高斯投影的性质:1.投影后角度不变;2.长度比与点位有关,与方向无关;3.离中央子午线越远变形越大 为控制投影后的长度变形,采用分带投影的方法。常用3度带或6度带分带,城市或工程控制网坐标可采用不按3度带中央子午线的任意带。 2、高斯投影正算公式: 3、高斯投影反算公式: 1坐标转换简介 坐标系统之间的坐标转换既包括不同的参心坐标之间的转换,或者不同的地心坐标系之间的转换,也包括参心坐标系与地心坐标系之间的转换以及相同坐标系的直角坐标与大地坐标之间的坐标转换,还有大地坐标与高斯平面坐标之间的转换。在两个空间角直坐标系中,假设其分别为O--XYZ和O--XYZ,如果两个坐标系的原点相同,通过三次旋转,就可以使两个坐标系重合;如果两个直角坐标系的原点不在同一个位置,通过坐标轴的平移和旋转可以取得一致;如果两个坐标系的尺度也不尽一致,就需要再增加一个尺度变化参数;而对于大地坐标和高斯投影平面坐标之间的转换,则需要通过高斯投影正算和高斯投影反算,通过使用中央子午线的经度和不同的参考椭球以及不同的投影面的选择来实现坐标的转换。空间直角坐标系坐标转换方法
空间直角坐标系与大地坐标系转换程序
不同空间直角坐标系的转换
空间坐标转换说明
坐标转换之计算公式
空间直角坐标系的旋转转换
空间直角坐标系与空间大地坐标系的相互转换及其C++源程序
空间坐标转换说明
大地坐标与空间直角坐标的转换程序代码
大地坐标与直角空间坐标转换计算公式
空间大地坐标系与平面直角坐标系转换公式
大地、地心空间直角和球面三种坐标的转换
大地坐标系和空间直角坐标系转换
大地坐标与空间直角坐标的转换程序代码
大地坐标直角空间坐标转换计算公式