首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 計算兩地經緯度距離:基於球面幾何的 Haversine 公式實作

     編輯:PHP 相關知識

PHP 計算兩地經緯度距離:基於球面幾何的 Haversine 公式實作

地理位置服務(LBS)中常需計算兩點球面距離。本文提供高精度、可配置單位的 PHP 函數,基於 Haversine 公式,假設地球為標準球體。

核心函數代碼

<?php
/**
 * 計算兩組經緯度間的距離
 * @param float $lat1 緯度1
 * @param float $lng1 經度1
 * @param float $lat2 緯度2
 * @param float $lng2 經度2
 * @param int   $unit  1=米(默認) | 2=公里
 * @param int   $precision 小數位數(默認2)
 * @return float 距離
 */
function getDistance($lat1, $lng1, $lat2, $lng2, $unit = 1, $precision = 2) {
    $EARTH_RADIUS = 6378.137; // 地球半徑 km
    $PI = 3.1415926535898;

    $radLat1 = deg2rad($lat1);
    $radLat2 = deg2rad($lat2);
    $dLat = $radLat1 - $radLat2;
    $dLng = deg2rad($lng1) - deg2rad($lng2);

    $a = sin($dLat/2)**2 + cos($radLat1) * cos($radLat2) * sin($dLng/2)**2;
    $distance = 2 * asin(sqrt($a)) * $EARTH_RADIUS; // km

    if ($unit == 1) $distance *= 1000; // 轉米
    return round($distance, $precision);
}

// 示例:北京天安門到上海外灘
echo getDistance(39.9042, 116.4074, 31.2304, 121.4737, 2); // 約 1084.56 km
?>

關鍵點說明

  • deg2rad() 內建函數替代手動 * PI/180,更清晰。
  • Haversine 公式 避免了球面余弦公式在短距離下的精度損失。
  • 單位靈活:預設米,支援公里,易於擴充海里、英尺等。
  • 精度控制:round() 避免浮點數顯示雜訊。

性能優化建議

  1. 高頻調用場景(如批量篩選附近 POI),可預先計算 sin/cos 或使用 MySQL 空間擴展(ST_Distance_Sphere)下推計算。
  2. 嚴格要求精度(測繪級)時,需引入 WGS84 橢球體模型(Vincenty 公式),PHP 可用 geotools-php/geotools 庫。

MySQL 5.7+ 原生空間查詢示例

SELECT ST_Distance_Sphere(
    POINT(116.4074, 39.9042),
    POINT(121.4737, 31.2304)
) / 1000 AS distance_km;

資料庫層面計算可大幅減少網絡傳輸與 PHP CPU 佔用,推薦大規模 LBS 應用採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved