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_DISTANCE
或ST_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_DISTANCE
和 ST_DISTANCE_SPHERE
默认返回距离以米为单位
您可以使用谷歌地图显示数据
【讨论】:
以上是关于Laravel、MySQL 空间点距离:orderBy 和获取距离的主要内容,如果未能解决你的问题,请参考以下文章
我如何将信息插入到 Order-OrderProduct 表 MySQL Laravel
在 mysql 中使用 union 和 order by 子句