PHP依据用户当前定位的经纬度判断距离最近的门店
发表于:2022-01-27 16:16:58浏览:1503次
最近有个系统有个功能是根据用户当前定位的经纬度判断距离最近的门店,大致位置就行,算的直线距离。
通过百度地图API获取用于的当前经纬度
/** * @param string $address 地址 * @param string $city 城市名 * @return array */ 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; } }
$lon = ''; $lng = ''; $dattos = []; //$res是查出来的门店数组 foreach ($res as $key => $value) { if($value['lon'] == ''){ $value['distance'] = false; $dattos[] = $value; }else{ $distance = $this->getDistance($lon,$lng,$value['lon'],$value['lng'],2); $value['distance'] = $distance; $dattos[] = $value; } } //计算距离 function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){ $EARTH_RADIUS = 6370.996; // 地球半径系数 $PI = 3.1415926; $radLat1 = $latitude1 * $PI / 180.0; $radLat2 = $latitude2 * $PI / 180.0; $radLng1 = $longitude1 * $PI / 180.0; $radLng2 = $longitude2 * $PI /180.0; $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2))); $distance = $distance * $EARTH_RADIUS * 1000; if($unit==2){ $distance = $distance / 1000; } return round($distance, $decimal); }
微信获取经纬度地址
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>//微信接口获取当前用户经纬度var latitude, longitude;wx.ready(function () { // 获取用户位置 wx.getLocation({ success: function (res) { //console.log('res', res) latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 var speed = res.speed; // 速度,以米/每秒计 var accuracy = res.accuracy; // 位置精度 //调用百度接口 根据经纬度信息获取地址 $.ajax({ url: "https://api.map.baidu.com/geocoder/v2/?ak=2GhAjyOSR2zqbv2o4MaMIEHY3ieP1ixC&callback=renderReverse&location=" + latitude + "," + longitude + "&output=json&pois=1", type: "get", dataType: "jsonp", jsonp: "callback", success: function (data) { var province = data.result.addressComponent.province; var cityname = (data.result.addressComponent.city); var district = data.result.addressComponent.district; var street = data.result.addressComponent.street; var street_number = data.result.addressComponent.street_number; var address = data.result.formatted_address; $('[name="address"]').val(province + cityname); } }); }, fail: function (res) { //alert("获取位置失败"); } }); });
栏目分类全部>
推荐文章
- Laravel8入门教程(一):Laravel8的安装与环境搭建
- linux 一键清除文件内容命令
- 重置WSL ubuntu 20 root 密码
- SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length
- Linux系统是否被植入木马的排查流程
- Linux小技巧之:两种方法统计访问web网站的前10个IP
- 手把手教你在linux下搭建mysql多主多从
- Win10优化:系统文件Hiberfil.sys介绍
- JavaScript之干货(一)---走进JS世界
- ngnix项目配置网站不加www可以访问