ホームページ >バックエンド開発 >PHPチュートリアル >PHP で 2 つの地理座標間の距離を正確に計算するにはどうすればよいですか?
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; } [...] }
距離計算の信頼性を高めるには、次の提案を検討してください:
改善された 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 サイトの他の関連記事を参照してください。