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

Comment calculer avec précision la distance entre deux coordonnées en PHP ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 18:47:14468parcourir

How to Accurately Calculate the Distance Between Two Coordinates in PHP?

Calcul de la distance entre les coordonnées en PHP

Une mesure précise des distances entre les coordonnées est essentielle pour diverses applications. Une méthode efficace pour calculer cela est la formule Haversine, qui exploite la trigonométrie sphérique pour déterminer la distance la plus courte le long de la surface d'une sphère (dans ce cas, la Terre).

Implémentation de la formule Haversine en PHP

Bien que l'implémentation PHP fournie tente d'utiliser la formule Haversine, elle contient certains erreurs :

  • Le delta pour la longitude doit être calculé comme suit : $delta_lon = $this->lon_b - $this->lon_a; (le signe moins est inversé).
  • La distance sphérique doit être calculée comme $distance = 2 * $earth_radius * asin(sqrt($a)); (en utilisant sin au lieu de acos).

Une implémentation améliorée de la formule Haversine

Voici une implémentation PHP corrigée :

class CoordDistance
{
    public $lat_a;
    public $lon_a;
    public $lat_b;
    public $lon_b;

    public $measure_unit = 'kilometers';
    public $measure_state = false;
    public $measure;
    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;
    }
}

Méthode alternative : Formule Vincenty

Alors que la formule Haversine est généralement fiable, il peut présenter des faiblesses à des distances extrêmes ou pour des points antipodaux (situés directement en face les uns des autres sur la sphère). Pour ces scénarios, la formule Vincenty apporte une solution plus précise :

/**
 * Calculates the great-circle distance between two points, using the Vincenty formula.
 *
 * @param float $latitudeFrom Latitude of start point in [deg decimal]
 * @param float $longitudeFrom Longitude of start point in [deg decimal]
 * @param float $latitudeTo Latitude of target point in [deg decimal]
 * @param float $longitudeTo Longitude of target point in [deg decimal]
 * @param float $earthRadius Mean earth radius in [m]
 * @return float Distance between points in [m] (same as earthRadius)
 */
public static function vincentyGreatCircleDistance(
    $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000
) {
    // Convert from degrees to radians
    $latFrom = deg2rad($latitudeFrom);
    $lonFrom = deg2rad($longitudeFrom);
    $latTo = deg2rad($latitudeTo);
    $lonTo = deg2rad($longitudeTo);

    $lonDelta = $lonTo - $lonFrom;
    $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;
}

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