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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 18:47:14469ブラウズ

How to Accurately Calculate the Distance Between Two Coordinates in PHP?

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

座標間の距離を正確に測定することは、さまざまなアプリケーションにとって不可欠です。これを計算するための効率的な方法の 1 つは、球面三角法を活用して球 (この場合は地球) の表面に沿った最短距離を決定する Hasversine 公式です。

PHP での Haversine 公式の実装

提供された PHP 実装は Haversine 式を利用しようとしますが、それには特定のものが含まれています。エラー:

  • 経度のデルタは $delta_lon = $this->lon_b - $this->lon_a; として計算する必要があります。 (マイナス記号は反転します)。
  • 球面距離は、 $ distance = 2 * $earth_radius * asin(sqrt($a)); として計算する必要があります。 (acos の代わりに sin を使用)。

改良された Haversine 式の実装

修正された PHP 実装は次のとおりです。

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;
    }
}

代替方法: Vincenty式

ハバーサインの公式は一般的に信頼できますが、極端な距離や対蹠点 (球面上で互いに真向かいに位置する) では弱点を示す可能性があります。これらのシナリオでは、Vincenty の公式がより正確な解決策を提供します。

/**
 * 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;
}

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

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