Ya sea que use vincenty o haversine o la ley esférica de cosenos, es prudente tomar conciencia de cualquier problema potencial con el código que planea usar, cosas que debe vigilar y mitigar, y cómo se trata con problemas de vincenty vs haversine vs sloc diferirá a medida que uno se dé cuenta de los problemas de cada uno que están al acecho / casos extremos, que pueden o no ser conocidos popularmente. El experimentado programador lo sabe. Los novatos no pueden. Espero evitarles la frustración cuando un fragmento de un foro hace algo inesperado, en ciertos casos. Si uno va a usar seriamente alguna versión de cualquiera de estos, vincenty, haversine, sloc, entonces SE, SO, Reddit, Quora, etc., pueden haber proporcionado ayuda limitada en la codificación inicial de una solución, pero eso no significa que su solución o 'respuesta' aceptada está libre de problemas. Si un proyecto es lo suficientemente importante, merece una cantidad razonable de investigación adecuada. Lea el manual, lea los documentos, y si existe una revisión de código de ese código, léalo. Copiar y pegar un fragmento o una esencia que se votó cientos o más veces no significa que su seguridad sea exhaustiva y segura.
La intrigante respuesta publicada por cffk plantea el punto de estar al tanto de los casos al acecho, en soluciones empaquetadas, que pueden producir excepciones u otras dificultades. . Las afirmaciones específicas hechas en esa publicación están más allá de mi presupuesto de tiempo para perseguir en la actualidad, pero deduzco que de hecho hay problemas al acecho en ciertos paquetes, incluida al menos una implementación de Vincent, respecto de la cual al menos una persona ha propuesto mejorar de una forma u otra, para minimizar o eliminar el riesgo de encontrar esas dificultades. No añadiré más a ese tema relacionado con vincenty (siendo demasiado ignorante de él), sino que me volveré a haversine, al menos en parte sobre el tema con el OP.
La fórmula de Haversine publicada popularmente, ya sea en Python u otro idioma, porque probablemente usará la especificación de punto flotante IEEE 754 en la mayoría de todos los sistemas de inteligencia e inteligencia actuales, y procesadores ARM, powerPC, etc. También es susceptible a errores de excepción raros pero reales y repetibles muy cerca o a una distancia de arco de 180 grados, puntos antipodales, debido a aproximaciones de punto flotante y redondeo. Es posible que algunos novatos aún no hayan sido mordidos por esta situación. Debido a que esta especificación de fp se aproxima y redondea, esto no significa que cualquier código que llame a fp64 pueda causar errores de excepción, no. Pero algo de código, Es posible que algunas fórmulas no tengan casos tan obvios en los que las aproximaciones y redondeos de IEEE 754 fp64 puedan hacer que un valor se salga ligeramente del dominio de un método matemático que se espera que evalúe sin problemas dicho valor. Un ejemplo ... sqrt (). Si un valor negativo llega a un sqrt (), como sqrt (-0.00000000000000000122739), habrá un error de excepción. En la fórmula de Haversine, la forma en que progresa hacia una solución, hay dos métodos sqrt () en atan2 (). losuna que se calcula y luego se usa en el sqrt (), puede, en los puntos antipodales del globo, ligeramente desviada por debajo de 0.0 o por encima de 1.0, muy ligeramente debido a las aproximaciones y redondeos de fp64, rara vez, pero de manera repetible. La repetibilidad confiable y consistente, en este contexto, hace de este un riesgo de excepción, un caso límite para proteger, mitigar, en lugar de una casualidad aleatoria aislada. Aquí hay un ejemplo de un fragmento corto de python3 de haversine, sin la protección necesaria:
import math as m
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
Muy cerca o en puntos antipodales, un cálculo en la primera línea de la fórmula puede desviarse negativamente, raramente, pero repetidamente con esas mismas coordenadas de lat lon. Para proteger / corregir esos raros casos, simplemente se puede añadir, después de la de un cálculo, como se ve a continuación:
import math as m
note = ''
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
if a < 0.0: a = 0.0 ; note = '*'
if a > 1.0: a = 1.0 ; note = '**'
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
# note = '*' # a went below 0.0 and was normalized back to 0.0
# note = '**' # a went above 1.0 and was normalized back to max of 1.0
Por supuesto, no mostré toda la función aquí, sino un fragmento corto como se publica con tanta frecuencia. Pero este muestra la protección para el sqrt (), probando el a , y normalizándolo si es necesario, también ahorrando la necesidad de probar todo excepto. La nota = '' arriba es para evitar que la etapa de bytecode proteste contra esa nota se está utilizando antes de que se le asigne un valor, si se devuelve con el resultado de la función.
Con este simple cambio, de la adición de los dos a las pruebas, el sqrt () funciones estarán contentos, y el código de ahora tiene un adicional de nota que se puede devolver al código de llamada, que alerta de que el resultado ha sido ligeramente normalizado, y por qué. A algunos les puede interesar, a otros no, pero está ahí, evitando un error de excepción, que 'de otra manera' puede ocurrir. Un intento excepto el bloque puede detectar la excepción, pero no solucionarlo, a menos que se escriba explícitamente para hacerlo. Parece más fácil de código de corrección de la línea (s) inmediatamente después de la una línea de cálculo. La entrada completamente depurada no debería requerir un intento, excepto el bloqueo aquí.
Resumen, si usa haversine, codificado explícitamente en lugar de usar un paquete o una biblioteca, sin importar su idioma de elección, sería una buena idea probar y normalizar una vuelta al rango necesario de 0.0 <= a <= 1.0 en orden para proteger la siguiente línea con sus cálculos c . Pero la mayoría de los fragmentos de código de Haversine no lo muestran y no mencionan el riesgo.
Experiencia: durante pruebas exhaustivas en todo el mundo, en incrementos de 0.001 grados, llené un disco duro con combinaciones de lat lon que causaron una excepción, una excepción repetible confiable y consistente, durante un mes de pruebas colaterales de la confiabilidad del enfriamiento de la CPU fan, y mi paciencia. Sí, desde entonces he eliminado la mayoría de esos registros, ya que su propósito era principalmente probar el punto (si el juego de palabras está permitido). Pero tengo algunos registros más cortos de 'valores de problemas de lat lon', guardados para fines de prueba.
Precisión: ¿Será una y el resultado completo haversine perder cierta precisión mediante la normalización de esa vuelta pequeño fragmento en el dominio? No mucho, tal vez no más que las aproximaciones y redondeos fp64 que ya se estaban introduciendo, lo que provocó que esa ligera deriva fuera del dominio. Si ya ha encontrado aceptable a Haversine sobre Vincenty: más simple, más rápido, más fácil de personalizar, solucionar problemas y mantener, entonces Haversine puede ser una buena solución para su proyecto.
He usado haversine en una skysphere proyectada por encima de la cabeza para medir distancias angulares entre objetos en el cielo, tal como se ve desde una posición en la tierra, mapeando azimut y alt a coordenadas de la equivalencia de skysphere lat lon, sin elipsoide para tener en cuenta en absoluto, ya que La skysphere teórica proyectada es una esfera perfecta, cuando se trata de medir la distancia angular, mire los ángulos entre dos objetos desde una posición en la superficie de la tierra. Se adapta perfectamente a mis necesidades. Entonces, el haversine sigue siendo muy útil y muy preciso en ciertas aplicaciones (dentro de mis propósitos) ... pero si lo usa, ya sea en la tierra para SIG o navegación, o en observaciones y mediciones de objetos del cielo, proteja en el caso de puntos antipodales o muy cerca de puntos antipodales, probando uny empujándolo nuevamente a su dominio necesario cuando sea necesario.
El haversine desprotegido está en todo Internet, y solo he visto una publicación anterior de Usenet que mostró cierta protección, creo que alguien de JPL, y que puede haber sido anterior a 1985, anterior a la especificación de punto flotante IEEE 754. Otras dos páginas mencionaron posibles problemas cerca de los puntos antipodales, pero no describieron esos problemas ni cómo se podrían mitigarlos. Por lo tanto, existe una preocupación por los novatos (como yo) que no siempre entienden las buenas prácticas lo suficientemente bien como para seguir investigando y probar casos límite, de algún código que han copiado y pegado en un proyecto de confianza. La intrigante publicación de cffk fue refrescante, ya que era pública con este tipo de problemas, que a menudo no se mencionan, rara vez se codifican públicamente para protección en fragmentos, y rara vez se discuten de esta manera, en comparación con la cantidad de versiones no protegidas y no discutidas que se publican.
A partir de 20190923, la página wiki para la fórmula de Haversine de hecho menciona el problema posible en los puntos antipodales, debido a problemas de coma flotante en los dispositivos informáticos ... alentador ...
https://en.wikipedia.org/wiki/Haversine_formula
(debido a que esa página wiki no tiene, en este momento, un ancla html para la sección a la que me vincularía directamente, por lo tanto, después de que se cargue la página, haga una búsqueda en esa página del navegador para 'Al usar estas fórmulas' y usted vea el problema de la haversina con los puntos antipodales mencionados, más oficialmente).
Y este otro sitio también tiene una breve mención:
https://www.movable-type.co.uk/scripts/latlong.html
Si uno hace una búsqueda en esa página para 'incluir protección contra errores de redondeo', existe esto ...
Si atan2 no está disponible, c podría calcularse a partir de 2 ⋅ asin (min (1, √a)) (incluida la protección contra errores de redondeo).
Ahora hay una rara instancia en la que se mencionan errores de redondeo y se muestra protección para la versión asin (), pero no se menciona ni se muestra para la versión atan2 (). Pero al menos se menciona el riesgo de errores de redondeo.
En mi opinión, cualquier aplicación 24/7/365 que utilice Haversine necesita esta protección cerca de los puntos antipodales como un detalle importante y simple.
No sé qué paquetes de Haversine incluyen o no incluyen esta protección, pero si usted es nuevo en todo esto y va a utilizar las versiones 'snippet' publicadas popularmente, ahora sabe que necesita protección, y esa protección es muy simple de implementar, es decir, si no está utilizando vincenty, y no está utilizando un haversine empaquetado sin acceso fácil para modificar el código del paquete.
IOW, ya sea usando vincenty o haversine o sloc, uno debe ser consciente de cualquier problema con el código, cosas a tener en cuenta y mitigar, y la forma en que se trata de los problemas de vincenty vs haversine vs sloc será diferente a medida que uno se dé cuenta de cada uno problemas al acecho / casos extremos, que pueden o no ser conocidos popularmente.