如果使用wgs84的椭球参数呢,半径曲率等都知道的情况下
时间: 2024-11-25 13:22:02 浏览: 4
如果使用WGS84(World Geodetic System 1984)的椭球参数,这是一种广泛使用的大地测量系统,其参数包括平均地球半径(大约为6371.009 km),扁率(约为1/298.257223563),以及两个极半径(赤道半径稍长)。在这样的情况下,计算两点间距离会更精确地考虑到地球的实际形状,即不是完美的球形而是略带扁平的椭球体。
为了使用WGS84椭球参数,你可以采用像 Vincenty's Inverse法这样的高精度算法,它不仅考虑了纬度差的影响,还包含了经度差、椭球面曲率等因素。以下是使用该方法的基本步骤:
1. 初始化必要的椭球参数:
- a: 长半轴(赤道半径)= 6378137 m
- b: 短半轴(极半径)= 6356752.3142 m
- e² = (a² - b²) / a²
2. 将给定的经纬度转换成弧度:
- φ1, λ1: 第一点的纬度和经度
- φ2, λ2: 第二点的纬度和经度
3. 计算两个点之间的中央子午线角:
- δφ = φ2 - φ1
- Δλ = λ2 - λ1
4. 按照 Vincenty 的迭代公式逐步逼近精确的弧度距离:
```cpp
double f = 1 / 298.257223563; // 扁率
double L = Δλ; // 初始中央子午线弧度差
double U1 = atan((1 - f) * tan(φ1));
double A = 1 - f * f;
double sinU1 = sin(U1);
double cosU1 = cos(U1);
double sinU2 = sin(U2);
do {
double sinAlpha = sqrt((cosU2 * sinU1 - f * cosU2 * cosU1 * sinL) * (cosU2 * sinU1 - f * cosU1 * cosU2 * sinL));
double cosSqAlpha = 1 - sinAlpha * sinAlpha;
double sin2U1 = 2 * sinU1 * cosU1;
double invA = 1 / A;
double lambda = L + (1 - f) * f * sinU1 * sinU1 / cosSqAlpha *
(L + f * sin2U1 * (sinAlpha * (cosSqAlpha + f) + 2 * f * cosU2 * sinU2));
double sinAlphaPrime = (cosU1 * sinU2 + f * cosU2 * sinU1 * sinL) / cosSqAlpha;
double deltaU = L * (f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha)) +
(1 - e²) * sinU1 * sinU1 * (3 * cos2U1 + f * (4 - 5 * cos2U1)));
U1 -= deltaU;
L = lambda;
} while (fabs(deltaU) > 1e-12 || fabs(lambda - L) > 1e-12);
double s = a * L;
// 根据需要将s转换为厘米或其他单位
```
在这个例子中,`s`将会得到两个点之间的精确弧度距离。如果你想得到厘米级别的距离,只需要乘以100即可(因为1公里=100000厘米)。
阅读全文