ホームページ >バックエンド開発 >PHPチュートリアル >PHP で 2 つの地理座標間の距離を正確に計算するにはどうすればよいですか?

PHP で 2 つの地理座標間の距離を正確に計算するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-08 20:53:11182ブラウズ

How Can I Accurately Calculate the Distance Between Two Geographical Coordinates in PHP?

PHP での座標間の距離の計算

地理座標間の距離を決定することは、Web 開発における一般的なタスクです。ただし、不必要な API 呼び出しを避け、効率的な計算方法を実装することが重要です。

距離を測定するための一般的な公式の 1 つは、ハバーサイン公式です。 2 つの点の緯度と経度を使用して、地球の球形を考慮して、それらの間の距離を計算します。

Haversine の公式の実装を提供しましたが、信頼性の低い結果が得られる可能性があります。問題を調査するには、式を確認して潜在的なエラーを特定しましょう:

class CoordDistance
{
    [...]
    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;
    }
    [...]
}
  • 誤った変換: deg2rad() を使用して度からラジアンへの変換が正しく実行されていることを確認します。 .
  • 丸め誤差: 潜在的なものに注意してください高精度の浮動小数点計算を使用して誤差を丸めます。
  • 制限事項: 対蹠点 (180 度離れた) に近い点の距離を計算する場合、Haversine 式には制限があります。このような場合、Vincenty の公式のような代替公式の方が適切です。

距離計算の信頼性を高めるには、次の提案を検討してください:

改善された Haversine の公式精度:

function haversineGreatCircleDistance(float $latitudeFrom, float $longitudeFrom, float $latitudeTo, float $longitudeTo, float $earthRadius = 6371000.0) {
    ...
    $angle = 2 * asin(sqrt(pow(sin($latDelta / 2.0), 2) +
        cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2.0), 2)));
    return $angle * $earthRadius;
}

ヴィンセンティ式:

function vincentyGreatCircleDistance(float $latitudeFrom, float $longitudeFrom, float $latitudeTo, float $longitudeTo, float $earthRadius = 6371000.0) {
    ...
    $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;
}

これらの改良された式を実装することにより、長い距離や対蹠点に近い点であっても、PHP の座標間のより正確な距離測定値を取得できます。

以上がPHP で 2 つの地理座標間の距離を正確に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。