半正弦和 Laravel

Haversine and Laravel

我正在尝试通过距离参数(设置在英里)

我现在要疯了,我在网上找到的很多解决方案都很难使用 DB::raw 移植到 laravels 查询构建器,我目前在查询范围内作为用户使用该功能将使用距离过滤 API 结果,但运气不好!

我在网上找到了一些计算haversine的函数,但我不知道如何使用它们。这是一个例子: https://gist.github.com/fhferreira/9081607

非常感谢任何帮助! :)

谢谢

所以你不需要那个要点中的所有臃肿,相反,你可以使用以下公式:

public function get_offers_near($latitude, $longitude, $radius = 1){

    $offers = Offer::select('offers.*')
        ->selectRaw('( 3959 * acos( cos( radians(?) ) *
                           cos( radians( offer_lat ) )
                           * cos( radians( offer_long ) - radians(?)
                           ) + sin( radians(?) ) *
                           sin( radians( offer_lat ) ) )
                         ) AS distance', [$latitude, $longitude, $latitude])
        ->havingRaw("distance < ?", [$radius])
        ->get();

    return $offers;
}

这假设您从用户那里传入 latitudelongitude。另外,如果你不希望半径为1,你可以传入第3个参数并提供自定义半径。

当然,我们假设这是针对 Offer 的模型。在需要时更改您的命名约定。

Laravel 中的 Haversine 以这种方式工作:

                Travel::select(
                    DB::raw("travels.*,
                          ( 6371 * acos( cos( radians($lat) ) *
                            cos( radians( lat ) )
                            * cos( radians( lon ) - radians($lng)
                            ) + sin( radians($lat) ) *
                            sin( radians( lat ) ) )
                          ) AS distance"))
                ->orderBy('distance', 'asc')
                ->get();

您将获得按距离排序的点集合(最近的在前)

使用了带参数 latlng 的旅行模型。参数 distance 由原始查询

添加