php 两地经纬度获取距离
composer require jeroendesloovere/distance
<?php namespace LonLatFilterShop; use JeroenDesloovere\Distance\Distance; use think\Exception; class LonLatFilterShop { /** * @param []起点位置经纬度 * @param []终点位置经纬度 * @return float * @throws Exception */ public static function KM($position1=[],$position2=[]){ if(!isset($position1[0]) || ($position1[0]==='')){ throw new Exception("起点位置的经度不能为空"); } if(!isset($position1[1]) || ($position1[1]==='')){ throw new Exception("起点位置的经度不能为空"); } if(!isset($position2[0]) || ($position2[0]==='')){ throw new Exception("起点位置的经度不能为空"); } if(!isset($position2[1]) || ($position2[1]==='')){ throw new Exception("终点位置的经度不能为空"); } $latitude1 = $position1[1]; #纬度 $longitude1 = $position1[0]; #经度 $latitude2 = $position2[1]; #纬度 $longitude2 = $position2[0];#经度 $distance = Distance::between( $latitude1, $longitude1, $latitude2, $longitude2 ); return $distance; } /** * @param []当前位置经纬度 * @param $data 要过滤的数组 [['lon'=>经度,'lat'=>纬度]] * @param $filterDistance 大于多少公里不展示 * @return 返回 $data */ public static function filterShop($position=[],$data,$filterDistance=0){ if(!isset($position[0]) || ($position[0]==='')){ throw new Exception("起点位置的经度不能为空"); } if(!isset($position[1]) || ($position[1]==='')){ throw new Exception("起点位置的经度不能为空"); } if(!$data){ return []; } $filterShop = []; foreach ($data as $k =>$v){ // [['lon'=>经度,'lat'=>纬度]] if(!isset($v['lon']) || ($v['lon']==='')){ continue; } if(!isset($v['lat']) || ($v['lat']==='')){ continue; } /** * 距离位置 */ $kg = self::KM($position,[$v['lon'],$v['lat']]); if($filterDistance && ($kg>$filterDistance)){ continue; } $v['distance']=$kg; $filterShop[] = $v; } if(!$filterShop){ return []; } $edit = array_column($filterShop,'distance'); array_multisort($edit,SORT_ASC,$filterShop); return $filterShop; } }