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

Posted

技术标签:

【中文标题】Laravel、MySQL 空间点距离:orderBy 和获取距离【英文标题】:Laravel, MySQL Spatial Point distance: orderBy and get distance 【发布时间】:2017-01-19 19:07:13 【问题描述】:

谁能帮我正确查询这个问题。

我有一个 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吗?

如何按距离订购?

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

【问题讨论】:

【参考方案1】:

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

使用ORDER BY sql 子句对结果排序 使用HAVING sql 子句(why can't use WHERE clause here)添加距离约束
$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 默认返回距离以为单位

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

【讨论】:

以上是关于Laravel、MySQL 空间点距离:orderBy 和获取距离的主要内容,如果未能解决你的问题,请参考以下文章

我如何将信息插入到 Order-OrderProduct 表 MySQL Laravel

在 mysql 中使用 union 和 order by 子句

使用 MySQL 查找距离内的点

MySQL 1215无法添加外键约束 - Laravel 5

空间数据:计算点与最大点值的距离并绘图

Python 计算三维空间某点距离原点的欧式距离