이 베어링 계산이 왜 그렇게 부정확합니까?
-
19-09-2019 - |
문제
그게 부정확 한가? 나는 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는 꽤 먼 길을 벗어난 것 같습니다. 이것이 내가 구현하기로 선택한 공식입니까?
해결책
당신이 한 일을하고 정확하게 한 일을했다면 A에서 B로 가장 짧은 경로를 따라 B에서 A의 베어링을 알아 냈습니다. A와 B 사이의 위도선의 아크가 아닌 A와 B 사이의 큰 원입니다.
Mathematica의 측지 기능은 테스트 위치에 대해 베어링을 제공합니다. 89.7061
그리고 270.294
.
따라서 (a) 계산이 정확하지만 (b) 항해 기술이 연마해야합니다.
다른 팁
이것이 숫자 문제로 인한 것이라고 확신합니까? 나는 당신이 무엇을 계산하려고하는지 정확히 알지 못하지만 구의 각도를 다룰 때 유클리드 형상에서 기대할 수있는 작은 편차를 인정해야합니다.
java.lang.assertionerror : 예상 : <270.0>하지만 : <270.29389750911355>
이 0.29 절대 오차는 0.1%의 상대 오차를 나타냅니다. 이것이 어떻게 "먼 길"입니까?
플로트는 7 개의 중요한 숫자를 줄 것입니다. 복식은 16에 적합합니다. 트리그 함수 또는 라디안 전환 정도 일 수 있습니다.
공식이 옳은 경우 이 소스 믿어야합니다.
시작과 최종 값을 해당 페이지에 연결하면보고 한 결과는 089 ° 42′22 ″입니다. 360에서 결과를 빼고 학위, 분, 초로 변환하면 결과는 동일합니다. 둘 다 맞거나 둘 다 틀 렸습니다.