为什么这个轴承计算如此疏散?

它甚至不准确吗? 我用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:预期:但是:

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

如果你已经完成了你所做的并正确地完成了你已经找到了A从B沿A到B的最短路径的方位,在球形(ish)地球表面上是A的弧形。 A和B之间的大圆,而不是A和B之间的纬度线的弧。

Mathematica的大地测量function为您的测试位置提供了轴承,分别为89.7061270.294

因此,看起来好像(a)您的计算是正确的,但(b)您的导航技能需要进行优化。

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

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

该0.29绝对误差表示0.1%的相对误差。 这怎么样“还有很长的路要走”?

Floats将给出7位有效数字; 双打是16的好处。可能是三角函数或弧度转换的度数。

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

如果我将开始值和最终值插入该页面,他们报告的结果是089°42’22“。 如果我从360中减去你的结果并转换为度数,分钟和秒,你的结果与他们的结果相同。 要么你们都是正确的,要么你们两个都错了。