美文网首页PHPPHP经验分享
高德API生成全国省市区数据

高德API生成全国省市区数据

作者: 江河湖海琴瑟琵琶 | 来源:发表于2019-08-02 10:58 被阅读0次

高德APi如下,详细参数去官网查看说明.

高德API.png

以搜索河北省为例,接口返回的数据结构如下:


高德API返回结果.png

观察数据发现:
省市区三个等级中,任何级别的地名都有唯一的adcode.
"省"没有citycode,"市"有自己的citycode,"区"继承了所属市的citycode.

问题是"省"和"市"没有关联啊,假如要查询"河北省"下的所有市,就会很麻烦.

因为所有的adcode都是唯一的,所以我们在设计表的时候加入一个字段 PID,用来指向上级的adcode.

"省"级别的PID永远是0
"市"级别的PID=所属省的adcode
"区"级别的PID=所属市的adcode

这样各级之间就有了关联.
此时需要查询"河北省"下的所有市,就可以这样写:

//查询河北省下的所有市
select * from area where PID = '河北省的adcode';
//查询石家庄市下的所有区/县
select * from area where PID = '石家庄市的adcode';

1.建表area,确定表的字段如下:


mysql字段.png

2.写个函数make_table(string $province)

    public function make_table($province){
        set_time_limit (0); //取消页面30s超时限制

        $key = 'xxxxxxxxxxxxxxxxxxxxxx';    //高德key,自己去申请
        $url = 'https://restapi.amap.com/v3/config/district?key='.$key.'&subdistrict=3&keywords='.$province; //拼接url


        $curl = curl_init();//初始化
        //设置
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_multi_getcontent (  $curl );
        // 关闭SSL验证
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

        $result = curl_exec($curl); //执行
        //请求出错,输出请求状态码
        if(curl_getinfo($curl,CURLINFO_HTTP_CODE) == 0){
            echo curl_error($curl);die;
        }

        $result = json_decode($result,true);//解析成关联数组

        curl_close($curl);  //关闭URL请求


        $data = $result['districts'][0];//数据

        $tmp = array();
        $tmp['name']        =   $data['name'];   //名称
        $tmp['adcode']      =   $data['adcode']; //唯一编码
        $tmp['pid']         =   0;               //父ID,这里是省,所以为0
        $tmp['citycode']    =   0;               //城市ID,省为0
        $tmp['level']       =   $data['level'];  //级别

        //河北省 写入数据库
        db('area')->insert($tmp);


        //遍历省下面的市
        foreach ($data['districts'] as $k => $v){

            $tmp['name']        =   $v['name'];         //名称
            $tmp['adcode']      =   $v['adcode'];       //唯一编码
            $tmp['pid']         =   $data['adcode'];    //父ID,这里是市,应该为省的adcode
            $tmp['citycode']    =   $v['citycode'];     //城市ID
            $tmp['level']       =   $v['level'];        //地域等级

            //写入 市
            db('area')->insert($tmp);

            //遍历市下面的区/县
            foreach ($v['districts'] as $m => $n){

                $tmp['name']        =   $n['name'];     //名称
                $tmp['adcode']      =   $n['adcode'];   //唯一编码
                $tmp['pid']         =   $v['adcode'];   //父ID,这里是区,应该为市的adcode
                $tmp['citycode']    =   $n['citycode']; //城市ID
                $tmp['level']       =   $n['level'];    //地域等级

                //写入 区/县
                db('area')->insert($tmp);

            }
        }
    }

调用make_table函数就行了

make_table('河北省');

执行完成后生成的表如下(没显示完):

河北省地区.png

有人问生成全国的数据怎么办,最简单的方法就是循环调用make_table函数:

        //自己去百度"中国有多少个省"
        $str = '北京市,天津市,上海市,重庆市,河北省,山西省,辽宁省,吉林省';
        $provinces = explode(',',$str);
        foreach ($provinces as $value){
            make_table($value);
        }

我最后生成的总数据是3726条,验证一下

//查所有的省
select * from area where pid = 0;
全国数据.png

总有有34个省对吧.
第一次写,有不对的地方联系我改正.

相关文章

网友评论

    本文标题:高德API生成全国省市区数据

    本文链接:https://www.haomeiwen.com/subject/xubkdctx.html