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

snvhrwxg  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(127)

有那么不准确吗?我重新植入了整个事情与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);
 }

字符串
测试中的第一个Assert给出了:
java.lang.AssertionError:应为:<270.0>但实际为:<270.29389750911355>
0.29这似乎是一个很长的路要走?这是我选择实现的公式吗?

owfi6suc

owfi6suc1#

如果你已经做了你似乎已经做了,做正确的你已经算出了方位A从B沿着最短的路线从A到B,在球形的表面(ish)地球是圆弧的大圆之间的A和B,而不是弧线的纬度线之间的A和B。
Mathematica的大地测量函数给予方位角,作为测试位置的89.7061270.294
所以,看起来(a)你的计算是正确的,但(b)你的导航技能需要提高。

83qze16e

83qze16e2#

java.lang.AssertionError:应为:<270.0>但实际为:<270.29389750911355>
这0.29的绝对误差代表了0.1%的相对误差,这怎么会是“差得很远”呢?
浮点数将给出给予7位有效数字;双精度数适合16位。可能是浮点数函数或弧度转换的度数。
如果this source是可信的,公式看起来是正确的。
如果我把你的开始值和最终值插入到那个页面,他们报告的结果是089°42′22″。如果我从360减去你的结果,并转换为度,分和秒,你的结果和他们的结果是相同的。要么你都是正确的,要么你都是错误的。

bvjveswy

bvjveswy3#

你确定这是由于数值问题吗?我必须承认,我不知道你到底想计算什么,但是当你处理球体上的Angular 时,我希望与你在欧几里德几何中所期望的有小的偏差。

相关问题