北东地坐标系转经纬度坐标系c++代码
时间: 2023-10-02 15:04:38 浏览: 58
北东地坐标系(也称为高斯投影坐标系)转换为经纬度坐标系需要知道该点所在的投影带以及该带的椭球参数。以下是一个简单的 C++ 代码示例,用于将北东地坐标系转换为经纬度坐标系:
```C++
#include <cmath>
const double pi = 3.14159265358979323846;
struct GeoPoint {
double longitude; // 经度
double latitude; // 纬度
};
struct GaussPoint {
double x; // 北向坐标
double y; // 东向坐标
};
struct ProjParam {
double a; // 椭球长半轴
double b; // 椭球短半轴
double L0; // 中央经线
double k0; // 比例因子
double e2; // 第一偏心率平方
double e1; // 第一偏心率
double e12; // 第二偏心率平方
};
// 将弧度转换为度
double rad2deg(double rad) {
return rad / pi * 180.0;
}
// 将度转换为弧度
double deg2rad(double deg) {
return deg / 180.0 * pi;
}
// 计算子午圈半径
double getRm(ProjParam param, double B) {
double sinB = sin(deg2rad(B));
return param.a * (1 - param.e2) / pow(1 - param.e2 * sinB * sinB, 1.5);
}
// 将北东地坐标系的点转换为经纬度坐标系的点
GeoPoint GaussToGeo(GaussPoint gauss, ProjParam param) {
double x = gauss.x;
double y = gauss.y;
double L0 = deg2rad(param.L0);
double x0 = 500000.0;
double y0 = 0.0;
double k0 = param.k0;
double dx = x - x0;
double dy = y - y0;
double e2 = param.e2;
double e1 = param.e1;
double e12 = param.e12;
double Bf = dy / (param.a * k0);
double Mf = getRm(param, Bf) * Bf;
double Nf = param.a / sqrt(1 - e2 * sin(Bf) * sin(Bf));
double t = tan(Bf);
double tf = e12 * cos(Bf) * cos(Bf);
double df = dx / (Nf * k0);
double B = Bf - tf * t * (df * df - pow(df, 4.0) / 3.0);
double L = L0 + df - (1 + 2 * tf + 3 * tf * tf) * t * t * df * df / 2 + (2 + 5 * tf + 28 * tf * tf + 24 * tf * tf * tf) * t * t * t * t * df * df * df / 24;
GeoPoint point = {rad2deg(L), rad2deg(B)};
return point;
}
```
其中,`GaussPoint` 表示北东地坐标系的点,`GeoPoint` 表示经纬度坐标系的点,`ProjParam` 表示投影带的椭球参数。`getRm` 函数用于计算子午圈半径,`GaussToGeo` 函数用于将北东地坐标系的点转换为经纬度坐标系的点。