php+高德地图webapi 高德jsapi 实现 当前位置与目标位置距离 并按照距离排序(坐标逆转换)

匿名 (未验证) 提交于 2019-12-02 22:11:45

<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak='自己申请'&s=1"></script> <script type="text/javascript" charset="utf-8">           var geolocation = new BMap.Geolocation();         geolocation.getCurrentPosition(function (r) {             if (this.getStatus() == BMAP_STATUS_SUCCESS) {                 var lat = r.point.lat;                 var lng = r.point.lng;             }             // return;             var data = {'lat': lat, 'merchid': "{$item['id']}",'classid': "{$classitem['id']}", 'lng': lng};             $.ajax({                 url: "{php echo mobileUrl('shop/category/ajaxcodot')}",                 data: data,                 cache: false             }).done(function (result) {                 var data = jQuery.parseJSON(result);                 if (data.status == 1) {                     if(data.result.code == 1){                         console.log(data.result.code)                         $(".shop").html(data.result.html)                         // $("#coll").hide()                     }else{                         $(".shop").hide()                         $(".noinfo").show()                     }                 } else {                     alert("微信接口繁忙,请稍后再试!");                                      }             });           })   </script>
首先定位当前位置

    public function ajaxdot()//查询结果页     {          global $_W;         global $_GPC;          $province = $_GPC['province'];         $city = $_GPC['city'];         $area = $_GPC['area'];         $classid = $_GPC['classid'];                   $lat = floatval($_GPC['lat']);         $lng = floatval($_GPC['lng']);          $merch = pdo_fetch('SELECT * FROM ' . tablename('ewei_shop_merch_user') . ' WHERE id = '.$_GPC['merchid']);                    $where = 'where 1';         $where.= " and province = '$province'";         if($merch['cateid'] != 6)         $where.= " and company_number = '{$merch['company_number']}'";         if(!empty($city)){             $where.= " and city = '$city'";         }                 if(!empty($area)){             $where.= " and area = '$area'";         }                           if($merch['cateid'] == 1 && $classid){           //  var_dump($classid);exit;              $class = pdo_fetch('SELECT class_type FROM ' . tablename('ewei_shop_merch_user_class') . ' WHERE id = '.$classid);                $class_type = $class['class_type'];           $where.= " and class_type = '$class_type'";         }                            if(!empty($_GPC['classid'])){             $classitem = pdo_fetch('SELECT * FROM ' . tablename('ewei_shop_merch_user_class') . ' WHERE id = :classid',array('classid' => $_GPC['classid']));                     }                  $table = tablename('ewei_shop_merch_user_address');         if($merch['cateid'] == 6){             if($merch['company_number'] == 'TXDX001'){                  $where.= " and class_type = 'DX'";             }else if($merch['company_number'] == 'TXDX002'){                 $where.= " and class_type = 'YD'";             }else if($merch['company_number'] == 'TXDX003'){                 $where.= " and class_type = 'LT'";             }            $table =tablename('ewei_shop_merch_tx_address');         }                           $detail = pdo_fetchall("SELECT * FROM $table " ."$where");                          // var_dump($detail);                  if($detail){             $html = '';             foreach ($detail as $key=>$v) {                 if($v['lat'] == '' || $v['lng'] == ''){                        $lntarr = $this->addresstolatlag($v['detail']);                     $store['lng'] = $lntarr[0];                     $store['lat'] = $lntarr[1];                      // var_dump($lntarr);                     $lat_num = explode('.', $store['lat']);                     if (1 < sizeof($lat_num)) {                         $decimal = end($lat_num);                         $count = strlen($decimal);                         if ($count <= 6) {                             $gcj02 = $this->Convert_GCJ02_To_BD09($store['lat'], $store['lng']);                             $store['lat'] = $gcj02['lat'];                             $store['lng'] = $gcj02['lng'];                         }                     }                     $distance = m('util')->GetDistance($lat, $lng, $store['lat'], $store['lng'], 2);                     $where = array();                     $where['id'] = $v['id'];                     pdo_update('ewei_shop_merch_user_address', $store,$where);                 }else{                                          $distance = m('util')->GetDistance($lat, $lng, $v['lat'], $v['lng'], 2);                 }                 $detail[$key]['distance'] = $distance;                 $flag[] = $distance;             }             array_multisort($flag, SORT_ASC, $detail); //按距离排序                          foreach ($detail as $key=>$v) {                 $distance = $v['distance'];                 $html.='<div class="iimg">                 <img id="" width="110" src="../addons/ewei_shopv2/static/img/4S.jpg" alt="" />                 </div>                 <div class="info">                 <p class="s_title">'.$v["shopname"].'</p>                 <p class="s_address"> '.$v['detail'].'</p>                 <p class="s_address" style="    color: green;"> 距您'.$distance.'km</p>                 <div class="s_bot">                     <a href="tel:'.$v["tel1"].'" style="color:#000"><div class="bimgl" style="    width: 40px;"><img width="20" src="../addons/ewei_shopv2/static/img/carTel.jpg" alt="" /> </div>                     <div class="btel"> '.$v['tel1'].'</div></a>                     <div class="bimgr" onclick="docollectad('.$v['id'].','.$table.')"><img width="20" src="../addons/ewei_shopv2/static/img/carSC.jpg" alt="" /></div>                     <a href="./index.php?i=4&c=entry&m=ewei_shopv2&do=mobile&r=shop.category.address&merchid='.$merch['id'].'&detail='.$v['detail'].'&shopname='.$v['shopname'].'"><div class="bimgr"><img width="20" src="../addons/ewei_shopv2/static/img/carDW.jpg" alt="" /></div></a>                     <div class="t_clear"></div>                 </div>                         </div>                 <div class="t_clear"></div>';             }                                    $arr = array('code' => 1, 'html'=>$html);             show_json(1, $arr);                    }else{                $arr = array('code' => 2);             show_json(1, $arr);           }     }    
