欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)庫中查詢?cè)诰嚯x范圍內(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)測(cè)距離
     * @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í)際測(cè)試:我這邊的測(cè)試數(shù)據(jù)比較少,我就用了50公里范圍之內(nèi)的。因?yàn)槲业臄?shù)據(jù)庫里面只添加了連個(gè)測(cè)試商家,大家將就看一下,理解了就行了。

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

相關(guān)文章

最新評(píng)論