为什么这个方位计算如此不准确?

Why is this bearing calculation so inacurate?

提问人:Greg 提问时间:2/10/2010 最后编辑:John RaschGreg 更新时间:11/10/2023 访问量:1984

问:

甚至有那么不准确吗?我用 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似乎还有很长的路要走?这是我选择实施的公式吗?

Java GIS 双精度

评论

0赞 Anon. 2/10/2010
您使用的是任意精度的三角函数吗?
0赞 Ron 2/10/2010
你能添加 toRadians 和 toDegrees 吗?
0赞 Greg 2/10/2010
使用 java.lang.Math trig 函数并导入静态 java.lang.Math.toDegrees;导入静态 java.lang.Math.toRadians;

答:

1赞 duffymo 2/10/2010 #1

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

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

浮点数将给出 7 位有效数字;双打适合 16 岁。可以是三角函数或度数到弧度的转换。

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

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

评论

2赞 Jens Schauder 2/10/2010
如果这是由于数值误差造成的,那么对于如此简单的计算来说还有很长的路要走。
1赞 Jens Schauder 2/10/2010 #2

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

评论

2赞 High Performance Mark 2/10/2010
有时也有很大的偏差。
17赞 High Performance Mark 2/10/2010 #3

如果你已经做了你似乎已经做过的事情并且做对了,你就已经弄清楚了 A 从 B 到 B 的最短路线的方位角,在球形 (ish) 地球的表面上,它是 A 和 B 之间大圆的弧线,而不是 A 和 B 之间的纬度线的弧。

Mathematica 的大地测量函数为您的测试位置提供 as 和 的方位角。89.7061270.294

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

评论

0赞 Bill the Lizard 2/10/2010
完全正确。将测试参数更改为纬度 0.0 度,测试通过。
0赞 Greg 2/10/2010
你说得对(b)让我举个例子来巩固我的理解。如果我想从巴黎(48,-2)步行到慕尼黑(48,-11),我不会走正东,而是走86.652度。如果你考虑从英国的某个地方走到格陵兰岛,这更有意义,你不会沿着一条平行于纬度线的线(纬度线是平行的吗??
2赞 High Performance Mark 2/10/2010
好吧,你会开始沿着那个方位行走(忘记道路和障碍物),但你将不得不在行走时不断调整你的方位;大圆路线(通常)不遵循恒定方位线(或方向线)。但事情开始变得复杂,打破鲍迪奇。