将百度坐标系 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 点之间的距离,通常采用球面三角学中的半正矢公式 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; }
后续对于频繁查询的坐标点,可以引入缓存机制,避免重复计算以及并行计算(如多线程扩展,提升计算效率)。