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

Gre*_*reg 10 java gis precision double-precision

甚至是不准确的吗?我用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);
 }
Run Code Online (Sandbox Code Playgroud)

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

java.lang.AssertionError:expected:<270.0>但是:<270.29389750911355>

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

Hig*_*ark 16

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

Mathematica的大地测量功能为您的测试位置提供轴承89.7061270.294.

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

  • 好吧,你会开始沿着这个方向行走(忘记道路和障碍物),但是当你走路时你会经常不得不调整你的方位; 大圆路线(通常)不遵循恒定轴承(或loxodrome)线.但事情开始变得复杂,鲍迪奇爆发了. (2认同)