尝试使用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()->lat
和Auth::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 公式