PHP 计算经纬度两点间距离函数实现

许南星
许南星
发布时间:2026-10-13 | 3人浏览过
原创

在处理地理位置数据时,经常需要计算两个经纬度坐标点之间的实际地表距离。本文将展示如何使用 PHP 中的 Haversine 公式高效完成这一计算,并支持切换千米与英里输出。

核心逻辑:Haversine 公式

Haversine 公式是计算球面上两点间大圆距离的经典方法。在 PHP 中,我们可以通过简单的数学运算结合正弦和余弦函数来实现。该算法考虑了地球的曲率,因此在短距离内具有足够的精度。

代码实现

以下是一个完整的 PHP 函数实现。它接收四个参数:起点纬度 ($lat1)、起点经度 ($lng1)、终点纬度 ($lat2) 和终点经度 ($lng2)。可选的 $miles 参数用于控制返回值是千米还是英里。

第1步:定义角度转换常量与半径

首先将十进制度的经纬度转换为弧度,这是三角函数的输入要求。同时定义地球平均半径为 6372.797 km。

function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
    // 将度数转换为弧度
    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lng1 *= $pi80;
    $lat2 *= $pi80;
    $lng2 *= $pi80;

    // 地球平均半径(千米)
    $r = 6372.797;

第2步:计算纬度差与经度差

分别计算两点在纬度和经度方向上的差值,用于后续的正弦平方项计算。

    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;

第3步:应用 Haversine 核心公式

利用正弦与余弦组合计算中心角相关的系数 $a,再通过反余切函数 atan2 求得中心角 $c。

    $a = sin($dlat/2)*sin($dlat/2) +
         cos($lat1)*cos($lat2)*sin($dlng/2)*sin($dlng/2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;

第4步:单位转换与返回结果

若用户要求英里且传入参数 $miles 为真,则将千米乘以 0.621371192 进行换算,否则直接返回千米值。

    return ($miles ? ($km * 0.621371192) : $km);
}

使用示例

假设我们需要计算北京(约北纬39.9042,东经116.4074)到上海(约北纬31.2304,东经121.4737)的距离:

$beijingLat = 39.9042;
$beijingLng = 116.4074;
$shanghaiLat = 31.2304;
$shanghaiLng = 121.4737;

// 获取千米距离
$distanceKm = distance($beijingLat, $beijingLng, $shanghaiLat, $shanghaiLng, false);
echo "北京到上海距离:" . number_format($distanceKm, 2) . " km\n";

// 获取英里距离
$distanceMiles = distance($beijingLat, $beijingLng, $shanghaiLat, $shanghaiLng, true);
echo "北京到上海距离:" . number_format($distanceMiles, 2) . " miles\n";

注意事项与优化建议

  • 精度限制:该公式适用于大多数日常定位场景,但对于极高精度的地质测量需求,可能需要考虑更复杂的地球椭球模型(如 Vincenty 公式)。
  • 性能考量:由于涉及多次三角函数调用,当需要计算海量点对之间的距离时,建议在数据库层面使用 PostGIS 等空间扩展功能以加速查询。
  • 输入校验:生产环境中务必对输入的经纬度范围进行合法性检查,确保其在有效区间内(纬度 -90~90,经度 -180~180)。

以上就是PHP计算经纬度两点间距离函数实现的详细内容,更多关于PHP位置服务开发的相关资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表