web-dev-qa-db-fra.com

La formule Haversine ou la formule Vincenty est-elle meilleure pour calculer la distance?

Quel est le meilleur pour calculer la distance entre deux points de latitude/longitude, la formule Haversine ou la formule Vincenty's? Pourquoi?

La distance est évidemment calculée sur Terre. Est-ce que les coordonnées WGS84 vs GCJ02 ont un impact sur le calcul ou la distance (la formule de Vincenty prend en compte l'axe WGS84)?

Par exemple, dans Android, la formule Haversine est utilisée dans Google Map Utils , mais la formule Vincenty est utilisée par l'objet Android.Location (Location.distanceBetween()).

20
jjNford

Haversine est un calcul plus simple mais il ne fournit pas les offres Vincenty de haute précision.

Vincenty est plus précis mais est également plus gourmand en calcul et fonctionnera donc plus lentement et augmentera l'utilisation de la batterie.

Comme pour tout "mieux", c'est une question d'application particulière. Pour votre application, Vincenty peut être un "meilleur" choix que Haversine, mais pour une application différente, Haversine peut être un meilleur choix. Vous devrez examiner les détails de vos cas d'utilisation et prendre une décision en fonction de ce que vous y trouverez.

12
andand

Haversine et Vincenty sont deux algorithmes pour résoudre différents problèmes. Haversine calcule la distance du grand cercle sur une sphère tandis que Vincenty calcule la distance (géodésique) la plus courte à la surface d'un ellipsoïde de révolution. La réponse à votre question peut donc être divisée en 2 parties:

  1. Voulez-vous calculer la distance sur une sphère sur un ellipsoïde?
  2. Quelle est la précision de Haversine ou Vincenty dans le calcul du problème donné?

Pour les applications terrestres, un ellipsoïde de révolution est une approximation raisonnable du "niveau moyen de la mer"; l'erreur est de ± 100 m. L'aplatissement de cet ellipsoïde est faible, environ 1/300, et peut donc être approximé par une sphère (de volume égal, par exemple).

Les distances des grands cercles diffèrent des distances géodésiques jusqu'à 0,5%. Dans certaines applications, par exemple, quelle est la distance du Cap au Caire?, Cette erreur peut être négligée. Dans d'autres applications, par exemple la détermination des frontières maritimes, elle est beaucoup trop grande (elle est de 5 m sur une distance de 1 km). En général, vous êtes plus en sécurité en utilisant la distance géodésique.

Si vous êtes intéressé par la distance parcourue (en voiture, en bateau ou en avion), il y a beaucoup de contraintes sur le chemin emprunté et ni le grand cercle ni la distance géodésique, qui mesurent la longueur des chemins les plus courts sur une surface idéale, ne seraient approprié.

Sur la question de savoir si les algorithmes sont exacts:

Haversine est précis pour arrondir à moins que les points ne soient presque antipodes. De meilleures formules sont données dans le article Wikipedia sur les distances des grands cercles .

Vincenty est généralement précis à environ 0,1 mm. Cependant, si les points sont presque antipodaux, l'algorithme ne parvient pas à converger et l'erreur est beaucoup plus importante. Je donne un meilleur algorithme pour résoudre le problème géodésique dans Algorithmes pour la géodésique . Voir aussi le article Wikipedia sur les géodésiques sur un ellipsoïde .

La résolution du problème géodésique est plus lente que la résolution du grand cercle. Mais c'est toujours très rapide (environ 1 μs par calcul), donc cela ne devrait pas être une raison pour préférer de grandes distances de cercle.

[~ # ~] adendum [~ # ~]

Ici est le Java package qui implémente mon algorithme pour trouver les distances géodésiques. Contrairement à la méthode de Vincenty, cela est précis pour arrondir et converge partout.

31
cffk