为什么这个轴承计算如此不准确?

时间:2010-02-09 22:11:47

标签: 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);
 }

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

  

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

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

3 个答案:

答案 0 :(得分:16)

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

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

所以,看起来好像(a)你的计算是正确的,但(b)你的导航技能需要进行抛光。

答案 1 :(得分:1)

  

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

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

Floats将给出7位有效数字;双打有利于16.可以是三角函数或弧度转换的度数。

如果要相信this source,公式看起来是正确的。

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

答案 2 :(得分:1)

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