一、大地坐标(B, L, H)>>空间直角坐标(X, Y, Z)
分享给有需要的人,代码质量勿喷。
//B、L的单位是弧度,H的单位是米;X、Y、Z的单位是米
//大地坐标(B,L,H)-->空间直角坐标(X,Y,Z)
std::vector<double> CoordinateTransform::GeodeticBLH__SpaceRectangularXYZ(
const double &B, const double &L, const double &H, const Ellipsoid ¶Ellipsoid)
{
/* N是卯酉圈曲率半径 */
double N0 = paraEllipsoid.e1*paraEllipsoid.e1* std::sin(B)*std::sin(B);
double N = paraEllipsoid.a / std::sqrt(1 - N0);
double X = (N + H)*std::cos(B)*std::cos(L);
double Y = (N + H)*std::cos(B)*std::sin(L);
double Z = (H + N * (paraEllipsoid.b*paraEllipsoid.b / paraEllipsoid.a / paraEllipsoid.a))*std::sin(B);
std::vector<double> vXYZ = { X,Y,Z };
return vXYZ;
}
二、空间直角坐标(X, Y, Z)>>大地坐标(B, L, H)
2.1 方法1
2.2 方法2
分享给有需要的人,代码质量勿喷。
//X、Y、Z的单位是米;B、L的单位是弧度,H的单位是米
//空间直角坐标(X,Y,Z)-->大地坐标(B,L,H)
std::vector<double> CoordinateTransform::SpaceRectangularXYZ__GeodeticBLH(
const double &X, const double &Y, const double &Z, const Ellipsoid ¶Ellipsoid)
{
double L = std::atan2(Y, X);
double oo = std::atan(Z*paraEllipsoid.a / paraEllipsoid.b / (std::sqrt(X*X + Y * Y)));
double B0 = Z + (paraEllipsoid.a*paraEllipsoid.a / paraEllipsoid.b / paraEllipsoid.b - 1)*paraEllipsoid.b*std::pow(std::sin(oo), 3);
double B1 = std::sqrt(X*X + Y * Y) - paraEllipsoid.e1*paraEllipsoid.e1*paraEllipsoid.a*std::pow(std::cos(oo), 3);
double B = std::atan(B0 / B1);
double N0 = 1 - paraEllipsoid.b*paraEllipsoid.b / paraEllipsoid.a / paraEllipsoid.a;
N0 *= std::sin(B)*std::sin(B);
double N = paraEllipsoid.a / std::sqrt(1 - N0);
double H = std::sqrt(X*X + Y * Y) / std::cos(B) - N;
std::vector<double> vBLH = { B / PI * 180,L / PI * 180,H };
return vBLH;
}
三、参考
[1]孔祥元,郭标明,刘宗泉. 大地测量学基础[M]. 武汉:武汉大学出版社,2001.36-39.