由于项目需要,了解了关于高斯坐标和地理坐标的相关知识,当然也只是略懂,因为需要在代码中实现,因此也在网上搜索了相关资料,在此记录一下
这里一共两份高斯坐标与地理坐标转换的代码,各有优缺点
代码1
这原本是java代码,我略微修改了一下变成C++代码了
// 高斯坐标和地理坐标的相互转换
class Convertor {
public:
~Convertor() {}
double a;//'椭球体长半轴
double b;// '椭球体短半轴
double f; //'扁率
double e;// '第一偏心率
double e1; //'第二偏心率
double FE;//'东偏移
double FN;//'北偏移
double L0;//'中央经度
double W0;//'原点纬线
double k0;//'比例因子
/**
* 幂函数
* @param e
* @param i
* @return
*/
double MZ(double e, int i) {
return pow(e, i);
}
/**
* 说明: 用于初始化转换参数
*
* @param TuoqiuCanshu 枚举类型,提供北京54、西安80和WGS84三个椭球参数
* @param CentralMeridian 中央经线
* @param OriginLatitude 原点纬度,如果是标准的分幅,则该参数是0
* @param EastOffset 东偏移
* @param NorthOffset 北偏移
*/
Convertor(int TuoqiuCanshu, double CentralMeridian, double OriginLatitude, double EastOffset, double NorthOffset) {
/**
* 'Krassovsky (北京54采用) 6378245 6356863.0188
* 'IAG 75(西安80采用) 6378140 6356755.2882
* 'WGS 84 6378137 6356752.3142
* 'CGC 2000 6378137 6356752.31414
*/
if (TuoqiuCanshu == 0)//北京五四
{
a = 6378245;
b = 6356863.0188;
}
else if (TuoqiuCanshu == 1)// '西安八零
{
a = 6378140;
b = 6356755.2882;
}
if (TuoqiuCanshu == 2)//'WGS84
{
a = 6378137;
b = 6356752.3142;
}
if (TuoqiuCanshu == 3)//'CGC2000坐标
{
a = 6378137;
b = 6356752.31414;
}
f = (a - b) / a;//扁率
//e = sqrt(1 - MZ((b / a) ,2));//'第一偏心率
e = sqrt(2 * f - MZ(f, 2));//'第一偏心率
//eq = sqrt(MZ((a / b) , 2) - 1);//'第二偏心率
e1 = e / sqrt(1 - MZ(e, 2));//'第二偏心率
L0 = CentralMeridian;//中央经
W0 = OriginLatitude;//原点纬线
k0 = 1;//'比例因