php - 如何在 Laravel 5 中按地理位置查询?

标签 php laravel laravel-5 geolocation eloquent

我希望将地理定位属性添加到我的“候选”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/

相关文章:

php - 正则表达式字边界替代

php - Linux 不支持大写文件名,知道吗?

php - 如何在 Codeigniter 中插入动态数据?

angular - Laravel 5.4 中的 Access-Control-Allow-Origin header 响应不适用于 POST

laravel-5 - Laravel:Stripe 未提供 API key 。 (提示:使用 Stripe::setApiKey() 设置您的 API key

php - CakePHP,通过一个或多个ID选择MySQL记录

javascript - Laravel 使用 webpack mix 导入 javascript 自定义文件

Laravel 使用 .htaccess 强制 HTTPS 使用 Amazon ELB 重定向太多

mysql - 检索最后插入的 ID。拉维尔

php - eloquent/laravel 的 save() 方法出现错误 500