Pregunta

¿Es tan inexacto?¡Re-implementé todo con precisión arbitraria de Apfloat y no hizo ninguna diferencia con cuál debería haberlo sabido para empezar!

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);
 }

La primera afirmación de la prueba da esto:

java.lang.AssertionError:esperado: <70.0> pero fue: <70.29389750911355>

¿0,29 parece bastante lejano?¿Es esta la fórmula que elegí implementar?

¿Fue útil?

Solución

Si usted ha hecho lo que parecen haber hecho y lo ha hecho correctamente que han descubierto el cojinete de A a B a lo largo de la ruta más corta de A a B, que, en la superficie de la esférica (más o menos) de la Tierra es el arco del círculo máximo entre A y B, NO el arco de la línea de latitud entre A y B.

funciones geodésicas de Mathematica dan los cojinetes, para sus posiciones de prueba, como 89.7061 y 270.294.

Por lo tanto, parece como si (a) el cálculo es correcto, pero (b) sus habilidades de navegación necesita pulir.

Otros consejos

¿Estás seguro de que esto se debe a problemas numéricos? Debo admitir, que no sé exactamente lo que está tratando de calcular, pero cuando se trata de ángulos en una esfera, pequeñas desviaciones de lo que cabría esperar en la geometría euclidiana.

java.lang.AssertionError:esperado:<270.0> pero era:<270.29389750911355>

Este error absoluto de 0,29 representa un error relativo del 0,1%.¿Cómo es que esto está "muy lejos"?

Los flotadores darán 7 dígitos significativos;los dobles son buenos para 16.Podrían ser las funciones trigonométricas o la conversión de grados a radianes.

La fórmula parece correcta, si esta fuente es de creer.

Si introduzco sus valores inicial y final en esa página, el resultado que informan es 089°42′22″.Si resto tu resultado de 360 ​​y lo convierto a grados, minutos y segundos, tu resultado es idéntico al de ellos.O ambos tienen razón o ambos están equivocados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top