当前位置: 首页 > 知识库问答 >
问题:

基于距离的Laravel用户集合排序

公良奇
2023-03-14
public function nearby()
{
    $user = auth()->user();

    $lat = auth()->user()->latitude;
    $lon = auth()->user()->longitude;
    $radius = 3; // km => converted to meter

    $angle_radius = (float)$radius / ( 111 * cos( (float)$lat ) ); // Every lat|lon degree° is ~ 111Km
    $min_lat = (float)$lat - (float)$angle_radius;
    $max_lat = (float)$lat + (float)$angle_radius;
    $min_lon = (float)$lon - (float)$angle_radius;
    $max_lon = (float)$lon + (float)$angle_radius;

    $persons = User::where('status', STATUS::ACTIVE)
                ->where('id', '!=', $user->id)
                ->whereBetween('latitude', [$min_lat, $max_lat])
                ->whereBetween('longitude', [$min_lon, $max_lon])
                ->get();

    $persons->each(function($person) {
        /* auth user coordinate vs user's coordinates */
        $point1 = array('lat' => auth()->user()->latitude, 'long' => auth()->user()->longitude);
        $point2 = array('lat' => $person->latitude, 'long' => $person->longitude);
        $distance = $person->getDistanceBetweenPoints($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);

        $person['distance'] = $distance;
    }); 

    return $persons;

}

我正在搜索半径3公里内的用户,基于用户的长/拉特。我正在比较auth long/lat和附近的用户long/lat。它返回具有距离的用户集合。

现在我很难按距离排序。

如果我添加orderBy('距离','desc')当然会导致一个错误,因为我的DB上没有距离列。

这是一种排序和分页的方法。

共有2个答案

上官羽
2023-03-14

这可能会有所帮助。

 $persons->sortBy('distance');
    return $persons;
桂德义
2023-03-14

$persons变量是一个集合对象,您可以使用以下文档中的集合方法:https://laravel.com/docs/5.6/collections#available-方法

您可以使用集合对象的排序功能。

laravel的分页在数据库查询级别(https://laravel.com/docs/5.6/pagination),因此您可以使用雄辩的orderBy方法。

如果您想实现这一点,请在用户表中放置一个距离列,但我认为您不希望这样做,因为您以编程方式在getDIanceBetweenPoint中计算距离。

我想到的另一个解决方案是为每个用户的距离创建一个单独的表。

您必须考虑一种解决方案,在数据库查询级别对距离进行排序。

希望这将帮助您解决您的问题:纬度/经度查找最近的纬度/经度-复杂sql或复杂计算

 类似资料:
  • 问题内容: 无法弄清楚如何对用户附近的 地址 进行自动 排序 。我不明白从哪里开始以及如何编写代码。 我的 firebase中 有地址。地址的类型为字符串(不是纬度/经度)。例: 我知道需要从firebase 使用 查询 ,但是如何使用 query ,我现在不明白。 这是我的代码: 如何使用 Firebase中的* 数据在用户附近自动 排序 地址? * 问题答案: 这是一个复杂的过程,需要多个步骤

  • 问题内容: 我有以下模型: 我应如何查询以距离排序(距离为无穷大)? 如果需要,可以在PosgreSQL,GeoDjango上工作。 问题答案: 首先,最好使一个点字段而不是使lat和lnt分开: 然后,你可以像这样过滤它:

  • 我读了一个算法来寻找二叉树中两个节点之间的距离。 这段代码在二叉树中找到(从根到给定节点的1个距离)。 我不明白的是,“x”有两个值,一个来自左子树,另一个来自右子树,它如何知道返回哪个值 例如,如果树类似于: 然后调用, 那么,在语句“”中,它如何返回正确的x值?

  • 我正在考虑根据与用户当前位置的距离过滤谷歌地图标记。我将此设置为从数据库中引入标记并显示在地图上,但我想限制这些标记的显示,仅显示距离用户当前位置3英里的标记。 我收到JSON形式的标记(具有lat long详细信息)如下: 收到的JSON示例: 我将地图放在用户位置的中心,如下所示: 我认为处理这个问题最有效的方法是过滤JSON,但我甚至不知道从哪里开始,因为我对谷歌地图API还不熟悉?我相信应

  • 问题内容: 我有一堂课,有两个日期字段说: 我想根据日期对上述类别的列表进行排序,如果它们相等,则根据max(activation)和max(timeStamp)进行排序。 我尝试的代码如下所示,仅获取max(激活) 任何帮助将不胜感激。 谢谢 问题答案: 这样就可以了!

  • 问题内容: 我是Java的初学者。请建议可以/应该使用哪些集合来维护Java中的排序列表。我尝试了和,但它们不是我想要的。 问题答案: 这来得很晚,但是JDK中有一个类只是为了获得排序列表。它被命名(与其他Sorted*接口有些混乱)“ ”。它可以排序或使用Comparator。 与 sorted using 的区别在于,通过使用堆数据结构,这将始终保持部分顺序,具有O(log(n))插入性能,而