⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 卫星导航程序.cpp

📁 本程序是用于WGS-84向北京1954坐标系转换的。要想进行转换需要至少3个控制点。这些后
💻 CPP
字号:
#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+14*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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -