问题
给定经纬度和海拔高度数据,计算在WGS84坐标系中对应的坐标值数据。
简单记录一下。
思路
1、依据公式计算,公式查相关资料。
2、借助第三方库GeographicLib计算
解决
1、依据公式计算
/*!
* 计算指定经纬度和海拔的点在WGS84坐标系中的对应的坐标值
* \param [in] dLongitude 经度 东经为正 西经为负
* \param [in] dLatitude 纬度 北纬为正 南纬为负
* \param [in] dHeight 海拔 基于海平面
* \param [out] x
* \param [out] y
* \param [out] z
*/
void CalculateWGS84PointByLongLatHeight(const double& dLongitude, const double& dLatitude, const double& dHeight, double& x, double& y, double& z)
{
// WGS84参考 ellipsoid 参数
const double dLongAxis = 6378137.0; // 长半轴
const double dShortAxis = 6356752.31424518; // 短半轴
// 经纬度转换为弧度
double dLat = dLatitude * Z_PI / 180;
double dLon = dLongitude * Z_PI / 180;
double N = dLongAxis / (sqrt(1 - ((dLongAxis * dLongAxis - dShortAxis * dShortAxis) / (dLongAxis * dLongAxis)) * sin(dLat) * sin(dLat)));
x = (N + dHeight) * cos(dLat) * cos(dLon);
y = (N + dHeight) * cos(dLat) * sin(dLon);
z = ((dShortAxis * dShortAxis * N) / (dLongAxis * dLongAxis) + dHeight) * sin(dLat);
}
2、借助第三方库GeographicLib计算
GeographicLib库的GitHub链接:/geographiclib/geographiclib
#include "Geographiclib/"
...
// 创建Geocentric对象
GeographicLib::Geocentric earth(GeographicLib::Constants::WGS84_a(), GeographicLib::Constants::WGS84_f());
// 将经纬度转换为地心直角坐标系中的坐标
double x,y,z;
earth.Forward(dLatitude, dLongitude, dHeight, x, y, z);
...
ok!搞定!数据结果测试通过!