Comment calculer la distance entre deux points spécifiés par la latitude et la longitude?
Pour plus de précision, je voudrais la distance en kilomètres; les points utilisent le système WGS84 et j'aimerais comprendre la précision relative des approches disponibles.
Réponses:
Ce lien peut vous être utile, car il détaille l'utilisation de la formule Haversine pour calculer la distance.
Extrait:
la source
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
place deMath.asin(Math.sqrt(h))
, qui serait la mise en œuvre directe de la formule que l'article Wikipedia utilise? Est-il plus efficace et / ou plus stable numériquement?(sin(x))²
égal(sin(-x))²
J'avais besoin de calculer beaucoup de distances entre les points pour mon projet, alors j'ai continué et j'ai essayé d'optimiser le code, j'ai trouvé ici. En moyenne, dans différents navigateurs, ma nouvelle implémentation s'exécute 2 fois plus vite que la réponse la plus votée.
Vous pouvez jouer avec mon jsPerf et voir les résultats ici .
Récemment, j'ai dû faire la même chose en python, voici donc une implémentation de python :
Et pour être complet: Haversine sur wiki.
la source
// 2 * R; R = 6371 km
signifie? et la méthode actuelle fournit une réponse en km ou en miles? a besoin d'une meilleure documentation. MerciVoici une implémentation C #:
la source
double dlon = Radians(lon2 - lon1);
etdouble dlat = Radians(lat2 - lat1);
RADIUS
valeur doit-elle être 6371 comme dans les autres réponses?Voici une implémentation java de la formule Haversine.
Notez que nous arrondissons ici la réponse au km le plus proche.
la source
6371000
comme rayon de la terre? (le rayon moyen de la Terre est de 6371000 mètres) ou convertir des kilomètres en mètres à partir de votre fonction?0.621371
Merci beaucoup pour tout ça. J'ai utilisé le code suivant dans mon application iPhone Objective-C:
La latitude et la longitude sont en décimales. Je n'ai pas utilisé min () pour l'appel asin () car les distances que j'utilise sont si petites qu'elles n'en ont pas besoin.
Il a donné des réponses incorrectes jusqu'à ce que je passe les valeurs en radians - maintenant c'est à peu près les mêmes que les valeurs obtenues à partir de l'application Map d'Apple :-)
Mise à jour supplémentaire:
Si vous utilisez iOS4 ou une version ultérieure, Apple fournit quelques méthodes pour ce faire afin que la même fonctionnalité soit obtenue avec:
la source
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
est incorrecte. Supprimez-les et le résultat correspond à ce que j'obtiens lorsque j'utilise d'autres implémentations sur cette page, ou implémentez la formule Haversine de Wikipedia à partir de zéro.()
environ cette somme, j'obtiens 3869.75. Sans eux, j'obtiens 3935,75, ce qui correspond à peu près à ce que révèle une recherche sur le Web.Il s'agit d'une simple fonction PHP qui donnera une approximation très raisonnable (sous +/- 1% de marge d'erreur).
Comme dit précédemment; la terre n'est PAS une sphère. C'est comme un vieux, vieux baseball avec lequel Mark McGwire a décidé de s'entraîner - il est plein de bosses et de bosses. Les calculs plus simples (comme celui-ci) le traitent comme une sphère.
Différentes méthodes peuvent être plus ou moins précises selon l'endroit où vous vous trouvez sur cet ovoïde irrégulier ET la distance entre vos points (plus ils sont proches, plus la marge d'erreur absolue est petite). Plus vos attentes sont précises, plus les calculs sont complexes.
Pour plus d'informations: distance géographique wikipedia
la source
Je poste ici mon exemple de travail.
Liste tous les points du tableau ayant une distance entre un point désigné (nous utilisons un point aléatoire - lat: 45.20327, long: 23.7806) inférieur à 50 KM, avec latitude et longitude, dans MySQL (les champs du tableau sont coord_lat et coord_long):
Énumérez tous ayant une DISTANCE <50, en kilomètres (considéré comme le rayon de la Terre 6371 KM):
L'exemple ci-dessus a été testé dans MySQL 5.0.95 et 5.5.16 (Linux).
la source
Dans les autres réponses, une implémentation r est manquant.
Le calcul de la distance entre deux points est assez simple avec la
distm
fonction dugeosphere
package:où:
Comme la terre n'est pas parfaitement sphérique, la formule de Vincenty pour les ellipsoïdes est probablement la meilleure façon de calculer les distances. Ainsi dans le
geosphere
package que vous utilisez alors:Bien sûr, vous n'avez pas nécessairement à utiliser le
geosphere
package, vous pouvez également calculer la distance en baseR
avec une fonction:la source
Le haversine est certainement une bonne formule pour probablement la plupart des cas, d'autres réponses l'incluent déjà, donc je ne vais pas prendre de la place. Mais il est important de noter que quelle que soit la formule utilisée (oui pas une seule). En raison de l'énorme plage de précision possible ainsi que du temps de calcul requis. Le choix de la formule nécessite un peu plus de réflexion qu'une simple réponse simple.
Cette publication d'une personne de la NASA est la meilleure que j'ai trouvée pour discuter des options
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Par exemple, si vous triez simplement des lignes par distance dans un rayon de 100 miles. La formule de la terre plate sera beaucoup plus rapide que la haversine.
Remarquez qu'il n'y a qu'un cosinus et une racine carrée. Vs 9 d'entre eux sur la formule Haversine.
la source
Vous pouvez utiliser la génération dans CLLocationDistance pour calculer ceci:
Dans votre cas, si vous voulez que les kilomètres soient divisés par 1000.
la source
Je n'aime pas ajouter une autre réponse, mais l'API Google maps v.3 a une géométrie sphérique (et plus). Après avoir converti votre WGS84 en degrés décimaux, vous pouvez le faire:
Aucun mot sur la précision des calculs de Google ou même sur le modèle utilisé (même s'il dit "sphérique" plutôt que "géoïde". Soit dit en passant, la distance en "ligne droite" sera évidemment différente de la distance si l'on voyage sur la surface de la terre qui est ce que tout le monde semble présumer.
la source
Implantation de python Origin est le centre des États-Unis contigus.
Pour obtenir la réponse en kilomètres, définissez simplement miles = false.
la source
Il pourrait y avoir une solution plus simple et plus correcte: le périmètre de la terre est de 40 000 km à l'équateur, environ 37 000 sur le cycle de Greenwich (ou n'importe quelle longitude). Donc:
Je suis d'accord pour qu'il soit affiné car, j'ai moi-même dit que c'est un ellipsoïde, donc le rayon à multiplier par le cosinus varie. Mais c'est un peu plus précis. Par rapport à Google Maps, cela a permis de réduire considérablement l'erreur.
la source
Toutes les réponses ci-dessus supposent que la terre est une sphère. Cependant, une approximation plus précise serait celle d'un sphéroïde oblat.
la source
Voici l'implémentation SQL pour calculer la distance en km,
Pour plus de détails sur l'implémentation en programmant le langage, vous pouvez simplement parcourir le script php donné ici
la source
Voici une implémentation dactylographiée de la formule Haversine
la source
Comme indiqué, un calcul précis doit tenir compte du fait que la terre n'est pas une sphère parfaite. Voici quelques comparaisons des différents algorithmes proposés ici:
Sur de petites distances, l'algorithme de Keerthana semble coïncider avec celui de Google Maps. Google Maps ne semble suivre aucun algorithme simple, ce qui suggère que c'est peut-être la méthode la plus précise ici.
Quoi qu'il en soit, voici une implémentation Javascript de l'algorithme de Keerthana:
la source
Ce script [en PHP] calcule les distances entre les deux points.
la source
la source
Pour calculer la distance entre deux points sur une sphère, vous devez faire le calcul du Grand Cercle .
Il existe un certain nombre de bibliothèques C / C ++ pour aider à la projection de cartes dans MapTools si vous devez reprojeter vos distances à une surface plane. Pour ce faire, vous aurez besoin de la chaîne de projection des différents systèmes de coordonnées.
Vous pouvez également trouver MapWindow un outil utile pour visualiser les points. En tant que source ouverte, c'est un guide utile sur la façon d'utiliser la bibliothèque proj.dll, qui semble être la bibliothèque de projection open source principale.
la source
Voici l'implémentation de réponse acceptée portée sur Java au cas où quelqu'un en aurait besoin.
la source
Voici l'implémentation VB.NET, cette implémentation vous donnera le résultat en KM ou en Miles basé sur une valeur Enum que vous passez.
la source
J'ai condensé le calcul vers le bas en simplifiant la formule.
Le voici en Ruby:
la source
La solution de Chuck, valable également pour des miles.
la source
Voici mon implémentation Java pour le calcul de la distance via les degrés décimaux après quelques recherches. J'ai utilisé le rayon moyen du monde (de wikipedia) en km. Si vous voulez des résultats en miles, utilisez le rayon du monde en miles.
la source
Dans Mysql, utilisez la fonction suivante pour passer les paramètres en utilisant
POINT(LONG,LAT)
la source
la source
voici un exemple en sql postgres (en km, pour la version miles, remplacer 1.609344 par la version 0.8684)
la source
Voici un autre code converti en Ruby :
la source
il y a un bon exemple ici pour calculer la distance avec PHP http://www.geodatasource.com/developers/php :
la source