尝试使用haversine公式在laravel中获取非对象的属性

Posted

技术标签:

【中文标题】尝试使用haversine公式在laravel中获取非对象的属性【英文标题】:Trying to get property of non-object in laravel using haversine formula 【发布时间】:2020-07-10 12:48:37 【问题描述】:

我想从登录用户那里获取到所有车辆的距离,但是当我应用我的查询时,它返回一辆车的距离,然后在该行中显示“尝试获取非对象的属性”“$latFrom = deg2rad($lat ->lat);"

获取登录用户和车辆经纬度

  $users_id = Auth::id();
        // return $users_id;
$lon = DB::table('users')
        ->SELECT('lon')
        ->where("id", $users_id)
        ->first();
$lat = DB::table('users')
        ->SELECT('lat')
        ->where("id", $users_id)
        ->first();

$vehicles=DB::table('vehicle')
            ->get();

我的半正弦公式

   function haversineGreatCircleDistance(
  $lat, $lon, $vehicle_lat, $vehicle_lon, $earthRadius = 6371000)
      

    // return $lon;
  // convert from degrees to radians
  $latFrom = deg2rad($lat->lat);
  $lonFrom = deg2rad($lon->lon);
  $latTo   = deg2rad($vehicle_lat);
  $lonTo   = deg2rad($vehicle_lon);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;

应用haversine后我打印距离

foreach ($vehicles as $vehicle) 
                $center_lat = $lat;
                $center_lng = $lon;
                $lat=$vehicle->lat;
                $lng=$vehicle->lon;

                $distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 6371);
print($distance);

【问题讨论】:

为什么要从数据库中获取同一个用户 3 次? Auth::id()$lat$lon 都获得相同的用户.. 只需使用 Auth::user()->lat / Auth::user()->lon 对不起,我是 laravel 的新手,谢谢它的帮助 【参考方案1】:

您的代码中发生了一些奇怪的事情。很难确切知道 $latFrom 行出了什么问题,因为它看起来像 $lat 应该是一个对象,只是瞥了一眼您的代码。我的猜测是它在到达距离函数之前返回 null 或设置为 null。

您可以通过执行dd($lat) 并查看控制器内部实际返回的内容来检查这一点。它会使屏幕上的值变得愚蠢。您可以转储查询日志以查看实际执行的查询以及进一步排除故障。

Example option for dumping query in Laravel 7

但在这种情况下,我只是稍微重构一下,因为您根本不需要对 $lon 和 $lat 进行数据库调用。都是同一个用户,无论如何 laravel 已经为你填写了 auth 用户,可以使用 Auth::user() 命令检索。 $user = Auth::user();

然后 $user->lat 和 $user->lon 将从数据库中获取 lat 和 lon。

您也可以选择Auth::user()->latAuth::user()->lon,而无需先将其保存到单独的用户变量中。

在您的车辆循环中:

foreach ($vehicles as $vehicle) 
    $distance = havesineGreatCircleDistance($user->lat, $user->lon, $vehicle->lat, $vehicle->lon);

请注意,在将变量放入函数之前,我并没有费心设置变量,因为除非您出于某种原因想在该点之后使用这些名称引用它们,否则不会从中获得任何好处。

然后在函数中

$latFrom = deg2rad($lat);
$lonFrom = deg2rad($lon);

请注意这里的区别只是使用 $lat 而不是 $lat->lat。使用此方法,它们将不仅仅是对象,而是值,因此您不会希望将它们作为对象引用。

【讨论】:

以上是关于尝试使用haversine公式在laravel中获取非对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

Haversine 公式和 Python 3 - 数学域错误

如何使用 Haversine 公式计算行驶距离(不是位移)?

Codeigniter 和 SQL/Haversine 公式

在带有变量的javascript中使用haversine公式

Haversine 公式 - 数学略有偏差,不确定原因

Laravel附近的商店