如何获得附近的用户和距离?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得附近的用户和距离?相关的知识,希望对你有一定的参考价值。

首先,我想向您展示当前的数据库结构。有两个表:

用户

  • ID
  • 那么
  • LOCATION_ID

地点

  • ID
  • 岁月
  • LNG

现在我想实现一个API来获取附近的用户和他们的距离。喜欢附近的用户:

{{name:user1,distance:5km},(name:user2,distance:7 km)}
答案

你可以这样试试

用户模型

public function location(){
    return $this->belongsTo('AppLocation');
}

在Location模型中创建一个函数名称rsine然后创建一个以scopeIsWithinMaxDistance命名的本地作用域

位置模型

/**
 * Scope for adding distance filter
 */
public function scopeIsWithinMaxDistance($query, $rsine, $radius = 5)
{
    return $query->selectRaw("*, {$rsine} AS distance")
                 ->whereRaw("{$rsine} < ?", [$radius])
                 ->orderBy('distance');
}

/**
 * Sql command for finding distance between 2 coordinates
 */
public static function rsine($coordinates)
{
    return '(6371 * acos(cos(radians(' . $coordinates['latitude'] . ')) 
    * cos(radians(`lat`)) 
    * cos(radians(`lng`) 
    - radians(' . $coordinates['longitude'] . ')) 
    + sin(radians(' . $coordinates['latitude'] . ')) 
    * sin(radians(`lat`))))';
}

public static function convertKMToMiles($dist)
{
    return $dist * 1.609344;
}

现在在控制器中调用它

$coordinates = ['latitude' => '28.392200', 'longitude' => '77.320801'];

$rsine = Location::rsine($coordinates);

$radius = Location::convertKMToMiles(5); //convert KM to miles

$users = User::with(['location' => function ($query) use ($rsine) {
               $query->selectRaw("*, {$rsine} AS distance");
         }])->whereHas('location', function ($query) use ($radius, $rsine) {
               $query->isWithinMaxDistance($rsine, $radius);
         })->get();

现在你可以像这样打印

foreach($users as $user){
   $user->name;
   $user->location->city;
   $user->location->distance;
}

以上是关于如何获得附近的用户和距离?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中找到附近的应用程序用户?

按用户位置与 Firebase 附近的距离对数组进行排序

使用经度和纬度查找给定距离内的所有附近客户

google 的缓存策略将 api 放置在结果附近。

如何让用户在我在 geofire、Firebase 的位置附近

Flutter:如何在用户移动时获得精确的速度和行进距离?