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

📄 gpschange.cpp

📁 很好的GPS源码
💻 CPP
字号:
//#include "stdafx.h"
#include "math.h"
//#include "gps.h"

/////////////////////////////////////////////////////////////
//弧度转化为度
//input:
//弧度值
//return:
//度、分、秒(xx.xxxxxx)
//            -- ------
//            度 分 秒
/////////////////////////////////////////////////////////////
double hdhd(double x)
{
	double xx,x1,y;
	double z,pi;
	double out;
	pi=3.1415926535897932;
	xx=x;
	xx=xx*180.0/pi;
	x1=(xx);
	y= ((xx-x1)*60.0);
	z=(xx-x1-y/60.0)*3600.0;
	xx=x1+y/100.0+z/10000.0;
	out=xx;
	return out;
}

/////////////////////////////////////////////////////////////
//度化为弧度
//input:
//度、分、秒(xx.xxxxxx)
//            -- ------
//            度 分 秒
//return:
//弧度
/////////////////////////////////////////////////////////////
double dhhd(double x)
{
	double xx,x1,y;
	double z,pi;
	double out;
	pi=3.1415926535897932;
	xx=x;
	x1=(xx);
	y=((xx-x1)*100.0);
	z=(xx-x1);
	z=z*100.0-y;
	z=z*100.0;
	xx=(x1+y/60.0+z/3600.0)*pi/180.0;
	out=xx;
	return out;
}

/////////////////////////////////////////////////////////////
//GPS度化为弧度
//input:
//度、分(xx xx.xxxx)
//        -- ------
//        度 分 
//return:
//弧度
/////////////////////////////////////////////////////////////
double GPSdhhd(double x)
{
	double xx1,xx2;
	double out;
	double pi;
	pi=3.1415926535897932;
	xx1 = int(x)/100;
	xx2 = x - xx1*100;

	out = (xx1 +xx2/60.) * pi /180.;
	return out;
}

