半正弦和 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;
}
这假设您从用户那里传入 latitude
和 longitude
。另外,如果你不希望半径为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();
您将获得按距离排序的点集合(最近的在前)
使用了带参数 lat 和 lng 的旅行模型。参数 distance 由原始查询
添加
我正在尝试通过距离参数(设置在英里)
我现在要疯了,我在网上找到的很多解决方案都很难使用 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;
}
这假设您从用户那里传入 latitude
和 longitude
。另外,如果你不希望半径为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();
您将获得按距离排序的点集合(最近的在前)
使用了带参数 lat 和 lng 的旅行模型。参数 distance 由原始查询
添加