You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:14:45