PHP判断经纬度点是否在圆形区域(含边界)内的问题求助
正确判断经纬度点是否在圆形区域内的PHP实现
之前方法的问题
- 第一种方法里的
^是PHP的按位异或运算符,不是用来计算平方的幂运算,正确的平方计算应该用$dx ** 2或者pow($dx, 2),这本身就是语法错误。 - 更关键的是:经纬度是球面地理坐标,不是平面直角坐标。直接用平面勾股定理算距离完全不对——经度每度对应的地面距离会随纬度变化,越靠近两极越短,而且地球是曲面,两点间的实际距离得用球面距离公式计算。
正确实现代码
用Haversine公式计算两点间的球面距离(单位:米),再和半径对比:
public function pointInCircle($circleLat, $circleLng, $radiusMeters, $pointLat, $pointLng) { // 地球平均半径,单位:米 $earthRadius = 6371000; // 将角度转换为弧度(三角函数计算需要弧度值) $latDiff = deg2rad($pointLat - $circleLat); $lngDiff = deg2rad($pointLng - $circleLng); // Haversine公式核心计算 $a = sin($latDiff / 2) ** 2 + cos(deg2rad($circleLat)) * cos(deg2rad($pointLat)) * sin($lngDiff / 2) ** 2; $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); // 计算两点间的实际球面距离(米) $distance = $earthRadius * $c; // 判断点是否在圆内或边界上 return $distance <= $radiusMeters ? "inside" : "outside"; }
代码说明
- 先把经纬度的差值转换成弧度,因为PHP的三角函数只接受弧度参数。
- Haversine公式是专门用来计算球面上两点最短距离(大圆距离)的标准公式,结果和实际地面距离误差极小。
- 最后把计算出的距离和给定的半径(米)比较,满足条件就返回"inside",否则返回"outside"。
内容的提问来源于stack exchange,提问作者Shasika Madhushan
相关产品推荐
相关产品推荐

