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

📄 gaosi.h

📁 用 c++编写的GPS水准拟合的程序
💻 H
字号:
#include "string.h"
#include "iostream.h"
#include "stdio.h"
#include "matrix.h"
#include "io_matrix.h"
#include "math.h"
#include "angle.h"

double a=6378137.00;
double A=1/298.3;//A=1/298.257223563;
double ee=2*A-A*A;
double A0=1+0.75*ee+45*pow(ee,2)/64+175*pow(ee,3)/256
		+11025*pow(ee,4)/16384 + 43659*pow(ee,5)/65536 + 693693*pow(ee,6)/1048576;
double B0=A0-1,
       C=15*pow(ee,2)/32+175*pow(ee,3)/256+3675*pow(ee,4)/8192+14553*pow(ee,5)/32768+231231*pow(ee,6)/524288,
	   D=35*pow(ee,3)/96+735*pow(ee,4)/2048+14553*pow(ee,5)/40960+231231*pow(ee,6)/655360,
	   E=315*pow(ee,4)/1024+6237*pow(ee,5)/20480+99099*pow(ee,6)/327680,
	   F=693*pow(ee,5)/2560+11011*pow(ee,6)/40960,
	   G=1001*pow(ee,6)/4096;
//下式求取子午线弧长,式中第二项中均减一项就可变为求两纬度(B到B1)之间(某经度)的子午线
//弧长如将B0*sin(B)*cos(B)变为B*(sin(B)*cos(B)-B*sin(B1)*cos(B1)),其他项类似
double s(double B)//B为纬度值,求取纬度B处子午线弧长
{  
	double S=0.00;
	S=a*(1-ee)*(A0*B-B0*sin(B)*cos(B)-C*pow(sin(B),3)*cos(B)
		-D*pow(sin(B),5)*cos(B)-E*pow(sin(B),7)*cos(B)
		-F*pow(sin(B),9)*cos(B)-G*pow(sin(B),11)*cos(B));
	return S;
}

double sp(double Bk)
{  
	double S=0.00;
	S=a*(1-ee)*((A0-B0*cos(2*Bk))-C*pow(sin(Bk),2)*(cos(2*Bk)+2*pow(cos(Bk),2))
			-D*pow(sin(Bk),4)*(cos(2*Bk)+4*pow(cos(Bk),2))
			-E*pow(sin(Bk),6)*(cos(2*Bk)+6*pow(cos(Bk),2))
			-F*pow(sin(Bk),8)*(cos(2*Bk)+8*pow(cos(Bk),2)));
	return S;
}

matrix invert(double ee,double a,matrix BL,double l0)//高斯投影正算
{
	int n=BL.getrows(),i=0;
	matrix xy(n,2);
    double S=0.00, x=0.00,y=0.00,N,W,t,ep=0.00,k,l;//ep为第二偏心率
    for(i=0;i<n;i++)
	{
		double B=dtor(BL.getele(i,0)),L=dtor(BL.getele(i,1));	
		S=s(B);
		W=sqrt(1-ee*sin(B)*sin(B));
		N=a/W;
		t=tan(B);
		ep=sqrt(ee/(1-ee));
		k=ep*cos(B);
		l=L-l0;
        x=S+N*sin(B)*cos(B)*pow(l,2)/2
			+N*sin(B)*pow(cos(B),3)*pow(l,4)*(5-pow(t,2)+9*pow(k,2)+4*pow(k,4))/24
			+N*sin(B)*pow(cos(B),5)*pow(l,6)*(61-58*pow(t,2)+pow(t,4))/24;
		y=N*cos(B)*l+N*pow(cos(B),3)*pow(l,3)*(1-pow(t,2)+pow(k,2))/6
          +N*pow(cos(B),5)*pow(l,5)*(5-18*pow(t,2)+14*pow(k,2)+pow(t,4)-58*pow(t,2)*pow(k,2))/120;
		xy.setele(i,0,x);
		xy.setele(i,1,y);		
	}
    return xy;
}

matrix revert(double ee,double a,matrix xy,double l0)//高斯投影反算
{
	int n=xy.getrows(),i=0;
	matrix BL(n,2);
	double B,L,l,d,ep,t,k,N,W;
	double Mf=0.00;
    for(i=0;i<n;i++)
	{
		double x=xy.getele(i,0),y=xy.getele(i,1);
		double Bk,Sk,Sp,Bf;
		ep=sqrt(ee/(1-ee));
		//Sp为Sk的导数值,Sk为纬度1、2子午线弧长 ,ep为第二偏心率
        Bk=x/(a*(1-ee)*A0);
	    Sk=s(Bk);
		Sp=sp(Bk);
		B=Bk+(x-Sk)/Sp;
		while(fabs(x-Sk)>0.00001)
		{
			Bk=B;
            Sp=sp(Bk);
	        Sk=s(Bk);
		    B=Bk+(x-Sk)/Sp;
		} 
		Bf=B; //cout<<"\nBf=  "<<Bf<<endl;
		if(fabs(Bf-PI/2)<1e-10)  cout<<"所获得的纬度值接近90度,其求解可能异常!\n";
		t=tan(Bf);
		k=ep*cos(Bf);
		W=sqrt(1-ee*sin(Bf)*sin(Bf));
		N=a/W;
		Mf=a*(1-ee)/(pow(W,3));
		d=y/N;
		l=d*(1-(1+2*pow(t,2)+pow(k,2))*pow(d,2)/6
		+(5+28*pow(t,2)+24*pow(t,4)+6*pow(k,2)+8*pow(k,2)*pow(t,2))*pow(d,4)/120)/cos(Bf);
		B=Bf-t*y*d*(1-(5+3*pow(t,2)+pow(k,2)-9*pow(k,2)*pow(t,2))*pow(d,2)/12
		+(61+90*pow(t,2)+45*pow(t,4))*pow(d,4)/360)/(2*Mf);
		L=l+l0;
		B=rtod(B);L=rtod(L);
		BL.setele(i,0,B);
		BL.setele(i,1,L);
	}
    return BL;
}


⌨️ 快捷键说明

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