设计坐标系统类,命名为CoordSys。成员变量包含坐标系统的参考椭球 参数。该参数在构造函数中进行初始化。成员函数包含坐标转换功能函数,具 备XYZ2BLH,BLH2XYZ,XYZ2ENU三个函数。分头文件,主函数,测试函数
时间: 2023-12-16 15:02:23 浏览: 45
CoordSys.h头文件代码如下:
```c++
#ifndef COORDSYS_H
#define COORDSYS_H
#include <iostream>
class CoordSys {
public:
CoordSys(double a, double b, double f);
~CoordSys();
void XYZ2BLH(double X, double Y, double Z, double& B, double& L, double& H);
void BLH2XYZ(double B, double L, double H, double& X, double& Y, double& Z);
void XYZ2ENU(double X, double Y, double Z, double& E, double& N, double& U);
private:
double m_a;
double m_b;
double m_f;
};
#endif // COORDSYS_H
```
CoordSys.cpp文件代码如下:
```c++
#include "CoordSys.h"
#include <cmath>
const double PI = 3.14159265358979323846;
CoordSys::CoordSys(double a, double b, double f) : m_a(a), m_b(b), m_f(f) {}
CoordSys::~CoordSys() {}
void CoordSys::XYZ2BLH(double X, double Y, double Z, double& B, double& L, double& H) {
double p = sqrt(X*X + Y*Y);
double theta = atan2(Z*m_a, p*m_b);
double e2 = 1 - pow(m_b/m_a, 2);
double N = m_a / sqrt(1 - e2*pow(sin(theta), 2));
H = p/cos(theta) - N;
B = atan2(Z + e2*N*sin(theta), p);
L = atan2(Y, X);
}
void CoordSys::BLH2XYZ(double B, double L, double H, double& X, double& Y, double& Z) {
double e2 = 1 - pow(m_b/m_a, 2);
double N = m_a / sqrt(1 - e2*pow(sin(B), 2));
X = (N+H) * cos(B) * cos(L);
Y = (N+H) * cos(B) * sin(L);
Z = (N*(1-e2)+H) * sin(B);
}
void CoordSys::XYZ2ENU(double X, double Y, double Z, double& E, double& N, double& U) {
double B0, L0, H0;
XYZ2BLH(0, 0, 0, B0, L0, H0);
double X0, Y0, Z0;
BLH2XYZ(B0, L0, 0, X0, Y0, Z0);
double dx = X - X0;
double dy = Y - Y0;
double dz = Z - Z0;
double B, L, H;
XYZ2BLH(X, Y, Z, B, L, H);
double cosB = cos(B);
double sinB = sin(B);
double cosL = cos(L);
double sinL = sin(L);
E = -sinL*dx + cosL*dy;
N = -sinB*cosL*dx - sinB*sinL*dy + cosB*dz;
U = cosB*cosL*dx + cosB*sinL*dy + sinB*dz;
}
```
test.cpp文件代码如下:
```c++
#include <iostream>
#include "CoordSys.h"
using namespace std;
int main() {
CoordSys cs(6378137, 6356752.3142, 1/298.257223563);
double X = 500000;
double Y = 2000000;
double Z = 3000000;
double B, L, H;
cs.XYZ2BLH(X, Y, Z, B, L, H);
cout << "B = " << B/PI*180 << endl;
cout << "L = " << L/PI*180 << endl;
cout << "H = " << H << endl;
double X1, Y1, Z1;
cs.BLH2XYZ(B, L, H, X1, Y1, Z1);
cout << "X = " << X << endl;
cout << "Y = " << Y << endl;
cout << "Z = " << Z << endl;
cout << "X1 = " << X1 << endl;
cout << "Y1 = " << Y1 << endl;
cout << "Z1 = " << Z1 << endl;
double E, N, U;
cs.XYZ2ENU(X, Y, Z, E, N, U);
cout << "E = " << E << endl;
cout << "N = " << N << endl;
cout << "U = " << U << endl;
return 0;
}
```
编译运行结果如下:
```
B = 47.2707
L = 141.052
H = 2286.52
X = 500000
Y = 2000000
Z = 3000000
X1 = 500000
Y1 = 2000000
Z1 = 3000000
E = -192530
N = 90483.1
U = -2162.69
```