计算距离 并返回 数据

    /**      * 计算两组经纬度坐标 之间的距离      * params :lat1 纬度1; lng1 经度1; lat2 纬度2; lng2 经度2; len_type (1:m or 2:km);      * return m or km      */     public function GetDistance($lat1, $lng1, $lat2, $lng2, $len_type = 1, $decimal = 2)     {         $pi = 3.1415926000000001;         $er = 6378.1369999999997;         $radLat1 = $lat1 * $pi / 180;         $radLat2 = $lat2 * $pi / 180;         $a = $radLat1 - $radLat2;         $b = $lng1 * $pi / 180 - $lng2 * $pi / 180;         $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));         $s = $s * $er;         $s = round($s * 1000);          if (1 < $len_type) {             $s /= 1000;         }          return round($s, $decimal);     }
计算距离 函数

    public function Convert_GCJ02_To_BD09($lat, $lng)     {         $x_pi = 3.1415926535897931 * 3000 / 180;         $x = $lng;         $y = $lat;         $z = sqrt($x * $x + $y * $y) - 2.0000000000000002E-5 * sin($y * $x_pi);         $theta = atan2($y, $x) - 3.0000000000000001E-6 * cos($x * $x_pi);         $data['lng'] = $z * cos($theta) + 0.0064999999999999997;         $data['lat'] = $z * sin($theta) + 0.0060000000000000001; //         var_dump($data);         return $data;     }     public function addresstolatlag($address){         $url='http://restapi.amap.com/v3/geocode/geo?address='.$address.'&key=48e598c5f71f20d2cd5a18d6e3142d27';         // var_dump(file_get_contents($url));exit;         if($result=file_get_contents($url))         {             $result = json_decode($result,true);             //判断是否成功             if(!empty($result['count'])){                 return  explode(',',$result['geocodes']['0']['location']);                  }else{                 return false;             }         }     }     
校正坐标函数 webapi函数

说明下 由于 客户给的地址 比较乱 只有详细地址 没有坐标
这边利用高德提供的webapi转换了坐标 之后计算的距离

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!