C++大地计算,由起始点经纬度和距离方位,计算终点坐标
时间: 2024-04-09 10:10:09 浏览: 184
这个问题涉及到大地测量学中的一些公式,需要进行一些计算。以下是实现该功能的C++代码:
```
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.14159265358979323846;
const double a = 6378137.0; // 地球长半轴
const double b = 6356752.314245; // 地球短半轴
const double f = (a - b) / a; // 扁率
const double e = sqrt(2 * f - f * f); // 第一偏心率
const double e2 = e * e; // 第二偏心率
// 角度转弧度
double deg2rad(double deg) {
return deg * PI / 180.0;
}
// 弧度转角度
double rad2deg(double rad) {
return rad * 180.0 / PI;
}
// 计算子午圈曲率半径
double getMeridianRadius(double lat) {
double sinLat = sin(deg2rad(lat));
double W = sqrt(1 - e2 * sinLat * sinLat);
return a * (1 - e2) / pow(W, 3);
}
// 计算卯酉圈曲率半径
double getParallelRadius(double lat) {
double sinLat = sin(deg2rad(lat));
double W = sqrt(1 - e2 * sinLat * sinLat);
return a / W;
}
// 根据起始点经纬度、距离和方位计算终点坐标
void getDestination(double lat1, double lon1, double distance, double bearing, double& lat2, double& lon2) {
double alpha1 = deg2rad(bearing);
double sinAlpha1 = sin(alpha1);
double cosAlpha1 = cos(alpha1);
double sinLat1 = sin(deg2rad(lat1));
double cosLat1 = cos(deg2rad(lat1));
double Rm = getMeridianRadius(lat1);
double Rn = getParallelRadius(lat1);
double d = distance / 1000.0; // 距离单位为米,转换为千米
double deltaLat = d * cosAlpha1 / Rn;
double lat2Rad = deg2rad(lat1) + deltaLat;
double deltaLon = d * sinAlpha1 / (Rm * cosLat1);
double lon2Rad = deg2rad(lon1) + deltaLon;
lat2 = rad2deg(lat2Rad);
lon2 = rad2deg(lon2Rad);
}
int main() {
double lat1 = 39.908722; // 起始点纬度
double lon1 = 116.397496; // 起始点经度
double distance = 1000.0; // 距离,单位为米
double bearing = 90.0; // 方位,单位为度
double lat2, lon2;
getDestination(lat1, lon1, distance, bearing, lat2, lon2);
cout << "起始点坐标:(" << lat1 << ", " << lon1 << ")" << endl;
cout << "终点坐标:(" << lat2 << ", " << lon2 << ")" << endl;
return 0;
}
```
在上面的代码中,`getMeridianRadius`和`getParallelRadius`分别计算了给定纬度下的子午圈曲率半径和卯酉圈曲率半径。`getDestination`函数根据起始点经纬度、距离和方位计算终点坐标。最后,我们可以通过调用`getDestination`函数来计算终点坐标,并输出结果。
阅读全文