Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为啥?

Posted

技术标签:

【中文标题】Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为啥?【英文标题】:Laravel - When retrieving the distance when given a user's longitude & latitude, I keep getting the same result on all models. Why?Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为什么? 【发布时间】:2018-04-30 23:07:51 【问题描述】:

我的数据库中有一个 JSON 列,用于存储经度和纬度坐标,设置为:

_geoloc:lat: 33.6556324, lng: -117.7015161. 

我正在尝试使用用户的经度和纬度坐标查询数据库,以检索在一定距离内的所有记录。下面是我正在使用的函数,但是所有结果都返回与每个模型相同的 7797.5012454514 距离。我想将$distance 参数作为英里传递。

protected function get_locations( $latitude, $longitude, $distance = 8000 ) 
    $results= my_table::select( 'my_table.*' )
        ->selectRaw( '(3959 * (acos( cos( radians(?) )
            * cos( radians( "_geoloc->lat" ) )
            * cos( radians( "_geoloc->lng" ) - radians(?))
            + sin( radians( ? ) )
            * sin( radians( "_geoloc->lat" ) ) ) ) )
        AS distance', [ $latitude, $longitude, $latitude ] )
        ->havingRaw( "distance< ?", [ $distance ] )
        ->groupBy( 'first_name' )
        ->get();
    return $results;

【问题讨论】:

【参考方案1】:

以防其他人遇到同样的问题。该解决方案需要在查询中使用 JSON_EXTRACT 以及 $ 符号来标记对象。

protected function get_locations( $latitude, $longitude, $distance = 20 ) 
    $results = ( new my_table)->having( 'distance', '<', $distance )
                                      ->select( DB::raw( "*,
                 (3959 * ACOS(COS(RADIANS($latitude))
                       * COS(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat')))
                       * COS(RADIANS($longitude) - RADIANS(JSON_EXTRACT(`_geoloc`,'$.lng')))
                       + SIN(RADIANS($latitude))
                       * SIN(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))))) AS distance" )
                                      )->orderBy( 'distance', 'asc' )
                                      ->get();
    return $results

【讨论】:

以上是关于Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

从用户地图上的 4 个角检索纬度和经度

给定纬度/经度,使用 JSONP 检索城市和州的最简单方法是啥? [关闭]

基于纬度/经度查询附近兴趣点的 SQL 查询 - SQLite

MySQL:多个纬度和经度的附近位置

从中心到给定点的纬度、经度和地理区域(NW、NE、SW、SE)

如何使用 Bing 地图检索邮政地址的纬度和经度?