我希望将地理定位属性添加到我的“候选”Eloquent 模型中。我想根据他们的位置找到候选人。例如,找到旧金山 20 英里范围内的所有候选人。我的 Eloquent 模型应该如何存储候选人在数据库中的位置?
如何根据位置查询候选人?我正在使用 Laravel 5.3。
最佳答案
就个人而言,我之前通过存储一组纬度和经度坐标实现了这一点。
你可以使用一个叫做 Haversine formula 的东西计算指定坐标集与您的情况下的候选集之间的“乌鸦飞翔”距离。
这是此类查询的示例。例如,这个计算“距离 37,-122 坐标 25 英里半径内最近的 20 个位置。”
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) )
* cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;
最初发现 here .
如果您要将经纬度添加到候选模型,这可以很容易地适应您的需求。
SELECT *, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) )
* cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance
FROM candidates
ORDER BY distance
LIMIT 0, 20;
您可以将其实现为某种查询范围,例如(未经测试,输入清理最少)
public function scopeClosestTo($query, $lat, $lng)
{
return $query->orderByRaw(
'(3959 * acos(cos(radians(' . floatval($lat) . ')) * cos(radians(lat)) * cos(radians(lng) - radians(' . floatval($lng) . ')) + sin(radians(' . intval($lat) . ')) * sin(radians(lat)))) ASC'
);
}
注意:在这种情况下,3959 是以英里为单位的地球半径,公式将以英里为单位计算距离。如果您需要以千米为单位的距离,请将 3959 更改为 6371。感谢@Lionel 在评论中指出这一点。
关于php - 如何在 Laravel 5 中按地理位置查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353824/