首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haversine和Laravel

Haversine和Laravel
EN

Stack Overflow用户
提问于 2016-02-17 21:07:32
回答 2查看 3.4K关注 0票数 2

我试图通过一个距离参数(以英里为单位)将用户位置(通过URL中的params发送)与offers.offer_lat和offers.offer_long (在我的DB中)进行比较。

我现在快疯了,我在网上找到的很多解决方案都很难移植到使用DB::raw的大型查询生成器,我目前在查询范围内有这个函数,因为用户将使用距离过滤API结果,但是没有运气!

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

如有任何帮助,将不胜感激!:)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-17 21:22:36

因此,您不需要在该要点中的所有膨胀,相反,您可以使用以下公式:

代码语言:javascript
复制
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,则可以传递第三个参数并提供自定义半径。

当然,我们假设这是一个Offer模型。在需要时更改命名约定。

票数 12
EN

Stack Overflow用户

发布于 2019-05-24 20:51:43

拉拉维尔的哈弗森就是这样工作的:

代码语言:javascript
复制
                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();

你将得到一个按距离排序的点数集合(最近的第一个)。

采用带params、lat和lng的旅行模型。参数距离由原始查询添加。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35467774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档