求助:timeController中计算坐标距离时deg2rad()参数类型错误
解决deg2rad()参数错误:expects parameter 1 to be float, object given
这个错误指向很明确——你给deg2rad()传了一个对象,但它只接受浮点数类型的参数!大概率是你在获取经纬度时,没把对象里的数值属性单独提取出来,或者拿到的坐标是字符串类型就直接扔给函数了。下面给你一步步解决:
先理清错误根源
比如你的坐标数据可能是这样的结构:
$coordinate = (object) ['lat' => 39.9042, 'lng' => 116.4074]; // 或是关联数组形式
如果直接把$coordinate整个传给deg2rad(),函数肯定会报错——它需要的是单个的纬度/经度数值,不是整个对象。
修正步骤和代码示例
1. 提取数值并确保是浮点数
不管你的坐标来自数据库、前端请求还是数组,先把lat和lng单独拿出来,强制转成浮点数(避免字符串类型导致的问题)。
2. 修正后的距离计算函数
function calculateCoordinateDistance($lat1, $lng1, $lat2, $lng2) { // 强制转换为浮点数,彻底避免非数值类型的干扰 $lat1 = floatval($lat1); $lng1 = floatval($lng1); $lat2 = floatval($lat2); $lng2 = floatval($lng2); $earthRadius = 6371; // 地球半径,单位公里,要英里的话换成3956 // 计算经纬度差值的弧度 $deltaLat = deg2rad($lat2 - $lat1); $deltaLng = deg2rad($lng2 - $lng1); // 用哈维正弦公式计算距离 $a = sin($deltaLat / 2) * sin($deltaLat / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($deltaLng / 2) * sin($deltaLng / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); return $earthRadius * $c; }
3. 正确调用函数
如果你的坐标是对象或关联数组,记得提取对应的属性再传入:
// 示例:假设坐标是关联数组 $pointA = ['lat' => '39.9042', 'lng' => '116.4074']; $pointB = ['lat' => 31.2304, 'lng' => '121.4737']; // 调用时传入单独的经纬度数值 $distance = calculateCoordinateDistance($pointA['lat'], $pointA['lng'], $pointB['lat'], $pointB['lng']); echo "两点距离:" . round($distance, 2) . "公里";
额外调试小技巧
如果还是不确定哪里出问题,在调用deg2rad()之前打印参数类型看看:
var_dump($lat1); // 正常应该输出float类型,如果是object/string就针对性处理
内容的提问来源于stack exchange,提问作者Okoye Kenneth
相关产品推荐
相关产品推荐

