最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP/Laravel如何通過經(jīng)緯度計(jì)算距離獲取附近商家

 更新時(shí)間:2023年11月21日 11:24:59   作者:陌瀟  
實(shí)際開發(fā)中,常常需要獲取用戶附近的商家,本文給大家分享PHP/Laravel通過經(jīng)緯度計(jì)算距離獲取附近商家,感興趣的朋友一起看看吧

實(shí)際開發(fā)中,常常需要獲取用戶附近的商家,思路是

  • 獲取用戶位置(經(jīng)緯度信息)
  • 在數(shù)據(jù)庫中查詢在距離范圍內(nèi)的商家

注: 本文章內(nèi)計(jì)算距離所使用地球半徑統(tǒng)一為 6378.138 km

public function mpa_list($latitude,$longitude,$distance)
    {
        // $latitude = 34.306465;
        // $longitude = 109.050952;
        // $distance = 5;
        //1.計(jì)算最大最小經(jīng)緯度范圍
        $range  = 180 / pi() * $distance / 6378.138; //搜索 N km 之內(nèi)
        $lngR   = $range / cos($latitude * pi() / 180);
        $maxLat = $latitude + $range; //最大緯度
        $minLat = $latitude - $range; //最小緯度
        $maxLng = $longitude + $lngR; //最大經(jīng)度
        $minLng = $longitude - $lngR; //最小經(jīng)度
        //2.查找經(jīng)緯度符合條件的商家
        $list = Village::select("id","title","longitude","latitude")
                ->whereBetween('latitude', [$minLat, $maxLat])
                ->whereBetween('longitude', [$minLng, $maxLng])
                ->where('status', 1)
                ->get();
        //3.計(jì)算距離
        foreach ($list as &$item){
            $item['distance'] = $this->getDistanceBy2Point([$longitude, $latitude], [$item['longitude'], $item['latitude']]);
        }
        if($list){
            $list = $list->toArray();
        }
        //4.排序
        $list = $this->arraySort($list, 'distance');
        return $list;
    }

二維數(shù)組排序方法

// 二維數(shù)組排序方法
    public static function arraySort($arr, $field, $sort = SORT_ASC){
        $key = array_column($arr, $field);
        array_multisort($key, $sort, $arr);
        return $arr;
    }

根據(jù)經(jīng)緯度計(jì)算兩點(diǎn)距離

    /**
     * 根據(jù)起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)測距離
     * @param  [array]   $from     [起點(diǎn)坐標(biāo)(經(jīng)緯度),例如:array(118.012951,36.810024)]
     * @param  [array]   $to     [終點(diǎn)坐標(biāo)(經(jīng)緯度)]
     * @param  [bool]    $km        是否以公里為單位 false:米 true:公里(千米)
     * @param  [int]     $decimal   精度 保留小數(shù)位數(shù)
     * @return [string]  距離數(shù)值
     */
    public static function getDistanceBy2Point($from, $to, $km = true, $decimal = 2){
        sort($from);
        sort($to);
        $EARTH_RADIUS = 6378.138; // 地球半徑系數(shù)
        $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000;
        if($km && $distance > 1000){
            return round($distance / 1000, 2) . 'km';
        }
        return round($distance, $decimal) . 'm';
    }

實(shí)際測試:我這邊的測試數(shù)據(jù)比較少,我就用了50公里范圍之內(nèi)的。因?yàn)槲业臄?shù)據(jù)庫里面只添加了連個(gè)測試商家,大家將就看一下,理解了就行了。

到此這篇關(guān)于PHP/Laravel通過經(jīng)緯度計(jì)算距離獲取附近商家的文章就介紹到這了,更多相關(guān)php經(jīng)緯度距離計(jì)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

和林格尔县| 南雄市| 惠东县| 甘洛县| 石屏县| 三台县| 崇仁县| 老河口市| 获嘉县| 黄石市| 乌鲁木齐县| 山阴县| 搜索| 特克斯县| 华安县| 黔南| 灌阳县| 灌阳县| 奇台县| 光泽县| 磐安县| 玉林市| 山阳县| 镶黄旗| 荣昌县| 马龙县| 甘谷县| 蛟河市| 松江区| 盐边县| 长岛县| 营山县| 彭泽县| 定日县| 安西县| 周至县| 酒泉市| 界首市| 枣阳市| 卢龙县| 工布江达县|