C++ 实现海拔高转换椭球高互转
时间: 2023-08-12 08:32:38 浏览: 331
海拔高和椭球高之间的转换,是高程数据在不同基准面之间的转换。在C++中实现海拔高和椭球高之间的互转,可以借助之前实现的海拔高转换和椭球高转换的函数,分别实现两种高程之间的转换。
以下是一个简单的C++代码示例,实现了海拔高和椭球高之间的互转:
```c++
#include <cmath>
using namespace std;
// 地球椭球体参数
const double a = 6378137.0; // 长半轴
const double b = 6356752.3142; // 短半轴
const double e2 = (a * a - b * b) / (a * a); // 第一偏心率的平方
// 正常高转大地水准面高
double normal2geoid(double h, double lat) {
double gm = 9.7803253359; // 椭球重力加速度
double k = 0.00193185138639; // 常数
double sin2lat = sin(lat) * sin(lat);
double m = gm / sqrt(1 - e2 * sin2lat);
double g = gm * (1 + k * sin2lat) / (m + h);
double N = a / sqrt(1 - e2 * sin2lat);
double H = (m * h - g * (N + h)) / g;
return H;
}
// 椭球高转大地水准面高
double ellipsoid2geoid(double h, double lat) {
double N = a / sqrt(1 - e2 * sin(lat) * sin(lat));
double H = h - N;
return H;
}
// 大地水准面高转椭球高
double geoid2ellipsoid(double H, double lat) {
double N = a / sqrt(1 - e2 * sin(lat) * sin(lat));
double h = H + N;
return h;
}
// 海拔高转椭球高
double altitude2ellipsoid(double h, double lat) {
double H = normal2geoid(h, lat);
double h1 = geoid2ellipsoid(H, lat);
return h1;
}
// 椭球高转海拔高
double ellipsoid2altitude(double h, double lat) {
double H = ellipsoid2geoid(h, lat);
double h1 = normal2geoid(H, lat);
return h1;
}
int main() {
double h = 100.0; // 海拔高
double lat = 30.0 * M_PI / 180; // 经度
double h1 = altitude2ellipsoid(h, lat); // 海拔高转椭球高
double h2 = ellipsoid2altitude(h1, lat); // 椭球高转海拔高
return 0;
}
```
以上代码中,我们定义了五个函数:normal2geoid()用于正常高转大地水准面高,ellipsoid2geoid()用于椭球高转大地水准面高,geoid2ellipsoid()用于大地水准面高转椭球高,altitude2ellipsoid()用于海拔高转椭球高,ellipsoid2altitude()用于椭球高转海拔高。在这些函数中,我们先根据经度和椭球体参数计算出大地水准面的参数,然后根据相关公式计算出高程数据的转换结果。
在main()函数中,我们定义了一个海拔高h和一个经度lat,然后依次调用altitude2ellipsoid()和ellipsoid2altitude()函数,将海拔高转换为椭球高,再将椭球高转换为海拔高,以此验证转换的正确性。
希望这个示例能够对您有所帮助!
阅读全文