将百度坐标系 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;
}
后续对于频繁查询的坐标点,可以引入缓存机制,避免重复计算以及并行计算(如多线程扩展,提升计算效率)。