1. 程式人生 > >微信小程式通過經緯度計算兩地距離php程式碼實現

微信小程式通過經緯度計算兩地距離php程式碼實現

 最近小程式專案中,要求做個根據使用者當前位置獲取周圍商家地址,並且按照由近到遠排序的需求,所以做一下記錄:

根據兩點間的經緯度計算距離

 /**
     *  @desc 根據兩點間的經緯度計算距離
     *  @param float $lat 緯度值
     *  @param float $lng 經度值
     *  @param $status true KM,M顯示;false 只返回M
     */
    function getDistance($lat1, $lng1, $lat2, $lng2, $status = true, $single = true)
    {
        $earthRadius = 6367000;
        //approximate radius of earth in meters
        $lat1 = (floatval($lat1) * pi()) / 180;
        $lng1 = (floatval($lng1) * pi()) / 180;
        $lat2 = (floatval($lat2) * pi()) / 180;
        $lng2 = (floatval($lng2) * pi()) / 180;
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        if (!$single) {
            return round($calculatedDistance);
            exit;
        }
//把大於1000米的轉換成km
        if ($status) {
            $m = round($calculatedDistance) / 1000;
            return $m > 1 ? round($m, 1) . "km" : ($m * 1000) . "m";
            //return round($m,2);       //這個是我在程式中用的,以為排序比較方便,大家根據需求選用
        } else {
            return round($calculatedDistance) . "m";
        }
    }

通過距離排序

 /**
     * @param Request $request
     * @return array
     * 獲取分類商店,並按距離排序
     */
    public function getShop(Request $request){
        $c_id = $request->get('c_id');
        $lat1 = $request->get('lat');
        $lng1 = $request->get('lng');
        $lat1U = floatval($lat1)+0.01;
        $lat1D = floatval($lat1)-0.01;
        $lng1U = floatval($lng1)+0.01;
        $lng1D = floatval($lng1)-0.01;
        $data = DB::table('hunqing_shop')
            ->where('c_id',$c_id)
            ->where('lat','<',$lat1U)      //獲取周圍經緯度差0.01的商家距離
            ->where('lat','>',$lat1D)
            ->where('lng','<',$lng1U)
            ->where('lng','>',$lng1D)
            ->get();
        $res = json_encode($data);
        $arr1 = json_decode($res,true);
        $arr = [];
       foreach ($arr1 as $k=>$v){
            $res = $this -> getDistance($lat1,$lng1,$v['lat'],$v['lng']);
            $arr1[$k]['km'] = $res.'km';
            $arr[$k] = $res;
        }
        asort($arr);
        $arr2 = [];
        foreach($arr as $k=>$v){
            $arr2[] = $arr1[$k];
        }
        return $arr2;
    }

以上是通過程式程式碼來實現的,下面我再附加一條sql語句來實現的,具體哪種比較快,有感興趣的可以自己測試一下,記得留言哦!!!

SELECT
    id,
    lat,
    lng,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            $lat * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            $lng * PI() / 180 - lng * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS distance
FROM
    image_hunqing_shop
ORDER BY
    distance asc

上程式碼都經測試,放心使用,有測試不通的留言即可!