Maison >développement back-end >tutoriel php >Comment puis-je calculer avec précision la distance entre deux coordonnées géographiques en PHP ?

Comment puis-je calculer avec précision la distance entre deux coordonnées géographiques en PHP ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-08 20:53:11181parcourir

How Can I Accurately Calculate the Distance Between Two Geographical Coordinates in 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;
    }
    [...]
}
  • Conversion incorrecte : Assurez-vous que la conversion des degrés en radians est effectuée correctement à l'aide de deg2rad() .
  • Erreurs d'arrondi : Prenez soin des erreurs d'arrondi potentielles en utilisant une virgule flottante de haute précision calculs.
  • Limites : La formule Haversine a des limites lors du calcul des distances pour les points proches des points antipodaux (espacés de 180 degrés). Dans de tels cas, des formules alternatives comme la formule Vincenty sont plus appropriées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn