代码如下
/**
*转换ECEF(以地球为中心的地球固定)坐标为LLA WGS84 (Lat, Lon, Alt)。
* @param ecef_x ECEF x坐标[m]
* @param ecef_y ECEF y坐标[m]
* @param ecef_z ECEF Z-coordinate [m]
* @param latitude [deg]
* @param longitude [deg]
* @param海拔[m]
*/
void ECEF2lla(double ecef_x, double ecef_y, double ecef_z, double &latitude, double &longitude,
float &altitude)
{
// WGS84椭球常数
constexpr double a = 6378137.; // 半径
constexpr double e = 8.1819190842622e-2; // 轨道偏心率
constexpr double asq = a * a;
constexpr double esq = e * e;
double x = ecef_x;
double y = ecef_y;
double z = ecef_z;
double b = sqrt(asq * (1. - esq));
double bsq = b * b;
double ep = sqrt((asq - bsq) / bsq);
double p = sqrt(x * x + y * y);
double th = atan2(a * z, b * p);
longitude = atan2(y, x);
double sin_th = sin(th);
double cos_th = cos(th);
latitude = atan2(z + ep * ep * b * sin_th * sin_th * sin_th, p - esq * a * cos_th * cos_th * cos_th);
double sin_lat = sin(latitude);
double N = a / sqrt(1. - esq * sin_lat * sin_lat);
altitude = (float)(p / cos(latitude) - N);
// 弧度转角度
longitude *= 180. / M_PI;
latitude *= 180. / M_PI;
// 校正极点附近的高度。
}
参考
1.移植自:https://stackoverflow.com/a/25428344
转载请注明出处谢谢。