您的位置:首页 > 编程语言 > PHP开发

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

2017-08-07 15:04 603 查看
第一种:离我最近:

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

//计算两点之间距离

        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.*')

                      
bad6
  ->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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: