利用c++编一个大地坐标与空间直角坐标相互转换算例(包括克拉索夫斯基椭球、IUGG1975踢球、CGCS2000椭球)的程序
时间: 2024-05-11 22:18:07 浏览: 205
以下是一个示例程序,可以将大地坐标与空间直角坐标相互转换。其中包括克拉索夫斯基椭球、IUGG1975踢球、CGCS2000椭球的参数设置。
注意:该程序仅供参考,实际应用中需要根据具体情况进行修改和优化。
```cpp
#include <iostream>
#include <cmath>
using namespace std;
// 定义常量
const double PI = 3.14159265358979323846; // 圆周率
const double A_K = 6378245; // 克拉索夫斯基椭球长半轴
const double F_K = 1 / 298.3; // 克拉索夫斯基椭球扁率
const double A_I = 6378140; // IUGG1975踢球长半轴
const double F_I = 1 / 298.257; // IUGG1975踢球扁率
const double A_C = 6378137; // CGCS2000椭球长半轴
const double F_C = 1 / 298.257222101; // CGCS2000椭球扁率
const double E_K = sqrt(2 * F_K - F_K * F_K); // 克拉索夫斯基椭球第一偏心率
const double E_I = sqrt(2 * F_I - F_I * F_I); // IUGG1975踢球第一偏心率
const double E_C = sqrt(2 * F_C - F_C * F_C); // CGCS2000椭球第一偏心率
// 定义函数
double rad(double d) // 角度转弧度
{
return d * PI / 180.0;
}
double deg(double x) // 弧度转角度
{
return x * 180.0 / PI;
}
double m(double a, double b) // 子午线曲率半径
{
double t = (1 - b * b) * pow(sin(a), 2);
return a / sqrt(1 - t);
}
double n(double a, double b) // 卯酉线曲率半径
{
double t = (1 - b * b) * pow(sin(a), 2);
return a * sqrt(1 - t) / (1 - t * b * b);
}
// 大地坐标转空间直角坐标
void BLH2XYZ(double B, double L, double H, double &X, double &Y, double &Z, int ellipsoid)
{
double a, f, e, N;
if (ellipsoid == 1) // 克拉索夫斯基椭球
{
a = A_K;
f = F_K;
e = E_K;
}
else if (ellipsoid == 2) // IUGG1975踢球
{
a = A_I;
f = F_I;
e = E_I;
}
else if (ellipsoid == 3) // CGCS2000椭球
{
a = A_C;
f = F_C;
e = E_C;
}
double N1 = m(rad(B), e);
N = n(rad(B), e);
X = (N + H) * cos(rad(B)) * cos(rad(L));
Y = (N + H) * cos(rad(B)) * sin(rad(L));
Z = (N1 * (1 - e * e) + H) * sin(rad(B));
}
// 空间直角坐标转大地坐标
void XYZ2BLH(double X, double Y, double Z, double &B, double &L, double &H, int ellipsoid)
{
double a, f, e, N;
if (ellipsoid == 1) // 克拉索夫斯基椭球
{
a = A_K;
f = F_K;
e = E_K;
}
else if (ellipsoid == 2) // IUGG1975踢球
{
a = A_I;
f = F_I;
e = E_I;
}
else if (ellipsoid == 3) // CGCS2000椭球
{
a = A_C;
f = F_C;
e = E_C;
}
double p = sqrt(X * X + Y * Y);
double theta = atan(Z * a / p / b);
double tanB = (Z + e * e * b * pow(sin(theta), 3)) / (p - e * e * a * pow(cos(theta), 3));
B = deg(atan(tanB));
L = deg(atan(Y / X));
double N1 = m(rad(B), e);
N = n(rad(B), e);
H = p / cos(rad(B)) - N;
}
// 主函数
int main()
{
double B, L, H, X, Y, Z;
int ellipsoid;
cout << "请输入椭球体编号(1-克拉索夫斯基椭球, 2-IUGG1975踢球, 3-CGCS2000椭球):" << endl;
cin >> ellipsoid;
cout << "请输入大地坐标B(Latitude):" << endl;
cin >> B;
cout << "请输入大地坐标L(Longitude):" << endl;
cin >> L;
cout << "请输入大地坐标H(Height):" << endl;
cin >> H;
BLH2XYZ(B, L, H, X, Y, Z, ellipsoid); // 大地坐标转空间直角坐标
cout << "空间直角坐标X:" << X << endl;
cout << "空间直角坐标Y:" << Y << endl;
cout << "空间直角坐标Z:" << Z << endl;
XYZ2BLH(X, Y, Z, B, L, H, ellipsoid); // 空间直角坐标转大地坐标
cout << "大地坐标B:" << B << endl;
cout << "大地坐标L:" << L << endl;
cout << "大地坐标H:" << H << endl;
return 0;
}
```
阅读全文