web-dev-qa-db-fra.com

Formules pour calculer la proximité géographique

Je dois implémenter une recherche de proximité géographique dans mon application, mais je suis très confus quant à la bonne formule à utiliser. Après quelques recherches sur le Web et dans StackOverflow, j'ai trouvé que les solutions sont:

  1. Utilisez la formule Haversine
  2. Utilisez la Formule de distance du grand cercle
  3. Utilisez un moteur de recherche spatiale dans la base de données

L'option n ° 3 n'est vraiment pas une option pour moi ATM. Maintenant, je suis un peu confus, car je pensais toujours que les formule de distance du grand cercle et formule de Haversine étaient synonymes mais apparemment j'avais tort?

Haversine Formula

La capture d'écran ci-dessus a été prise à partir du papier génial Geo (proximité) avec MySQL, et utilise les fonctions suivantes:

ASIN, SQRT, POWER, SIN, PI, COS

J'ai également vu des variations de même formule ( loi sphérique des cosinus ) , comme celui-ci:

(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))

Cela utilise les fonctions suivantes:

ACOS, COS, RADIANS, SIN

Je ne suis pas un expert en mathématiques, mais ces formules sont-elles les mêmes? Je suis tombé sur quelques autres variations et formules (comme les loi sphérique des cosinus) et le Vincenty'sformules - qui semble être le plus précis) et cela me rend encore plus confus ...

Je dois choisir une bonne formule à usage général à implémenter dans PHP/MySQL. Quelqu'un peut-il m'expliquer les différences entre les formules que j'ai mentionnées ci-dessus?

  • Lequel est le plus rapide à calculer?
  • Lequel fournit les résultats les plus précis?
  • Lequel est le meilleur en termes de vitesse/précision des résultats?

J'apprécie votre perspicacité sur ces questions.


Basé sur theonlytheory réponse, j'ai testé les formules de distance du grand cercle suivantes:

  • Formule Vincenty
  • Formule Haversine
  • Loi sphérique des cosinus

La formule Vincenty est extrêmement lente, cependant elle est assez précise (jusqu'à 0,5 mm) .

La formule Haversine est beaucoup plus rapide que la formule Vincenty, j'ai pu exécuter 1 million de calculs en environ 6 secondes, ce qui est à peu près acceptable pour mes besoins.

La formule de la loi sphérique des cosinus s'est révélée être presque deux fois plus rapide que la formule Haversine, et la différence de précision est la négligence pour la plupart des cas d'utilisation.


Voici quelques emplacements de test:

  • Siège de Google (37.422045, -122.084347)
  • San Francisco, Californie (37.77493, -122.419416)
  • Tour Eiffel, France (48.8582, 2.294407)
  • Opéra, Sydney (-33.856553, 151.214696)

Siège de Google - San Francisco, Californie:

  • Formule Vincenty: 49 087.066 meters
  • Formule Haversine: 49 103.006 meters
  • Loi sphérique des cosinus: 49 103.006 meters

Siège Google - Tour Eiffel, France:

  • Formule Vincenty: 8 989 724.399 meters
  • Formule Haversine: 8 967 042.917 meters
  • Loi sphérique des cosinus: 8 967 042.917 meters

Siège de Google - Opera House, Sydney:

  • Formule Vincenty: 11 939 773.640 meters
  • Formule Haversine: 11 952 717.240 meters
  • Loi sphérique des cosinus: 11 952 717.240 meters

Comme vous pouvez le voir, il n'y a aucune différence notable entre la formule Haversine et la loi sphérique des cosinus, mais les deux ont des décalages de distance aussi élevés que 22 kilomètres par rapport à la formule Vincenty car elle utilise une approximation ellipsoïdale de la terre au lieu d'une approximation sphérique.

67
Alix Axel

La loi des cosinus et la formule Haversine donneront des résultats identiques en supposant une machine avec une précision infinie. La formule Haversine est plus robuste aux erreurs en virgule flottante. Cependant, les machines d'aujourd'hui ont une double précision de l'ordre de 15 chiffres significatifs, et la loi des cosinus peut très bien fonctionner pour vous. Ces deux formules supposent une terre sphérique, tandis que la solution itérative de Vicenty (la plus précise) suppose une terre ellipsoïdale (en réalité, la terre n'est même pas un ellipsoïde - c'est un géoïde). Quelques références: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

C'est de mieux en mieux: notez la latitude à utiliser dans la loi des cosinus ainsi que la Haversine est la latitude géocentrique, qui est différente de la latitude géodésique. Pour une sphère, ces deux sont les mêmes.

Lequel est le plus rapide à calculer?

Dans l'ordre, du plus rapide au plus lent: loi des cosinus (5 appels trig.) -> haversine (implique sqrt) -> Vicenty (doit résoudre cela de manière itérative dans une boucle for)

Lequel est le plus précis?

Vicenty.

Laquelle est la meilleure lorsque la vitesse et la précision sont prises en compte?

Si votre domaine de problème est tel que pour les distances que vous essayez de calculer, la terre peut être considérée comme plate, alors vous pouvez élaborer (je ne vais pas donner de détails) une formule de la forme x = kx * différence de longitude , y = ky * différence de latitude. Alors distance = sqrt (dx dx + dy dy). Si votre domaine de problème est tel qu'il peut être résolu avec une distance au carré, vous n'aurez pas à prendre sqrt, et cette formule sera aussi rapide que possible. Il a l'avantage supplémentaire de pouvoir calculer la distance du vecteur - x est la distance dans la direction est et y est la distance dans la direction nord. Sinon, expérimentez avec les 3 et choisissez ce qui fonctionne le mieux dans votre situation.

35
morpheus

Vous souhaitez donc:

  • trier les enregistrements par distance à partir de p0
  • sélectionner uniquement les enregistrements dont la distance de p0 est inférieure à r

L'astuce est que vous n'avez pas besoin de calculer exactement la distance du grand cercle pour cela! Vous pouvez faire avec la fonction any d'une paire de points à une valeur réelle qui augmente strictement avec la grande distance circulaire entre les points. Il existe de nombreuses fonctions de ce type et certaines sont beaucoup plus rapides à calculer que les différentes formules pour la distance exacte du grand cercle. L'une de ces fonctions est la distance euclidienne en 3D. La conversion de la latitude et de la longitude en un point 3D sur la sphère n'implique pas de fonctions trigonométriques inverses.

Une fois que vous avez x, Y, Z, vous pouvez vous rendre compte que vous n'avez pas réellement besoin de la distance de p0 à votre point, car vous pouvez également utiliser la distance du plan tangent à p0. Cette distance augmente également strictement avec la distance du grand cercle et est calculée à partir de X, Y, Z comme une combinaison linéaire - même une racine carrée n'est pas nécessaire. Il vous suffit de précalculer les coefficients et la distance de coupure correspondant à la distance souhaitée du grand cercle.

12
BASTA