php实现按照每个城市距离的远近来排序

准备工作

1、含有城市名称和经纬度的数据表(lat为经度,lng为纬度):
在这里插入图片描述
2、百度地图api,用来获取每个城市的经纬度:
http://api.map.baidu.com/geocoder?address=%E9%9D%92%E5%B2%9B&output=json&key=rKNhRRsTd47pjY3VCbvCOHraF0FOft5O
在这里插入图片描述

代码实现

实现逻辑:以济南为起点,算出济南到每个城市之间的距离,并按照距离从近到远依次排序。

/**
        处理排序的逻辑
     **/
    public function cityorder(){
        //找一个排序的起点,为济南
        $jinan = db::name("ceshi")
            ->where("address","济南")
            ->find();
        //查询城市表里不是济南的所有城市
        $sql = db::name("ceshi")
            ->where("address",'neq',"济南")
            ->select();
        //以济南的距离为起点,依次算出从济南到每个城市的距离,并放入数组
        for($i = 0; $i< count($sql) ; $i++){
            $arr[$i]["space"] = $this->getdistance($jinan["lat"],$jinan["lng"],$sql[$i]["lat"],$sql[$i]["lng"]);
            $arr[$i]["name"] = $sql[$i]["address"];
        }
        //进行冒泡排序
        $a = $this->mpSort($arr,"space");
        print_r($a);die;
    }

    /**
        php二维数组冒泡排序
     **/
    function mpSort($arr,$key){
        for($i=0;$i<count($arr);$i++){
            for($j=$i;$j<count($arr);$j++){
                if($arr[$i][$key]>$arr[$j][$key]){
                    $temp=$arr[$i];
                    $arr[$i]=$arr[$j];
                    $arr[$j]=$temp;
                }
            }
        }
        return $arr;
    }

    /**
     * 求两个已知经纬度之间的距离,单位为米
     *
     * @param lng1 $ ,lng2 经度
     * @param lat1 $ ,lat2 纬度
     * @return float 距离,单位米
     * @author www.Alixixi.com
     */
    function getdistance($lng1, $lat1, $lng2, $lat2) {
        // 将角度转为狐度
        $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
        $radLat2 = deg2rad($lat2);
        $radLng1 = deg2rad($lng1);
        $radLng2 = deg2rad($lng2);
        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;
        $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
        return $s;
    }

postman打印出来后的效果(space是济南到某个城市之间的距离):

Array
(
    [0] => Array
        (
            [space] => 509381.83926484
            [name] => 郑州
        )

    [1] => Array
        (
            [space] => 534136.67762135
            [name] => 合肥
        )

    [2] => Array
        (
            [space] => 622342.83636755
            [name] => 南京
        )

    [3] => Array
        (
            [space] => 726371.61725314
            [name] => 上海
        )

    [4] => Array
        (
            [space] => 1264244.2118345
            [name] => 福建
        )

    [5] => Array
        (
            [space] => 1563068.6975839
            [name] => 广东
        )

    [6] => Array
        (
            [space] => 2096074.5595435
            [name] => 海南
        )

    [7] => Array
        (
            [space] => 2523006.4189404
            [name] => 拉萨
        )

)

从打印效果中来看,确实如此,济南在这些城市的最北边,依次为郑州、合肥、南京:

如果你感觉数据不对,可以使用百度地图等直接搜两个城市之间的距离来进行测试。

在这里插入图片描述
该逻辑放到项目中即可使用。

发布了328 篇原创文章 · 获赞 110 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/qq_42249896/article/details/100182167