在Laravel中如何根据给定的距离和经纬度搜索所有位置

3
这是我的情境:我已经以以下方式将商铺详细信息保存在mysql数据库中。

商铺名称,纬度,经度,

现在如果有人提供了他的纬度、经度和距离(比如5公里),我需要为他筛选出所有5公里范围内的商铺,
在这里,用户是圆心,半径为5公里,我需要找到该圆内的所有商铺,我的应用程序是基于laravel 5.1开发的。
我尝试遵循这个code,但它不起作用。
有人能帮我吗?
3个回答

12
你可以在你的模型中添加以下代码。
public function ScopeDistance($query,$from_latitude,$from_longitude,$distance)
{
  // This will calculate the distance in km
  // if you want in miles use 3959 instead of 6371
  $raw = \DB::raw('ROUND ( ( 6371 * acos( cos( radians('.$from_latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$from_longitude.') ) + sin( radians('.$from_latitude.') ) * sin( radians( latitude ) ) ) ) ) AS distance');
  return $query->select('*')->addSelect($raw)->orderBy( 'distance', 'ASC' )->groupBy('distance')->having('distance', '<=', $distance);
}

你可以这样使用它

$ads = Ad::with(['user','photos'])->distance($from_latitude,$from_longitude,$distance)->get();

0
调整参数。我已经给了0.50,但你可以选择更小的值来减少覆盖面积。
$latitude = \Input::get('latitude');
$longitude = \Input::get('longitude');

$upper_latitude = $latitude + (.50); //Change .50 to small values
$lower_latitude = $latitude - (.50); //Change .50 to small values
$upper_longitude = $longitude + (.50); //Change .50 to small values
$lower_longitude = $longitude - (.50); //Change .50 to small values

$result = \DB::table('table')
        ->whereBetween('geo_locations.latitude', [$lower_latitude, $upper_latitude])
        ->whereBetween('geo_locations.logitude', [$lower_longitude, $upper_longitude])
        ->get();

0

看看这个: 给定2点、纬度和经度,计算距离

对于问题的代码部分,我认为最快的方法是将计算分成两部分。

首先,从坐标中构建一个5x5公里的正方形,然后使用Laravel中的whereBetween子句选择这些店铺之间的每一个。

然后,您可以使用链接中的公式计算精确距离。 基本上是 5 =< sqrt((latitude1-latitude2)^2+(longitude1-longitude2)^2)

只需将“(latitude1-latitude2)”和“(longitude1-longitude2)”转换为公里即可 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接