THINKPHP3.2获取附近商家的实现
首先把商家的经纬度存数据库
/** * @param string $address 地址 * @param string $city 城市名 * @return array */ public function getLatLng($address='',$city=''){ $result = array(); $ak = '';//您的百度地图ak,可以去百度开发者中心去免费申请 $url ="http://api.map.baidu.com/geocoder/v2/?callback=renderOption&output=json&address=".$address."&city=".$city."&ak=".$ak; $data = file_get_contents($url); $data = str_replace('renderOption&&renderOption(', '', $data); $data = str_replace(')', '', $data); $data = json_decode($data,true); if (!empty($data) && $data['status'] == 0) { $result['lat'] = $data['result']['location']['lat']; $result['lng'] = $data['result']['location']['lng']; return $result;//返回经纬度结果 }else{ return null; } }
前台获取用户的经纬度地址,获取用户城市。
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=C03899adf85230a417ad037197e5bd88"></script> <script> var geolocation = new BMap.Geolocation(); geolocation.getCurrentPosition(function(r) { if (this.getStatus() == BMAP_STATUS_SUCCESS) { var url = "__MODULE__/Common/location"; var lng = r.point.lng; var lat = r.point.lat; $.post(url, {lng: lng, lat: lat},function(data){ if (data == 1) { return false; }else{ lyaer.msg('定位失败'); } }); }else { lyaer.msg('failed' + this.getStatus()); } }, {enableHighAccuracy: true}) </script>
/** * 定位 * @return [type] [description] */ public function location() { $lng = I('post.lng'); $lat = I('post.lat'); if (!$lng || !$lat) { $this->ajaxReturn(0); } $url = 'http://api.map.baidu.com/geocoder/v2/?ak=C03899adf85230a417ad037197e5bd88&callback=renderReverse&location=' . $lat . ',' . $lng . '&output=json&pois=1'; $content = file_get_contents($url); //dump($content); die(); preg_match('/"district":"(.*?)",/msi', $content, $matches); $city = $matches[1]; if ($city) { $city_id = M('mall_zone')->where('kindname = "' . $city . '"')->getField('pid as id'); if ($city_id) { cookie('lng',$lng); cookie('lat',$lat); cookie('city',$city); cookie('city_id', $city_id); $this->ajaxReturn(1); } else { $this->ajaxReturn(0); } } } /** *根据用户商家的经纬度,获取附近的商家 */ public function myNearShop(){ $slat = session('lat'); $slng = session('lng'); $sql = "SELECT *, ROUND(6378.138*2*ASIN(SQRT(POW(SIN(($slat*PI()/180-lat*PI()/180)/2),2)+COS($slat*PI()/180)*COS(lat*PI()/180)*POW(SIN(($slng*PI()/180-lng*PI()/180)/2),2)))) AS juli FROM sline_mall where is_check = 1 HAVING juli <= 5"; $shop = M('mall')->query($sql); $this->assign('shop',$shop); }