您的当前位置:首页>全部文章>文章详情

PHP依据用户当前定位的经纬度判断距离最近的门店

发表于:2021-09-11 08:03:58浏览:1157次TAG: #PHP #ThinkPHP #定位 #经纬度

最近有个系统有个功能是根据用户当前定位的经纬度判断距离最近的门店,大致位置就行,算的直线距离。

通过百度地图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("获取位置失败");
        }
    });
 });