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

3

有人可以帮我正确编写这个查询吗?

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

我需要做三件事:

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

到目前为止,我已经成功设置了数据库,并获得了用户一定距离内的音乐会:

$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();

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

我该如何按距离排序?

获取$distance以英里/千米为单位的正确方法是什么?因为我在文档中看到st_distance是以度数给出的。

1个回答

6
您可以选择使用 ST_DISTANCEST_DISTANCE_SPHEREMySQL 空间便利函数)然后:
$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]);

注意事项:

  • 将经度作为POINT空间函数的第一个参数,将纬度作为第二个参数进行存储。
  • ST_DISTANCEST_DISTANCE_SPHERE均默认以为单位返回距离。

你可以使用谷歌地图来展示数据。


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