Salut, j'ai le besoin de calculer la distance entre deux points ayant le lat et le long.
Je souhaite éviter tout appel à une API externe.
J'ai essayé d'implémenter la formule Haversine en PHP:
Voici le code:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
En le testant avec des points donnés qui ont des distances publiques, je n'obtiens pas de résultat fiable.
Je ne comprends pas s'il y a une erreur dans la formule d'origine ou dans mon implémentation
php
coordinates
geocoding
haversine
maxdangelo
la source
la source
Réponses:
Il n'y a pas longtemps, j'ai écrit un exemple de la formule haversine et l'ai publié sur mon site Web:
➽ Notez que vous récupérez la distance dans la même unité que vous passez avec le paramètre
$earthRadius
. La valeur par défaut est 6371000 mètres donc le résultat sera également en [m]. Pour obtenir le résultat en miles, vous pourriez par exemple passer 3959 miles$earthRadius
et le résultat serait en [mi]. À mon avis, c'est une bonne habitude de s'en tenir aux unités SI, s'il n'y a aucune raison particulière de faire autrement.Éditer:
Comme TreyA l'a correctement souligné, la formule Haversine présente des faiblesses avec les points antipodaux en raison d'erreurs d'arrondi (bien qu'elle soit stable sur de petites distances). Pour les contourner, vous pouvez utiliser la formule Vincenty à la place.
la source
J'ai trouvé ce code qui me donne des résultats fiables.
résultats :
la source
C'est juste un ajout aux réponses @martinstoeckli et @Janith Chinthana . Pour ceux qui souhaitent savoir quel algorithme est le plus rapide, j'ai écrit le test de performance . Le meilleur résultat de performance montre une fonction optimisée de codexworld.com :
Voici les résultats des tests:
la source
1.1515 * 1.609344 = 1.853
. Merci, fixé à 1.853.Voici le code simple et parfait pour calculer la distance entre deux latitude et longitude. Le code suivant a été trouvé à partir d'ici - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
la source
Pour ceux qui aiment le plus court et le plus rapide (ne pas appeler deg2rad ()).
la source
Essayez ceci donne des résultats impressionnants
la source
Question assez ancienne, mais pour ceux qui s'intéressent à un code PHP qui renvoie les mêmes résultats que Google Maps, ce qui suit fait le travail:
J'ai testé avec différentes coordonnées et cela fonctionne parfaitement.
Je pense que cela devrait être plus rapide que certaines alternatives. Mais je n'ai pas testé cela.
Astuce: Google Maps utilise 6378137 comme rayon de la Terre. Donc, l'utiliser avec d'autres algorithmes pourrait également fonctionner.
la source
Pour les valeurs exactes, faites-le comme ça:
Hmm je pense que ça devrait le faire ...
Éditer:
Pour les formulaires et au moins les implémentations JS, essayez: http://www.movable-type.co.uk/scripts/latlong.html
Osez-moi ... j'ai oublié de deg2rad toutes les valeurs dans les fonctions de cercle ...
la source
Bonjour ici Code pour obtenir la distance et le temps en utilisant deux lat et long différents
Vous pouvez vérifier l'exemple ci-dessous Lien obtenir le temps entre deux endroits différents en utilisant la latitude et la longitude en php
la source
Essayez cette fonction pour calculer la distance entre des points de latitude et de longitude
Ensuite, utilisez la fonction comme
J'espère que ça aide
la source
Le multiplicateur est changé à chaque coordonnée en raison de la théorie de la distance des grands cercles comme écrit ici:
http://en.wikipedia.org/wiki/Great-circle_distance
et vous pouvez calculer la valeur la plus proche en utilisant cette formule décrite ici:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
la clé convertit chaque degré - minute - seconde valeur en toute valeur en degré:
la source
L'un des moyens les plus simples est:
Il arrondira jusqu'à 2 décimales.
la source