Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Mengira Jarak Antara Dua Koordinat dengan Tepat dalam PHP?

Bagaimana untuk Mengira Jarak Antara Dua Koordinat dengan Tepat dalam PHP?

Susan Sarandon
Susan Sarandonasal
2024-12-03 18:47:14468semak imbas

How to Accurately Calculate the Distance Between Two Coordinates in 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:

  • Delta untuk longitud hendaklah dikira sebagai $delta_lon = $this->lon_b - $this->lon_a; (tanda tolak diterbalikkan).
  • Jarak sfera hendaklah dikira sebagai $jarak = 2 * $jejari_bumi * asin(sqrt($a)); (menggunakan sin dan bukannya acos).

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn