Que vous utilisiez vincenty ou haversine ou la loi sphérique des cosinus, il est judicieux de prendre conscience des problèmes potentiels avec le code que vous prévoyez d'utiliser, des choses à surveiller et à atténuer, et de la façon dont on traite les problèmes vincenty vs haversine vs sloc différera à mesure que l'on se rend compte des problèmes / casse cachés de chacun, qui peuvent ou non être connus du grand public. Le programmeur chevronné le sait. Les débutants ne le peuvent pas. J'espère épargner à certains d'entre eux la frustration lorsqu'un extrait d'un forum fait quelque chose d'inattendu, dans certains cas. Si l'on va sérieusement utiliser une version de l'un d'entre eux, vincenty, haversine, sloc, alors SE, SO, Reddit, Quora, etc., peuvent avoir fourni une aide limitée dans le codage initial d'une solution, mais cela ne signifie pas que leur solution ou «réponse» acceptée est exempte de problèmes. Si un projet est suffisamment important, il mérite une quantité raisonnable de recherche appropriée. Lisez le manuel, lisez les documents, et s'il existe une révision du code de ce code, lisez-le. Copier et coller un extrait ou un résumé qui a été voté une centaine de fois ou plus ne signifie pas que sa sécurité est complète et assurée.
La réponse intrigante publiée par cffk soulève le point d'être conscient des cas cachés, dans les solutions packagées, qui peuvent produire des exceptions ou d'autres difficultés . Les allégations spécifiques formulées dans ce poste dépassent mon budget-temps pour le moment, mais j'en retiens qu'il y a effectivement des problèmes cachés dans certains paquets, y compris au moins une mise en œuvre de Vincent, au sujet desquels au moins une personne a proposé d'améliorer d'une manière ou d'une autre, afin de minimiser ou d'éliminer le risque de rencontrer ces difficultés. Je n'apporterai rien de plus à ce sujet concernant Vincent (en l'ignorant beaucoup trop), mais je me tournerai plutôt vers l'héversine, au moins en partie sur le sujet avec le PO.
La formule haversine publiquement publiée, que ce soit en python ou dans un autre langage, car elle utilisera très probablement la spécification en virgule flottante IEEE 754 sur la plupart des systèmes Intel et similaires aujourd'hui, et les processeurs ARM, PowerPC, etc. être également sensible à des erreurs d'exception rares mais réelles et répétables très proches ou à une distance d'arc de 180 degrés, des points antipodaux, en raison d'approximations de virgule flottante et d'arrondi. Certains débutants n'ont peut-être pas encore été mordus par cette situation. Parce que cette spécification fp se rapproche et arrondit, cela ne signifie pas que tout code qui appelle fp64 peut provoquer des erreurs d'exception, non. Mais du code, certaines formules peuvent ne pas avoir des contours si évidents où les approximations et les arrondis de IEEE 754 fp64 peuvent faire en sorte qu'une valeur s'écarte légèrement du domaine d'une méthode mathématique qui devrait évaluer sans faille une telle valeur. Un exemple ... sqrt (). Si une valeur négative trouve son chemin dans un sqrt (), tel que sqrt (-0.00000000000000000122739), il y aura une erreur d'exception. Dans la formule haversine, la manière dont elle progresse vers une solution, il y a deux méthodes sqrt () dans atan2 (). leun qui est calculé puis utilisé dans le sqrt (), peut, aux points antipodes du globe, légèrement s'égarer en dessous de 0,0 ou au-dessus de 1,0, très légèrement à cause des approximations fp64 et de l'arrondi, rarement, mais de façon répétable. Dans ce contexte, une répétabilité fiable et constante en fait un risque d'exception, un casse-tête à protéger, à atténuer, plutôt qu'un hasard aléatoire isolé. Voici un exemple d'un court extrait python3 de haversine, sans la protection nécessaire:
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
Très près ou aux points antipodes, un calculé dans la première ligne de la formule peut s'égarer négativement, rarement, mais de façon répétée avec ces mêmes coordonnées lat lon. Pour protéger / corriger ces rares cas, on peut simplement ajouter, après un calcul, comme on le voit ci - dessous:
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
Bien sûr, je n'ai pas montré l'intégralité de la fonction ici, mais un court extrait comme il est si souvent affiché. Mais celui-ci montre la protection de sqrt (), en testant le a et en le normalisant si nécessaire, ce qui évite également de mettre le tout dans un essai, sauf. La note = '' en haut sert à empêcher la phase de bytecode de protester contre l'utilisation de la note avant de lui affecter une valeur, si elle est renvoyée avec le résultat de la fonction.
Avec ce simple changement, d'ajouter les deux un essais, les fonctions sqrt () seront heureux, et le code a maintenant une somme supplémentaire de note qui peut être retourné au code d' appel, à l' alerte qu'un résultat a été légèrement normalisé, et pourquoi. Certains peuvent s'en soucier, d'autres non, mais c'est là, empêchant une erreur d'exception, qui «peut» autrement se produire. Un bloc try except peut intercepter l'exception, mais pas la corriger, sauf si cela est explicitement écrit pour le faire. Il semble plus facile à coder la ligne de correction (s) immédiatement après la une ligne de calcul. Une entrée soigneusement nettoyée ne devrait alors pas du tout nécessiter d'essayer sauf bloquer ici.
Résumé, si vous utilisez haversine, codé explicitement plutôt que d'utiliser un package ou une bibliothèque, peu importe la langue de votre choix, ce serait une bonne idée de tester et de normaliser un retour dans la plage nécessaire de 0,0 <= a <= 1,0 afin pour protéger la ligne suivante avec ses calculs c . Mais la majorité des extraits de code haversine ne le montrent pas et ne mentionnent pas le risque.
Expérience: lors de tests approfondis dans le monde entier, par incréments de 0,001 degré, j'ai rempli un disque dur avec des combinaisons lat lon qui ont provoqué une exception, une exception fiable et répétable cohérente, pendant un mois de test collatéral de la fiabilité du refroidissement du CPU fan, et ma patience. Oui, j'ai depuis supprimé la plupart de ces journaux, car leur but était principalement de prouver le point (si le jeu de mots est autorisé). Mais j'ai quelques journaux plus courts de «valeurs lat lon de problème», conservés à des fins de test.
Précision: est-ce que a et l'ensemble du résultat haversine perdront une certaine précision en le normalisant un peu dans le domaine? Pas grand-chose, peut-être pas plus que les approximations et arrondis fp64 déjà introduits, qui ont causé cette légère dérive hors du domaine. Si vous avez déjà trouvé haversine acceptable par rapport à vincenty - plus simple, plus rapide, plus facile à personnaliser, à dépanner et à entretenir, alors haversine peut être une bonne solution pour votre projet.
J'ai utilisé haversine sur une skysphère projetée au-dessus pour mesurer les distances angulaires entre les objets dans le ciel, vu depuis une position sur la terre, cartographier l'azimut et alt en coordonnées équivalentes lat lons à la skysphère, aucun élipsoïde à considérer du tout, puisque le la skysphère théorique projetée est une sphère parfaite, lorsqu'il s'agit de mesurer des angles de vue de distance angulaire entre deux objets à partir d'une position à la surface de la terre. Cela correspond parfaitement à mes besoins. Donc, haversine est toujours très utile et très précis dans certaines applications (bien dans mes buts) ... mais si vous l'utilisez, que ce soit sur terre pour le SIG ou la navigation, ou dans les observations et les mesures d'objets célestes, protégez dans le cas de points antipodes ou très proches de points antipodes, en testant unet le repoussant dans son domaine nécessaire en cas de besoin.
Le haversine non protégé est partout sur Internet, et je n'ai vu qu'un seul ancien poste Usenet qui a montré une certaine protection, je pense de la part d'un membre du JPL, et qui pourrait avoir été avant 1985, avant la spécification en virgule flottante IEEE 754. Deux autres pages ont mentionné des problèmes possibles près des points antipodaux, mais n'ont pas décrit ces problèmes, ni comment on pourrait les atténuer. Il y a donc lieu de s'inquiéter pour les débutants (comme moi) qui ne comprennent pas toujours assez bien les bonnes pratiques pour approfondir la recherche et tester les cas de certains codes qu'ils ont copiés et collés dans un projet en toute confiance. Le post intrigant de cffk était rafraîchissant en ce qu'il était public avec ces types de problèmes, qui ne sont pas souvent mentionnés, rarement codés publiquement pour la protection dans des extraits, et rarement discutés de cette manière, par rapport à la quantité de versions non protégées et non discutées qui sont publiées.
Depuis 20190923, la page wiki pour la formule haversine mentionne en effet le problème possible aux points antipodaux, en raison de problèmes de virgule flottante dans les appareils informatiques ... encourageant ...
https://en.wikipedia.org/wiki/Haversine_formula
(parce que cette page wiki n'a pas, pour le moment, d'ancrage html pour la section à laquelle je lierais directement, donc, après le chargement de la page, faites une recherche sur cette page du navigateur pour 'Quand utiliser ces formules' et vous voir plus officiellement le problème de l'haversine avec les points antipodes.)
Et cet autre site en a également une très brève mention:
https://www.movable-type.co.uk/scripts/latlong.html
Si l'on fait une recherche sur cette page pour «y compris la protection contre les erreurs d'arrondi», il y a ceci ...
Si atan2 n'est pas disponible, c pourrait être calculé à partir de 2 ⋅ asin (min (1, √a)) (y compris la protection contre les erreurs d'arrondi).
Maintenant, il existe un cas rare où des erreurs d'arrondi sont mentionnées et la protection affichée pour la version asin (), mais non mentionnée ou affichée pour la version atan2 (). Mais au moins, le risque d'erreurs d'arrondi est mentionné.
imho, toute application 24/7/365 utilisant haversine, a besoin de cette protection près des points antipodes comme un détail important et simple.
Je ne sais pas quels packages haversine incluent ou n'incluent pas cette protection, mais si vous êtes nouveau dans tout cela et que vous allez utiliser la ou les versions d'extraits publiées, vous savez maintenant qu'il a besoin de protection, et cette protection est très simple à mettre en œuvre, c'est-à-dire si vous n'utilisez pas vincenty, et n'utilisez pas un haversine packagé sans accès facile pour modifier le code du package.
IOW, que vous utilisiez vincenty ou haversine ou sloc, vous devez être conscient de tout problème avec le code, des choses à surveiller et à atténuer, et comment les problèmes vincenty vs haversine vs sloc différeront à mesure que l'on se rend compte de chacun problèmes cachés / edgecases, qui peuvent être connus ou non.