Maison >développement back-end >tutoriel php >Comment calculer avec précision la distance entre deux coordonnées en 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 :
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!