php 离我最近,站点离我最近排序 (PHP)

思路:

1、获取我的位置,即:我的经纬度

2、各站点须有位置 即:排序对象有位置经纬度

3、查询要排序的站点列表

4、循环遍历计算 与我的距离

5、二维数组按 指定列(距离)排序

具体如下:

1、是小程序中的功能,因而小程序接口获取我的经纬度

wx.getLocation({

type: 'wgs84',

success(res) {

let latitude = res.latitude;//纬度

let longitude = res.longitude;//经度

//排序请求时 携带以上参数

}

})

2、项目中新增站点的时候须有位置地图功能,保存每条站点数据包含该站点的 经纬度数据

3、查询站点列表 略 假设查询站点数据如下:

$list = [

['id'=>1,'name'=>'站点1','latitude'=>34.45678,'longitude'=>116.43055],

['id'=>2,'name'=>'站点2','latitude'=>34.35678,'longitude'=>116.43055],

['id'=>3,'name'=>'站点3','latitude'=>34.55678,'longitude'=>116.43055]

]

4、循环遍历计算距离

$latitude = $_POST['my_latitude']; //我的纬度

$latitude = $_POST['my_latitude']; //我的经度

foreach ($list as $k=>$v){

$list[$k]['distance'] = get_distance($my_latitude,$my_longitude,$v['latitude'],$v['longitude']);

}

//经纬度 两点间的距离

function get_distance($lat1, $lon1, $lat2, $lon2) {

$R = 6371393; //地球平均半径,单位米

$dlat = deg2rad($lat2-$lat1);//角度转化为弧度

$dlon = deg2rad($lon2-$lon1);

$a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2);

$c = 2 * atan2(sqrt($a), sqrt(1-$a));

$d = $R * $c;

return round($d);

}

5、按距离排序

$list = arr_sort($list,'distance');

//二维数组 按二维指定列排序

//$arr 要排序的二维数组

//$key 排序依据的列

//$order 升序|降序 默认升序

function arr_sort($arr,$key,$order=SORT_ASC){

$key_arr = array_column($arr,$key);

if(empty($key_arr)){

return false;

}

array_multisort($key_arr,$order,$arr);

return $arr;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值