站点离我最近排序 (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;
}

你可能感兴趣的:(站点离我最近排序 (PHP))