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
Libérer: 2024-12-03 18:47:14
original
542 Les gens l'ont consulté

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;
    }
}
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal