当前位置:首页 > CMS教程 > 其它CMS > 列表

PHP/Laravel如何通过经纬度计算距离获取附近商家

发布:smiling 来源: PHP粉丝网  添加日期:2024-03-07 15:19:27 浏览: 评论:0 

实际开发中,常常需要获取用户附近的商家,思路是

获取用户位置(经纬度信息)

在数据库中查询在距离范围内的商家

注: 本文章内计算距离所使用地球半径统一为 6378.138 km

  1. public function mpa_list($latitude,$longitude,$distance
  2.     { 
  3.         // $latitude = 34.306465; 
  4.         // $longitude = 109.050952; 
  5.         // $distance = 5; 
  6.         //1.计算最大最小经纬度范围 
  7.         $range  = 180 / pi() * $distance / 6378.138; //搜索 N km 之内 
  8.         $lngR   = $range / cos($latitude * pi() / 180); 
  9.         $maxLat = $latitude + $range//最大纬度 
  10.         $minLat = $latitude - $range//最小纬度 
  11.         $maxLng = $longitude + $lngR//最大经度 
  12.         $minLng = $longitude - $lngR//最小经度 
  13.         //2.查找经纬度符合条件的商家 
  14.         $list = Village::select("id","title","longitude","latitude"
  15.                 ->whereBetween('latitude', [$minLat$maxLat]) 
  16.                 ->whereBetween('longitude', [$minLng$maxLng]) 
  17.                 ->where('status', 1) 
  18.                 ->get(); 
  19.         //3.计算距离 
  20.         foreach ($list as &$item){ 
  21.             $item['distance'] = $this->getDistanceBy2Point([$longitude$latitude], [$item['longitude'], $item['latitude']]); 
  22.         } 
  23.         if($list){ 
  24.             $list = $list->toArray(); 
  25.         } 
  26.         //4.排序 
  27.         $list = $this->arraySort($list'distance'); 
  28.         return $list
  29.     } 

二维数组排序方法

  1. // 二维数组排序方法 
  2.     public static function arraySort($arr$field$sort = SORT_ASC){ 
  3.         $key = array_column($arr$field); 
  4.         array_multisort($key$sort$arr); 
  5.         return $arr
  6.     } 

根据经纬度计算两点距离

  1. /** 
  2.  * 根据起点坐标和终点坐标测距离 
  3.  * @param  [array]   $from     [起点坐标(经纬度),例如:array(118.012951,36.810024)] 
  4.  * @param  [array]   $to     [终点坐标(经纬度)] 
  5.  * @param  [bool]    $km        是否以公里为单位 false:米 true:公里(千米) 
  6.  * @param  [int]     $decimal   精度 保留小数位数 
  7.  * @return [string]  距离数值 
  8.  */ 
  9. public static function getDistanceBy2Point($from$to$km = true, $decimal = 2){ 
  10.     sort($from); 
  11.     sort($to); 
  12.     $EARTH_RADIUS = 6378.138; // 地球半径系数 
  13.     $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000; 
  14.     if($km && $distance > 1000){ 
  15.         return round($distance / 1000, 2) . 'km'
  16.     } 
  17.     return round($distance$decimal) . 'm'

实际测试:我这边的测试数据比较少,我就用了50公里范围之内的。因为我的数据库里面只添加了连个测试商家,大家将就看一下,理解了就行了。

PHP/Laravel如何通过经纬度计算距离获取附近商家

Tags: PHP经纬度 Laravel计算距离获取附近商家

分享到: