10

甚至有那么不准确吗?我用 Apfloat 任意精度重新实现了整个事情,这没有什么区别,我应该从一开始就知道!!

public static double bearing(LatLng latLng1, LatLng latLng2) {
 double deltaLong = toRadians(latLng2.longitude - latLng1.longitude);

 double lat1 = toRadians(latLng1.latitude);
 double lat2 = toRadians(latLng2.latitude);

 double y = sin(deltaLong) * cos(lat2);
 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLong);
 double result = toDegrees(atan2(y, x));
 return (result + 360.0) % 360.0;
}

@Test
 public void testBearing() {

  LatLng first = new LatLng(36.0, 174.0);
  LatLng second = new LatLng(36.0, 175.0);
  assertEquals(270.0, LatLng.bearing(second, first), 0.005);
  assertEquals(90.0, LatLng.bearing(first, second), 0.005);
 }

测试中的第一个断言给出了这个:

java.lang.AssertionError:预期:<270.0> 但原为:<270.29389750911355>

0.29似乎还有很长的路要走?这是我选择实施的公式吗?

4

3 回答 3

16

如果你已经完成了你似乎已经完成的事情并且做得正确,那么你已经计算出了 A 从 B 沿着从 A 到 B 的最短路线的方位角,在球形(ish)地球的表面上是圆弧A 和 B 之间的大圆,而不是 A 和 B 之间的纬线弧。

Mathematica 的大地测量函数为您的测试位置提供轴承,如89.7061270.294

因此,看起来(a)您的计算是正确的,但(b)您的导航技能需要完善。

于 2010-02-09T22:35:23.510 回答
1

java.lang.AssertionError:预期:<270.0> 但原为:<270.29389750911355>

这个 0.29 的绝对误差代表 0.1% 的相对误差。这怎么算“遥遥无期”?

浮点数将给出 7 个有效数字;双打对 16 有好处。可能是三角函数或角度到弧度的转换。

如果相信这个来源,公式看起来是正确的。

如果我将您的起始值和最终值插入该页面,他们报告的结果是 089°42′22″。如果我从 360 中减去您的结果并转换为度、分和秒,您的结果与他们的相同。要么你们都对,要么你们都错。

于 2010-02-09T22:24:14.890 回答
1

你确定这是由于数字问题吗?我必须承认,我并不完全知道您要计算什么,但是当您处理球体上的角度时,与您在欧几里德几何中所期望的存在微小偏差。

于 2010-02-09T22:27:46.307 回答