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

时间:2017-01-19 19:07:14

标签: mysql laravel distance spatial

任何人都可以帮我解决这个问题。

我有一个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();

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

我如何按距离订购?

我在$distance以度数给出的文档中读到以英里/公里为单位的st_distance的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以选择ST_DISTANCEST_DISTANCE_SPHEREMySQL 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]);

注意:

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

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