大地坐标与空间直角坐标的转换程序代码
坐标转换从经纬度坐标到大地坐标及源码
坐标转换从经纬度坐标到大地坐标及源码坐标转换是指将一个坐标系下的点的坐标转换为另一个坐标系下的点的坐标。
在地理空间领域,经纬度坐标(也称为地理坐标)和大地坐标是两个常用的坐标系。
经纬度坐标是地理坐标系中用来表示地球表面上其中一点位置的一种方式。
它使用经度和纬度两个数值来确定一个点的位置。
经度表示点与地球质心之间的角度差,范围为-180°到180°,其中0°表示位于本初子午线上,东经为正,西经为负。
纬度表示点与地球赤道间的角度差,范围为-90°到90°,南纬为负,北纬为正。
大地坐标(也称为投影坐标)是将地球表面的球面坐标映射到平面上的坐标系。
大地坐标系使用X、Y坐标来表示一个点的位置,其中X轴通常表示东西方向,Y轴通常表示南北方向。
接下来,我们将提供一种经纬度坐标到大地坐标的转换方法以及相关源码。
方法一:使用Python编程语言在Python中,我们可以使用Pyproj库来进行经纬度坐标到大地坐标的转换。
下面是一个示例代码,展示了如何使用该库进行转换:```pythonimport pyprojdef latlon_to_utm(lat, lon):#定义转换器utm_x, utm_y = transformer.transform(lon, lat)return utm_x, utm_y#测试lat = 39.9087 # 纬度值lon = 116.3975 # 经度值utm_x, utm_y = latlon_to_utm(lat, lon)print("UTM坐标: X =", utm_x, "Y =", utm_y)```方法二:使用JavaScript编程语言在JavaScript中,我们可以使用proj4js库来进行经纬度坐标到大地坐标的转换。
下面是一个示例代码,展示了如何使用该库进行转换:```javascriptvar proj4 = require('proj4');function latlon_to_utm(lat, lon)//定义转换器var source = '+proj=longlat +datum=WGS84 +no_defs';var target = '+proj=utm +zone=50 +datum=WGS84 +units=m+no_defs';var utm = proj4(source, target, [lon, lat]);return {x: utm[0], y: utm[1]};//测试var lat = 39.9087; // 纬度值var lon = 116.3975; // 经度值var utm = latlon_to_utm(lat, lon);console.log("UTM坐标: X =", utm.x, "Y =", utm.y);```在上述代码中,我们使用proj4库来定义转换器并进行转换。
坐标转换源代码
#include "iostream.h"#include "math.h"#include "stdio.h"#define pi 3.1415926535897932 //圆周率void xyz_xyz(double xyz[],double xyz1[],double canshu[]);void gstyz(double blh[],double xy[],double para2[]);void blh_xyz(double blh[],double xyz[],double para1[]);double ziwuhu(double B,double a,double e2);double xyz_blh(double blh[],double xyz[],double para2[]);double huahu(double b);main(){double blh[3],xyz[3],xyz1[3],xy[2],para1[2],para2[2],canshu[7]; int i;cout<<"请输入大地坐标B,L,H,角度输入方式如下:"<<endl;cout<<"若输入的角度为30度30分30秒,对应的代码为:30.3030"<<endl;cin>>blh[0]>>blh[1]>>blh[2];cout<<endl;//将输入的角度形式转化为弧度blh[0]=huahu(blh[0]);blh[1]=huahu(blh[1]);cout<<"请输入WGS84椭球的椭球参数,长半轴以及扁率的倒数:"<<endl; cin>>para1[0]>>para1[1];cout<<endl;cout<<"请输入北京54椭球的椭球参数,长半轴以及扁率的倒数:"<<endl;cin>>para2[0]>>para2[1];cout<<endl;//调用函数,实现大地坐标向空间直角坐标系中的转换blh_xyz(blh,xyz,para1);cout<<"对应的空间直角坐标系中的坐标为:"<<endl;printf("x=%10.6f,y=%10.6f,z=%10.6f",xyz[0],xyz[1],xyz[2]);cout<<endl;cout<<"请分别输入两坐标系之间的缩放参数,旋转参数和位移参数:"<<endl;for(i=0;i<7;i++){cin>>canshu[i];}cout<<endl;//将输入的角度转换为弧度的形式canshu[1]=huahu(canshu[1]);canshu[2]=huahu(canshu[2]);canshu[3]=huahu(canshu[3]);//调用函数,实现两个空间直角坐标系之间的转换xyz_xyz(xyz,xyz1,canshu);//调用函数,将大地坐标转换为直角坐标xyz_blh(blh,xyz,para2);//调用函数,计算对应的高斯投影面上的坐标gstyz(blh,xy,para2);//输出结果printf("对应的高斯投影坐标系中的坐标为:\n");printf("x=%10.6f,y=%10.6f",xy[0],xy[1]);}//大地坐标转换为直角坐标void blh_xyz(double blh[],double xyz[],double para1[]) { double b,e2,N;b=para1[0]*(1-1/para1[1]);e2=1-b*b/(para1[0]*para1[0]);N=para1[0]/sqrt(1-e2*sin(blh[0])*sin(blh[0]));xyz[0]=(N+blh[2])*cos(blh[0])*cos(blh[1]);xyz[1]=(N+blh[2])*cos(blh[0])*sin(blh[1]);xyz[2]=(N*(1-e2)+blh[2])*sin(blh[0]);}//计算子午弧长函数double ziwuhu(double B,double a,double e2){double X,m0,m2,m4,m6,m8,q0, q2,q4,q6,q8;m0=a*(1-e2);m2=3*e2*m0/2;m4=5*e2*m2/4;m6=7*e2*m4/6;m8=9*e2*m6/8;q0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;q2=m2/2+m4/2+15*m6/32+7*m8/16;q4=m4/8+3*m6/16+7*m8/32;q6=m6/32+m8/16;q8=m8/128;X=q0*B-q2*sin(2*B)/2+q4*sin(4*B)/4-q6*sin(6*B)/6+q8*sin(8*B)/8; return X;}//坐标转换的直接解法求解经纬度double xyz_bl(double blh[],double xyz[],double para2[]){double a,b,e2,p1,r,A1,A2,A3,A4;a=para2[0];b=a*(1-1/para2[1]);e2=1-b*b/(a*a);p1=atan(xyz[2]/sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]));r=a*sqrt(1-e2)/((1-e2*sin(p1)*sin(p1))*(1-e2*sin(p1)*sin(p1)) );r=sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);A1=para2[0]*tan(p1)/r;A2=sin(p1)*sin(p1)+2*(a/r)*cos(p1)*cos(p1);A3=3*sin(p1)*sin(p1)*sin(p1)*sin(p1)+16*((a/r)*sin(p1)*sin(p1)*cos(p1 )*cos(p1)+4*(a/r)*(a/r)*cos(p1)*cos(p1)*(2-5*sin(p1)*sin(p1)));A4=5*sin(p1)*sin(p1)*sin(p1)*sin(p1)*sin(p1)*sin(p1)+48*((a/r)*sin(p1)*sin(p1)*sin(p1)*sin(p1)*cos(p1)*cos(p1)+20*(a/r)*(a/r)*sin(p1)*sin(p1)*cos(p1)*cos(p1)*(4-7*sin(p1)*sin(p1))+16*(a/r)*(a/r)*(a/r )*cos(p1)*cos(p1)*(1-7*sin(p1)*sin(p1)+8*sin(p1)*sin(p1)*sin(p1)*sin(p1)));blh[0]=atan(tan(p1)+A1*e2*(1+e2/2*(A2+e2*e2/4*(A3+A4/2))));blh[1]=atan(xyz[1]/xyz[0]);if(blh[1]<0)blh[1]+=pi;}//使用实用电算公式计算进行高斯投影正算void gstyz(double blh[],double xy[],double para2[]){double B,L,l,b,e2,t,g2,N,x1,x2,x3,y1,y2,y3;int i;B=blh[0];L=blh[1]*180/pi;//计算高斯投影带的带号for(i=0;fabs(3*i-L)>1.5;i++);cout<<"高斯投影带的带号为:"<<i<<endl;//计算经差,并用弧度的形式表示l=(L-3*i)*pi/180;b=para2[0]*(1-1/para2[1]);e2=1-b*b/(para2[0]*para2[0]);t=tan(B);g2=e2*cos(B)*cos(B)/(1-e2);N=para2[0]/sqrt(1-e2*sin(B)*sin(B));x1=N*t*cos(B)*cos(B)*l*l/2;x2=N*t*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*(5-t*t+9*g2+4*g2*g2)/24;x3=N*t*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*l*l*(61-58*t *t+t*t*t*t)/720;y1=N*cos(B)*l;y2=N*cos(B)*cos(B)*cos(B)*l*l*l*(1-t*t+g2)/6;y3=N*cos(B)*cos(B)*cos(B)*cos(B)*cos(B)*l*l*l*l*l*(5-18*t*t+t*t*t*t+1 4*g2-58*g2*t*t)/120;xy[0]=ziwuhu(B,para2[0],e2)+x1+x2+x3;xy[1]=y1+y2+y3;}//将输入的角度化为弧度的函数double huahu(double b){double b1,b2,b3;b1=(int)b;b2=(int)((b-b1)*100);b3=((b-b1)*100-b2)*100;b=(b1+b2/60+b3/3600)*pi/180;return b;}//直角坐标系转换函数void xyz_xyz(double xyz[],double xyz1[],double canshu[]) {double k,ox,oy,oz,oX,oY,oZ,a1,a2,a3,b1,b2,b3,c1,c2,c3; k=1+canshu[0];ox=canshu[1];oy=canshu[2];oz=canshu[3];oX=canshu[4];oY=canshu[5];oZ=canshu[6];//计算旋转矩阵a1=cos(oz)*cos(oy);a2=cos(ox)*sin(oz)+sin(ox)*sin(oy)*cos(oz);a3=sin(ox)*sin(oz)-cos(ox)*sin(oy)*cos(oz);b1=-cos(oy)*sin(oz);b2=cos(ox)*cos(oz)-sin(ox)*sin(oy)*sin(oz);b3=sin(ox)*cos(oz)+cos(ox)*sin(oy)*sin(oz);c1=sin(oy);c2=-sin(ox)*cos(oy);c3=cos(ox)*cos(oy);//计算在转换后直角坐标系中的坐标xyz1[0]=k*(a1*xyz[0]+a2*xyz[1]+a3*xyz[2])+oX;xyz1[1]=k*(b1*xyz[0]+b2*xyz[1]+b3*xyz[2])+oY;xyz1[2]=k*(c1*xyz[0]+c2*xyz[1]+c3*xyz[2])+oZ;}。
空间直角坐标系与空间大地坐标系的相互转换及其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°)。
大地坐标与空间直角坐标转换_C程序
scanf("%lf",&y);
printf("请输入Z:\n");
scanf("%lf",&z);
l=atan2(y,x);
do{m=(z+a1*e*e*g/sqrt(1+g*g-e*e*g*g))/sqrt(x*x+y*y);
m1=atan(m);
b=HD(a,b1,c);
printf("请输入H:\n");
scanf("%lf",&h);
w=sqrt((1-e*e*sin(b)*sin(b)));
n=a1/w;
x=(n+h)*cos(b)*cos(l);
y=(n+h)*cos(b)*sin(l);
z=(n*(1-e*e)+h)*sin(b);
void lbhxyz(double a1,double e)
{double l,b,h,x,y,z,a,b1,c,n,w;
printf("请输入L:\n");
scanf("%lf%lf%lf",&a,&b1,&c);
l=HD(a,b1,c);
printf("请输入B:\n");
scanf("%lf%lf%lf",&a,&b1,&c);
e=sqrt(e2);
if (b==1)lbhxyz(a1,e);
else if(b==2)xyzlbh(a1,e);}
大地坐标与空间直角坐标的转换程序代码
#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"); }。
matlab大地测量空间直角坐标转换程序设计
一、实验目的 不同坐标系下空间直角坐标转换是测量工程中经常会遇到的问题,本实验 通过编写空间直角坐标七参数转换的程序,并对格式化文件数据进行计算,验 证程序,从而掌握空间直角转换的基本原理和方法。 二、实验内容: 1、空间直角坐标转换七参数模型(布尔莎模型) 布尔莎 -沃尔夫模型(在我国通常被简称为布尔莎模型 )又被称为七参数转换 (7-Parameter Transformation)或七参数赫尔墨特变换(7-Parameter Helmert Transformation) ,其数学公式为:
0 1 R1 ( X ) 0 cos X 0 sin X
cos Y 0 sin X R2 ( Y ) 0 cos X sin Y
0 sin Y 1 0 0 cos Y
cos Z R3 ( Z ) sin Z 0
七参数计算函数 TtransParam7_Comp 如下:
%由空间直角坐标求解七参数 x0,y0,z0,a1,a2,a3,a4 function Param7 = TtransParam7_Comp (x1,y1,z1,x2,y2,z2)
A=[x1,y1,z1,x2,y2,z2]; [m,n]=size(A); B=zeros(3*m,7);%创建一个 3m 行, 7 列的零矩阵 B L=zeros(3*m,1);%创建一个 3m 行, 1 列的零矩阵 L for i=1:m
-2-
B(3*i-2:3*i,:)=[1 0 0 x1(i) 0 -z1(i) y1(i); 0 1 0 y1(i) z1(i) 0 -x1(i); 0 0 1 z1(i) -y1(i) x1(i) 0] %for 循环组成 B 矩阵 L(3*i-2:3*i,:)=[x2(i),y2(i),z2(i)] %for 循环组成 L 矩阵 end gX=(inv(B'*B))*B'*L %计算误差方程的系数 %由 WGS-84 空间直角坐标和 BJ-54 空间直角坐标列方程组, %根据最小二乘法 VTPV=min 的原则,可列出法方程为求得布尔莎七参数 %根据求得的七参数通过反算,可将 WGS-84 空间直角坐标转化为 BJ-54 空间直角坐标 m=gX(4)-1; ex=(gX(5)/gX(4))*180/pi*3600; ey=(gX(6)/gX(4))*180/pi*3600; ez=(gX(7)/gX(4))*180/pi*3600; Param7=[gX(1),gX(2),gX(3),ex,ey,ez,m];%组成布尔莎七参数矩阵 End
大地坐标系与空间直角坐标系的相互转换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。
测绘程序设计结业考核报告大地坐标和大地空间直角坐标的互换
测绘程序设计结业考核报告大地坐标和大地空间直角坐标的互换学生姓名班级成绩指导教师(签字)地质与测绘学院测绘工程系年月日一、目的和意义坐标转换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。
通过建立两个坐标系统之间一一对应关系来实现。
是各种比例尺地图测量和编绘中建立地图数学基础必不可少的步骤。
在实际应用中必须变换到国家统一坐标系或地方独立坐标系上来。
因此, 这种坐标转换具有很大的现实意义, 使各种测量工作得到实时、快捷的同时得到坐标系统的统一。
二、原理和过程本程序数以大地坐标和大地空间直角坐标的相互换为内容展开的,其中包括了大地坐标系转化为大地空间直角坐标系,大地空间直角坐标系转化为大地坐标系,参数设置,打开文件,保存文件等功能。
界面清晰,简洁,易懂,可视化好。
(一)原理空间直角坐标系的坐标系原点位于参考椭球的中心,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 ++=(二)过程由源坐标类型转化为目标坐标类型,根据所选的椭球基准(椭球七参数),再计算出所需的参数,而后根据原理中的转换公式计算出所要求得的目标坐标的未知量。
大地坐标系和空间直角坐标系转换
{
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;
MATLAB实验大地坐标与空间直角坐标的换算程序设计(经典)
min=fix((du-degree)*60); second=(((du-degree)*60-min)*60); B=degree+min/100+second/10000; end
3、实例计算验证 首先将文件 data1.txt 中大地坐标转换为空间直角坐标, 并将转换后的数据按照格 式存贮在文件 data2.txt 中, data1.txt 格式为: data2.txt 格式为: x test 程序如下:
function [x, y, z] = geo2xyz (L, B, h) a=6378137; %椭球长半轴 f=1/298.257223563; %椭球扁率 b=a*(1-f); %求椭球短半轴 e=sqrt(a^2-b^2)/a; %椭球第一偏心率 N=a./sqrt(1-(e^2)*(sin(B)).^2); % 卯酉圈曲率半径 %大地坐标换算为空间直角坐标 x、 y、z x=(N+h).*cos(B).*cos(L); y=(N+h).*cos(B).*sin(L); z=[N.*(1-e^2)+h].*sin(B); end 度分秒转化为弧度函数如下: function azimuth=dms2rad(dms)%度分秒转弧度函数
大地坐标系和空间直角坐标系转换
aa[3][0]=6378137.000; aa[3][1]=6356752.314;
cout<<"请选择椭球体"<<endl;
cout<<"0:克拉索夫斯基椭球体"<<endl; //选择椭球体
cout<<"1: 1975年国际椭球体"<<endl;
return false;}
cout<<"谢谢您使用龚晓鹏编的程序,所有任务均已完成,欢迎下次使用,祝生活愉快"<<endl;
}
////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////空间直角坐标系换算到大地坐标系
Z=(N*(1-E1)+a.H)*sin(a.B);
cout<<"转换后的空间直角坐标是:"<<endl; //屏幕输出结果
cout<<"X "<<X<<endl;
cout<<"Y "<<Y<<endl;
cout<<"Z "<<Z<<endl;
cout<<"要保存数据吗?"<<endl;
cout<<"1:保存"<<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");}。
用CASIO fx4800P编空间直角坐标与大地坐标之间相互转换程序
空间直 角坐标 与大 地坐标 之间 的相互转换 问
域 。用它 实 现 坐标 转 换 可 随 时 随 地 算 出大 地 坐 标, 在踏勘 、 检查等 工作 中具有 明显 的优势 。
坐标转 换包括 同一基 准下 不同坐标 形式 之间
中图分 类号 :28 P 5
文献标 识码 :A
收稿 日期 : 07 6 2 20—0—1
P】 r 0
mI eo o d n t n e so t e o e i o d n t n n fCo r i a eCo v r in Bewe n Ge d tc Co r i a e a d Re t n u a p c o r i t ih CAS O x 8 0 ca g l rS a e C o d n e W t a I f4 0 P
维普资讯
第 4卷 第 4 期
20 0 7年 8月
工程 球物 旅 荸
CHI NES 0URNAL OF ENGI EJ NEERI NG OP YS CS GE H I
V0 . NO 4 14, .
Au g.,20 7 0
文章 编号 :6 2 7 4 (0 7 O 一 O 6一 O 17- 902 0 )4 3 6 3
标 与平 面坐标 之 间 的转 换 等 , 绘 的 目的 就是要 测
1 引 言
f4 0 P是 一种 运行 速 度快 、 带方便 、 x8 0 携 计算
功能强 、 用性广 的计算 工具 , 适 广泛应用 于测绘 领
将不 同形式 的坐 标 转换 为 我 们所 需 要 的坐 标 , 然 后为 我们工 程服务 。因此坐标 转换在 测绘 工作 中
S n Ch n i g ・ he ua m n
空间直角坐标系与空间大地坐标系的相互转换及其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°)。
大地坐标与空间直角坐标地转换程序代码
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"
空间直角坐标系与大地坐标系转换程序
空间直角坐标系与大地坐标系转换程序#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中的实现摘要随着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测量较常规测量更为优越。
空间直角坐标系坐标 - 空间大地坐标系坐标(XYZ-BLH)正反算
/ ** 计算椭球的卯酉圈曲率半径(单位:m)* /public static double getN(double B) {double a = 6378.137 * 1000;double b = 6356.7523141 * 1000;BigDecimal a1 = new BigDecimal(Double.toString(a));BigDecimal b1 = new BigDecimal(Double.toString(b));BigDecimal B1 = new BigDecimal(Double.toString(B));BigDecimal cosB1 = new BigDecimal(Double.toString(Math.cos(B1 .doubleValue())));BigDecimal one = new BigDecimal(Double.toString(1));BigDecimal e1 = new BigDecimal(Double.toString(a1.multiply(a1) .subtract(b1.multiply(b1)).divide(a1.multiply(a1), 100,BigDecimal.ROUND_HALF_UP).doubleValue()));BigDecimal W1 = new BigDecimal(Double.toString(Math.sqrt((one .subtract(e1.multiply(one.subtract(cosB1.multiply(cosB1))))) .doubleValue())));BigDecimal N1 = new BigDecimal(Double.toString(a1.divide(W1, 100, BigDecimal.ROUND_HALF_UP).doubleValue()));return N1.doubleValue();}/** 空间大地坐标系转换空间直角坐标系(单位:m)*/public static void GeodeticForCartesian(double B, double L, double H) {double a = 6378.137 * 1000;double b = 6356.7523141 * 1000;double iPI = 0.0174532925199433;// (π/180.0)BigDecimal a1 = new BigDecimal(Double.toString(a));BigDecimal b1 = new BigDecimal(Double.toString(b));BigDecimal B1 = new BigDecimal(Double.toString(B * iPI));BigDecimal L1 = new BigDecimal(Double.toString(L * iPI));BigDecimal H1 = new BigDecimal(Double.toString(H));BigDecimal one = new BigDecimal(Double.toString(1));BigDecimal e1 = new BigDecimal(Double.toString(a1.multiply(a1) .subtract(b1.multiply(b1)).divide(a1.multiply(a1), 100,BigDecimal.ROUND_HALF_UP).doubleValue()));BigDecimal cosB1 = new BigDecimal(Double.toString(Math.cos(B1 .doubleValue())));BigDecimal sinB1 = new BigDecimal(Double.toString(Math.sin(B1 .doubleValue())));BigDecimal cosL1 = new BigDecimal(Double.toString(Math.cos(L1 .doubleValue())));BigDecimal sinL1 = new BigDecimal(Double.toString(Math.sin(L1 .doubleValue())));BigDecimal N = newBigDecimal(Double.toString(getN(B1.doubleValue())));double X = N.add(H1).multiply(cosB1).multiply(cosL1).doubleValue();double Y = N.add(H1).multiply(cosB1).multiply(sinL1).doubleValue();double Z = newBigDecimal(Double.toString(N.multiply(one.subtract(e1)).add(H1).doubleValue())).multiply(sinB1).doubleValue();CartesianForGeodetic(X, Y, Z);}/** 空间直角坐标系转换空间大地坐标系(单位:m)*/public static void CartesianForGeodetic(double X, double Y, double Z) {double a = 6378.137 * 1000;double b = 6356.7523141 * 1000;double e = ((a * a) - (b * b)) / (a * a);double iPI = 0.0174532925199433;// (π/180.0)double B;double H;double N, tH, lB;double tB = Math.atan(Z / Math.sqrt(((X * X) + (Y * Y))));// 迭代算法while (true) {N = getN(tB);tH = Math.sqrt((X * X) + (Y * Y)) / Math.cos(tB) - N;lB = Math.atan((Z + (N * e * Math.sin(tB)))/ Math.sqrt((X * X) + (Y * Y)));if (Math.abs(lB - tB) > 1E-99) {tB = lB;} else {B = lB;N = getN(B);H = Math.sqrt((X * X) + (Y * Y)) / Math.cos(B) - N;break;}}B = B / iPI;double L = ((3.14159265358989) + Math.atan(Y / X))* (180 / 3.14159265358989);}。
坐标系转换c语言作业
《程序设计语言(C)》大作业报告题目:坐标系的转换完成人:小组构成及分工:*******独自完成程序的书写及调试.问题定义: 大地坐标和空间直角坐标系以及其他坐标系之间转换在卫星大地测量中经常用到的坐标系有,空间直角坐标系和大地直角坐标。
为了实现测量数据的快速高效的在不同的坐标系的转换,方便在学习及应用的中。
需要编写一程序实现数据的转换,实现空间直角坐标系与大地直角坐标之间在同一个系统中转换。
开发工具:Visual C++ 6.0数据结构描述:用不同的变量表示不同的坐标,变量选择时根据使用的习惯方便使用者的识别。
X:表示大地直角坐标的纵坐标;Y:表示大地直角坐标的横坐标;Z表示大地直角坐标的竖坐标L:表示空间直角坐标的经度;B:表示空间直角坐标的纬度;H:表示空间直角坐标的高度;算法描述:通过编写一个主函数描述出整个程序的主体不分,然后通过调用函数实现坐标的转换。
程序调试情况:坐标由大地直角坐标系中的转换为空间直角坐标系的坐标:大地直角坐标转换后空间直角坐标:B=60; X=2055059.130122;L=50; Y=2449123.986892;H=100; Z=5500477.615329;坐标由空间直角坐标系中的坐标转换为大地直角坐标系中的坐标;空间直角坐标转换后大地直角坐标;X=100; B=-127.103127844;Y=100; L=45.000000000;Z=10000; H=-6391994.685276;参考文献或网站:1.《控制测量学》(下册)第三版孔祥元郭际明主编武汉大学出版社;2. 《数字测图原理与方法》第二版潘正风程效军成枢王腾军宋伟东邹进贵编著武汉大学出版社;3.《C 程序设计语言》魏东平朱连章于广斌编著;电子工业出版社心得体会:写这个大作业确实让我收获了许多!1.写这次计算机大作业,让我经历了一个难忘的过程。
自己的是必须得自己独立自主的想办法去解决,没人会为与自己没多大关系的事分很多神的!2.经历了过程,让我学到了些东西也在解决困难的过程中认识了些学长,他们也教会了我许多学习经验。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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");}。