Maison >développement back-end >tutoriel php >Comment puis-je calculer avec précision la distance entre deux coordonnées géographiques en PHP ?
Calcul de la distance entre les coordonnées en PHP
Déterminer la distance entre les coordonnées géographiques est une tâche courante dans le développement Web. Cependant, il est crucial d'éviter les appels d'API inutiles et de mettre en œuvre des méthodes de calcul efficaces.
Une formule populaire pour mesurer la distance est la formule Haversine. Il utilise la latitude et la longitude de deux points pour calculer la distance qui les sépare, en tenant compte de la forme sphérique de la Terre.
Bien que vous ayez fourni une implémentation de la formule Haversine, elle peut donner des résultats peu fiables. Pour étudier le problème, examinons la formule et identifions les erreurs potentielles :
class CoordDistance { [...] 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; } [...] }
Pour améliorer la fiabilité de vos calculs de distance, considérez les suggestions suivantes :
Formule Haversine avec amélioration Précision :
function haversineGreatCircleDistance(float $latitudeFrom, float $longitudeFrom, float $latitudeTo, float $longitudeTo, float $earthRadius = 6371000.0) { ... $angle = 2 * asin(sqrt(pow(sin($latDelta / 2.0), 2) + cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2.0), 2))); return $angle * $earthRadius; }
Vincenty Formule :
function vincentyGreatCircleDistance(float $latitudeFrom, float $longitudeFrom, float $latitudeTo, float $longitudeTo, float $earthRadius = 6371000.0) { ... $a = pow(cos($latTo) * sin($lonDelta), 2) + pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2); $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta); $angle = atan2(sqrt($a), $b); return $angle * $earthRadius; }
En implémentant ces formules améliorées, vous pouvez obtenir des mesures de distance plus précises entre les coordonnées en PHP, même pour de grandes distances ou des points proches de points antipodaux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!