///////////////////////////////////////////////////////////
//WGS84向新北京54坐标系转换
//input:
//WGS84中的纬度、经度(度、分、秒 如23.12569含义是23为度、12为分、569为秒)、大地高
//output:
//新北京54坐标系中的纬度、经度(度、分、秒)、大地高
///////////////////////////////////////////////////////////
void WGS84toNewBJ54(double WGS84B, double WGS84L, double WGSH, double& NewBJ54B, double& NewBJ54L, double& NewBJ54H)
{
	double wd,l,h,rou,n,dl,dh,db,da,df,b,e,mm;
	double dx,dy,dz,ex,ey,ez,m;

	//54坐标系中的a,f
	double a1=6378245.0;
	double f1=(1.0/298.3);
	//84坐标系中的a,f
	double a=6378137.0;
	double f=(1.0/298.257223563);

	dx=-15.415; dy=157.025; dz=94.740;
	ex=0.312; ey=0.080; ez=0.102; m=-1.465e-6;
	rou=3600.0*180.0/3.1415926535;

//	wd=dhhd(WGS84B);
	wd=GPSdhhd(WGS84B);
//	l=dhhd(WGS84L);
	l=GPSdhhd(WGS84L);

	h=WGSH;
	b=a-f*a;
	e=(a*a-b*b)/(a*a);
	da=a1-a;
	df=f1-f;
	n=a/(sqrt(1.0-e*sin(wd)*sin(wd)));
	mm=a*(1-e)/(sqrt(1.0-e*sin(wd)*sin(wd))*sqrt(1.0-e*sin(wd)*sin(wd))*
		sqrt(1.0-e*sin(wd)*sin(wd)));
	dl=rou*(dy*cos(l)-dx*sin(l))/((n+h)*cos(wd))+(1.0-e)*tan(wd)*(cos(l)*
		ex+sin(l)*ey)-ez;
	db=rou*(-dx*sin(wd)*cos(l)-dy*sin(wd)*sin(l)+dz*cos(wd)+f*sin(2.0*wd)
		*(da-a*m)+(1.0-f*cos(2.0*wd))*sin(2.0*wd)*a*df)/(mm+h)-(1.0+e*
		cos(2.0*wd))*((sin(l)*ex-cos(l)*ey));
	dh=dx*cos(wd)*cos(l)+dy*cos(wd)*sin(l)+dz*sin(wd)-(1.0-f*sin(wd)*
	sin(wd))*(da-a*m)+a*(1.0-f*cos(wd)*cos(wd))*sin(wd)*sin(wd)*
		df-a*f*sin(2.0*wd)*(sin(l)*ex-cos(l)*ey)/rou+h*m;
	NewBJ54B=wd+db/rou;
	NewBJ54L=l+dl/rou;
	NewBJ54H=h+dh;
	NewBJ54B=hdhd(wd+db/rou);
	NewBJ54L=hdhd(l+dl/rou);
	NewBJ54H=h+dh;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:正解高斯克吕格投影投影
//参数说明: l0----中央经线;单位:度;
//      lx,bx-----经纬坐标;单位:度、分、秒;
//      x,y-------高斯坐标,x(--->方向)为横假定值、y为纵坐标;单位为:米;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//void gsdy(double l0,double lx, double bx, double a,double e,double ee, double * x, double * y)

void gsdy(double l0,double lx, double bx, double &x, double &y)
{
	double p,fi,dm,w,an,a1,a2,b1,b2,s,a3,b3;
	double b0,b4,rou;
	double e,ee,a;

/* bx=26.45326664;
 lx=127.44528306;
 l0=129;
*/
	e=0.006693421622966;
	ee=0.006738525414684;
	a=6378245.0;
	p=3.1415926535/180.0;
	fi=dhhd(bx);
	dm=dhhd(lx)-dhhd(l0);
	w=ee*cos(fi)*cos(fi);
	an=a/sqrt(1.0-e*sin(fi)*sin(fi));

	rou=206264.806247096355;
	b0=a*(1.0-e)*(1+(3.0/4.0)*e+(45.0/64.0)*e*e+(175.0/256.0)
		*e*e*e+(11025.0/16384.0)*e*e*e*e+(43659.0/65536.0)
		*e*e*e*e*e+(693693.0/1048576.0)*e*e*e*e*e*e
		+(2760615.0/4194304.0)*e*e*e*e*e*e*e);
	b1=-a*(1.0-e)*((3.0/4.0)*e+(15.0/16.0)*e*e+(525.0/512.0)*
		e*e*e+(2205.0/2048)*e*e*e*e);
	b2=a*(1.0-e)*((15.0/64.0)*e*e+(105.0/256.0)*e*e*e+
		(2205.0/4096.0)*e*e*e*e);
	b3=-a*(1.0-e)*((35.0/512.0)*e*e*e+(315.0/2048.0)*e*e*e*e);
	b4=a*(1.0-e)*((315.0/16384.0)*e*e*e*e);
	s=b0*fi+b1/2*sin(2*fi)+
	b2/4*sin(4*fi)+b3/6*sin(6*fi)+
	b4/8*sin(8*fi);
	a1=an*sin(fi)*cos(fi)/2;
	a2=an*sin(fi)*pow(cos(fi),3)*(5.0-pow(tan(fi),2)+9*w+4*pow(w,2))/24;
	a3=an*sin(fi)*pow(cos(fi),5)*(61-58*pow(tan(fi),2)+pow(tan(fi),4))/720;
	b1=an*cos(fi);
	b2=an*pow(cos(fi),3)*(1.0-tan(fi)*tan(fi)+w)/6.0;
	b3=an*pow(cos(fi),5)*(5.0-18.0*pow(tan(fi),2)+pow(tan(fi),4)+14*w-
		58*w*pow(tan(fi),2))/120.0;
	y=s+a1*pow(dm,2)+a2*pow(dm,4)+a3*pow(dm,6);
	x=b1*dm+b2*pow(dm,3)+b3*pow(dm,5)+500000;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//参数说明: h ---- 中央经线;单位:度;
//WGS84中的纬度、经度(3954.6453)、大地高
//                    XX度、xx.xxxx分
//      x,y-------高斯坐标,x(--->方向)为横假定值、y为纵坐标;单位为:米;
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//	调用示例  GpsToNodeXY(3954.6346, 11625.7019, 0, x, y);
void GpsToNodeXY(double x0, double y0, double h, double &x,double &y)
{
	double xx, yy, zz;

	WGS84toNewBJ54(x0, y0, h,xx, yy, zz);
	gsdy(117, yy, xx, x, y);
	x +=20000000+40;
}

⌨️ 快捷键说明

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