有那么不准确吗?我重新植入了整个事情与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这似乎是一个很长的路要走?这是我选择实现的公式吗?
3条答案
按热度按时间owfi6suc1#
如果你已经做了你似乎已经做了,做正确的你已经算出了方位A从B沿着最短的路线从A到B,在球形的表面(ish)地球是圆弧的大圆之间的A和B,而不是弧线的纬度线之间的A和B。
Mathematica的大地测量函数给予方位角,作为测试位置的
89.7061
和270.294
。所以,看起来(a)你的计算是正确的,但(b)你的导航技能需要提高。
83qze16e2#
java.lang.AssertionError:应为:<270.0>但实际为:<270.29389750911355>
这0.29的绝对误差代表了0.1%的相对误差,这怎么会是“差得很远”呢?
浮点数将给出给予7位有效数字;双精度数适合16位。可能是浮点数函数或弧度转换的度数。
如果this source是可信的,公式看起来是正确的。
如果我把你的开始值和最终值插入到那个页面,他们报告的结果是089°42′22″。如果我从360减去你的结果,并转换为度,分和秒,你的结果和他们的结果是相同的。要么你都是正确的,要么你都是错误的。
bvjveswy3#
你确定这是由于数值问题吗?我必须承认,我不知道你到底想计算什么,但是当你处理球体上的Angular 时,我希望与你在欧几里德几何中所期望的有小的偏差。