PHP 计算两个 GPS 之间的距离

| 选择喜欢的代码风格  

BD-09 转 WGS-84


将百度坐标系 BD-09 转换为 WGS-84 坐标系的 PHP 函数示例

<?php
function BD09LLtoWGS84($fLng, $fLat) {  
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
    $x = $fLng - 0.0065;  
    $y = $fLat - 0.006;  
    $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);  
    $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);  
    $lng = $z * cos($theta);  
    $lat = $z * sin($theta);  
    return array('lng' => $lng, 'lat' => $lat);  
}

计算两个 GPS 点之间的距离


计算两个 GPS 点之间的距离,通常采用球面三角学中的半正矢公式 Haversine formula。该公式考虑了地球的曲率,适用于短距离计算,以下是一个使用 Haversine formula 公式计算两点之间距离的 PHP 函数示例:

<?php
function distanceBetween($fP1Lat, $fP1Lon, $fP2Lat, $fP2Lon) {  
    $fEARTHRADIUS = 6378137; // 地球半径(米)  
    $fRadLon1 = deg2rad($fP1Lon);  
    $fRadLon2 = deg2rad($fP2Lon);  
    $fRadLat1 = deg2rad($fP1Lat);  
    $fRadLat2 = deg2rad($fP2Lat);  
      
    $fD1 = abs($fRadLat1 - $fRadLat2);  
    $fD2 = abs($fRadLon1 - $fRadLon2);  
      
    $fP = pow(sin($fD1 / 2), 2) + cos($fRadLat1) * cos($fRadLat2) * pow(sin($fD2 / 2), 2);  
    $distance = $fEARTHRADIUS * 2 * asin(sqrt($fP));  
      
    return $distance; // 返回距离(米)  
}

判断点是否在经纬度节点范围内


判断一个点是否在特定经纬度范围区域内,通常采用射线法 Ray-casting algorithm。该方法通过从目标点向任意方向发射一条射线,计算射线与多边形边界的交点数,根据交点数的奇偶性判断点是否在多边形内。

以下是一个判断点是否在多边形内的 PHP 函数示例:

<?php
function judgeCoordsInArea($point, $polygon) {  
    $x = $point['lat'];  
    $y = $point['lng'];  
    $inside = false;  
      
    for ($i = 0, $j = count($polygon) - 1; $i < count($polygon); $j = $i++) {  
        $xi = $polygon[$i]['lat'];  
        $yi = $polygon[$i]['lng'];  
        $xj = $polygon[$j]['lat'];  
        $yj = $polygon[$j]['lng'];  
          
        if (($yi > $y) != ($yj > $y) && ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi)) {  
            $inside = !$inside;  
        }  
    }  
      
    return $inside;  
}

GPS 计算优化


后续对于频繁查询的坐标点,可以引入缓存机制,避免重复计算以及并行计算(如多线程扩展,提升计算效率)。

 

GPS 计算扩展阅读:




发表评论