用最简单的c语言编写大地坐标系与直角坐标系的相互转化
时间: 2024-05-13 14:16:05 浏览: 161
以下是将大地坐标系转换为直角坐标系的简单 C 代码:
```c
#include <stdio.h>
#include <math.h>
#define pi 3.14159265358979323846
double deg2rad(double deg) {
return deg * pi / 180.0;
}
int main() {
double lon, lat, alt;
double a = 6378137.0; // 赤道半径
double b = 6356752.3142; // 极半径
double f = (a - b) / a; // 扁率
double e2 = 1.0 - (b * b) / (a * a); // 第一偏心率的平方
double N, x, y, z;
printf("请输入大地坐标系中的经度、纬度和高度(单位为度和米):");
scanf("%lf %lf %lf", &lon, &lat, &alt);
// 将经度、纬度、高度转换为弧度
lon = deg2rad(lon);
lat = deg2rad(lat);
// 计算子午圈曲率半径
N = a / sqrt(1.0 - e2 * sin(lat) * sin(lat));
// 计算直角坐标系中的坐标
x = (N + alt) * cos(lat) * cos(lon);
y = (N + alt) * cos(lat) * sin(lon);
z = (N * (1.0 - e2) + alt) * sin(lat);
printf("直角坐标系中的坐标为:(%.2lf, %.2lf, %.2lf)\n", x, y, z);
return 0;
}
```
以下是将直角坐标系转换为大地坐标系的简单 C 代码:
```c
#include <stdio.h>
#include <math.h>
#define pi 3.14159265358979323846
double rad2deg(double rad) {
return rad * 180.0 / pi;
}
int main() {
double x, y, z;
double a = 6378137.0; // 赤道半径
double b = 6356752.3142; // 极半径
double f = (a - b) / a; // 扁率
double e2 = 1.0 - (b * b) / (a * a); // 第一偏心率的平方
double p = sqrt(x * x + y * y);
double lon, lat, alt, N;
printf("请输入直角坐标系中的坐标(单位为米):");
scanf("%lf %lf %lf", &x, &y, &z);
// 计算经度和纬度
lon = atan2(y, x);
lat = atan2((z / p), (1.0 - f) * (p / sqrt(x * x + y * y)));
// 计算高度
N = a / sqrt(1.0 - e2 * sin(lat) * sin(lat));
alt = p / cos(lat) - N;
// 将经度、纬度、高度转换为度
lon = rad2deg(lon);
lat = rad2deg(lat);
printf("大地坐标系中的坐标为:(%.6lf, %.6lf, %.2lf)\n", lon, lat, alt);
return 0;
}
```
阅读全文