Laravel、MySQL 空间点距离:orderBy 和获取距离

dbr*_*dbr 3 mysql distance spatial laravel

谁能帮我正确回答这个问题。

我有一个Concert模型和另一个Location模型。演唱会属于一个地点。位置表有一个空间点字段。

我需要做三件事:

  • 按距用户位置的距离排序
  • 显示距用户位置的距离
  • 获取距用户位置一定距离内的音乐会

到目前为止,我已成功设置数据库并获取距用户一定距离的音乐会,如下所示:

$condition = ($lat != null && $lon != null && $distance != null);
Concert::when($condition, function ($query) use ($distance,$lat,$lon) {
      return $query->whereHas('location', function($query) use ($distance,$lat,$lon) {
          $query->whereRaw('st_distance(location,POINT('.$lat.','.$lon.')) < '.$distance);
      });
  })
->get();
Run Code Online (Sandbox Code Playgroud)

你能帮我如何st_distance在视图中显示它吗?

我如何按距离排序?

正如我在以度为单位的$distance文档中读到的那样,获取英里/公里的正确方法是什么?st_distance

小智 6

您可以选择ST_DISTANCEST_DISTANCE_SPHERE( MySQL Spatial Convenience Functions ),然后:

$raw = 'SELECT
  ST_X(location) AS longitude,
  ST_Y(location) AS latitude,
  ST_DISTANCE_SPHERE(location, POINT(?, ?)) AS dist
FROM
  concerts,
  locations
WHERE
  concerts.id = locations.id
HAVING
  dist < ?
ORDER BY
  dist';
$pointsWithDist = DB::select($raw, [$lon, $lat, $distance]);
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 将经度存储为第一个参数,将纬度存储为第二个参数POINT空间函数的第一个参数,将纬度存储为第二个参数
  • 默认情况下,两者ST_DISTANCE都会返回以米ST_DISTANCE_SPHERE为单位的距离

您可以使用谷歌地图来显示数据