Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Mengira Jarak Antara Dua Koordinat dengan Tepat dalam PHP?
Mengira Jarak Antara Koordinat dalam PHP
Pengukuran tepat jarak antara koordinat adalah penting untuk pelbagai aplikasi. Satu kaedah yang cekap untuk mengira ini ialah formula Haversine, yang memanfaatkan trigonometri sfera untuk menentukan jarak terpendek di sepanjang permukaan sfera (dalam kes ini, Bumi).
Melaksanakan Formula Haversine dalam PHP
Walaupun pelaksanaan PHP yang disediakan cuba menggunakan formula Haversine, ia mengandungi beberapa ralat:
Pelaksanaan Formula Haversine yang Diperbaiki
Berikut ialah pelaksanaan PHP yang diperbetulkan:
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; } }
Kaedah Alternatif: Formula Vincenty
Sementara Formula Haversine secara amnya boleh dipercayai, ia boleh mempamerkan kelemahan pada jarak yang melampau atau untuk titik antipodal (terletak betul-betul bertentangan antara satu sama lain pada sfera). Untuk senario ini, formula Vincenty menyediakan penyelesaian yang lebih tepat:
/** * 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; }
Atas ialah kandungan terperinci Bagaimana untuk Mengira Jarak Antara Dua Koordinat dengan Tepat dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!