坐标转换之WGS84坐标转换到火星坐标GCJ02

GNSS设备采集数据后,用到地图上需要转换,这里提供一下c版本的WGS84与GCJ02的转换代码。

cpp 复制代码
double  x_pi = 3.14159265358979324 * 3000.0 / 180.0;
double pi = 3.1415926535897932384626;
double a = 6378245.0;
double ee = 0.00669342162296594323;




//********************************************
int out_of_china(double lng, double lat) {

	if (lng < 72.004 || lng > 137.8347)return 0;
    if (lat < 0.8293 || lat > 55.8271)return 0;
	return 1;
			
}
//********************************************
double transformlat(double lng, double lat) {

	double ret = 0;

	ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * sqrt(fabs(lng));
		
	ret += (20.0 * sin(6.0 * lng * pi) + 20.0 * sin(2.0 * lng * pi)) * 2.0 / 3.0;

	ret += (20.0 * sin(lat * pi) + 40.0 * sin(lat / 3.0 * pi)) * 2.0 / 3.0;

	ret += (160.0 * sin(lat / 12.0 * pi) + 320 * sin(lat * pi / 30.0)) * 2.0 / 3.0;
	return ret;
}
//********************************************
double transformlng(double lng, double lat) {

	double ret = 0;
	ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(fabs(lng));

	ret += (20.0 * sin(6.0 * lng * pi) + 20.0 *sin(2.0 * lng * pi)) * 2.0 / 3.0;
		
	ret += (20.0 * sin(lng * pi) + 40.0 * sin(lng / 3.0 * pi)) * 2.0 / 3.0;
		
	ret += (150.0 * sin(lng / 12.0 * pi) + 300.0 * sin(lng / 30.0 * pi)) * 2.0 / 3.0;
	return ret;
}

//********************************************
void  wgs84togcj02(double lng, double lat,double* lnglat) {

	double  dlat = 0.0, dlng =0.0, radlat =0.0, magic =0.0,sqrtmagic = 0.0;

	// 中国区域 
	if (!out_of_china(lng, lat)) return;
	 dlat = transformlat(lng-105.0, lat- 35.0);
	 dlng = transformlng(lng-105.0, lat-35.0);

	 radlat = lat / 180.0 * pi;
	 magic = sin(radlat);
	 magic = 1 - ee * magic * magic;

	sqrtmagic = sqrt(magic);
	dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);
	dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * pi);
	  

	lnglat[0] = lng + dlng;
	lnglat[1] = lat + dlat;

}


//********************************************

void gcj02towgs84(double lng, double lat,double* lnglat) {

	double dlat = 0.0, dlng = 0.0, radlat = 0.0, magic = 0.0, sqrtmagic = 0.0, mglat = 0.0, mglng = 0.0;
	if (!out_of_china(lng, lat)) return;
	 dlat = transformlat(lng - 105.0, lat - 35.0);
	 dlng = transformlng(lng - 105.0, lat - 35.0);
	 radlat = lat / 180.0 * pi;
	 magic = sin(radlat);
	 magic = 1 - ee * magic * magic;
	 sqrtmagic = sqrt(magic);
	 dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);
	 dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * pi);
   
	 mglat = lat + dlat;
	 mglng = lng + dlng;

	lnglat[0] = lng * 2 - mglng;
	lnglat[1] = lat * 2 - mglat;

}
相关推荐
Script_Man2 个月前
VBA进行excel坐标转换
算法·自动化·vba·坐标转换·combobox·excel画图
流浪猪头拯救地球7 个月前
C# 项目:导线计算 / 坐标转换 / 曲线放样 / 水准网 / 导线网平差
开发语言·c#·坐标转换·平差
斯内科9 个月前
C#实现坐标系转换
算法·坐标转换·物体旋转
一颗小树x1 年前
3D目标检测数据集 KITTI(标签格式解析、点云转图像、点云转BEV)
人工智能·数据集·坐标转换·3d目标jianc·kitti
天使画笔1 年前
WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换 资料收集
百度·gps·坐标转换
占星安啦1 年前
坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)
postgresql·sqlserver·geoserver·坐标转换·geotools