tp3.2根据经纬度查询离我最近,并按指定范围查询商家,由近到远排序。

第一种:离我最近:

首先引入一个计算两点之间距离的一个方法:

//计算两点之间距离
        function getDistance($lat1, $lng1, $lat2, $lng2)
        {
        $earthRadius = 6367000; //approximate radius of earth in meters
         
        /*
        Convert these degrees to radians
        to work with the formula
        */
         
        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;
         
        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;
         
        /*
        Using the
        Haversine formula
         
        http://en.wikipedia.org/wiki/Haversine_formula
         
        calculate the distance
        */
         
        $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;
         
        return round($calculatedDistance);
        }

//智能排序(距离离我最近)
        public function distance(){
              //获取当前粉丝的经纬度
              $wx_id=$_SESSION['wx_id'];
              $fansdata=M('fans')->where(array('uid' => $wx_id ))->find();
              $position= $fansdata['position'];
              $posarray=explode(',', $position);
              $lng1=$posarray['0'];//我的经度
              $lat1=$posarray['1'];//我的纬度
             //查询商家表,获取各自的经纬度
              $where['state']=1;
              $sellerdata=M('seller')
                        ->alias('s')
                        ->field('s.id as sellerid,s.*,sin.*')
                        ->join('zbt_seller_infor AS sin ON s.id = sin.sid')
                        ->where($where)
                        ->select();
              foreach ($sellerdata as $key => $value)
              {
                $lng2=$value['lng'];
                $lat2=$value['lat'];
                $distance=$this->getDistance($lat1, $lng1, $lat2, $lng2);
                //echo $distance.',';
                $sellerdata[$key]['distance']=$distance;
             }
              array_multisort(array_column($sellerdata,'distance'),SORT_ASC,$sellerdata);
              $this -> assign('seller',$sellerdata);
              $this -> display('mengdian/restlist');



        }
第二种:指定范围查询商家,由近到远排序。


        //附近(智能范围)
        public function range(){
            $rangemetre=I('get.rangemetre');//米
            $degrees=$rangemetre*0.001*0.001;//将米先换算成千米,再换算成度
            //echo $degrees;
            //获取当前粉丝的经纬度
              $wx_id=$_SESSION['wx_id'];
              $fansdata=M('fans')->where(array('uid' => $wx_id ))->find();
              $position= $fansdata['position'];
              $posarray=explode(',', $position);
              $lng=$posarray['0'];//我的经度
              $lat=$posarray['1'];//我的纬度
              $where="";
              if($lat && $lng){//有经纬度
                      $lat1 = $lat + $degrees; $lat_1 = $lat - $degrees;//0.001度=1km=1公里
                        $lng1 = $lng + $degrees; $lng_1 = $lng - $degrees;//0.001度=1km=1公里
                  $where1= $where." lat>".$lat_1."AND lat<".$lat1." AND lng>".$lng_1." AND lng<".$lng1." ";     
                  $askCnt = M('seller')
                        ->alias('s')
                        ->field('s.id as sellerid,s.*,sin.*')
                        ->join('zbt_seller_infor AS sin ON s.id = sin.sid')
                        ->where($where1)
                        ->count();  //统计数量
                        
                 }
                //echo  $askCnt;die;
               if($askCnt){            //取到500条数据---根据经纬度
                $gap_where = $where . " lat>".$lat_1."AND lat<".$lat1." AND lng>".$lng_1." AND lng<".$lng1." ";        //附近经纬度绝对值0.001
              }else{                  //根据经纬度没取到数据
                  $gap_where = $where;
              }
              $arr = M("seller")
                        ->alias('s')
                        ->field('s.id as sellerid,s.*,sin.*')
                        ->join('zbt_seller_infor AS sin ON s.id = sin.sid')->where($gap_where)->select();
             
            foreach ($arr as $key => $value)
              {
                //var_dump($value);
                $lng2=$value['lng'];
                $lat2=$value['lat'];
                $distance=$this->getDistance($lat, $lng, $lat2, $lng2);
                //echo $distance.',';
                $arr[$key]['distance']=$distance;
             }
            array_multisort(array_column($arr,'distance'),SORT_ASC,$arr);
            $this -> assign('seller',$arr);
            $this -> display('mengdian/restlist');

        }

第二种视图层为:

<li class="focus">
                                <p>附近</p>
                                <ul class="select_second_ul" style="display: block;">
                                    <li>附近(智能范围)</li>
                                    <li><a href="__APP__/Weixin/Mengdian/range/rangemetre/500">500</a></li>
                                    <li><a href="__APP__/Weixin/Mengdian/range/rangemetre/1000">1000</a></li>
                                    <li><a href="__APP__/Weixin/Mengdian/range/rangemetre/1500">1500</a></li>
                                    <li><a href="__APP__/Weixin/Mengdian/range/rangemetre/2000">2000</a></li>
                                </ul>
                            </li>




猜你喜欢

转载自blog.csdn.net/tianjingang1/article/details/76844464