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

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

观察数据发现:
省市区三个等级中,任何级别的地名都有唯一的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,确定表的字段如下:

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('河北省');
执行完成后生成的表如下(没显示完):

有人问生成全国的数据怎么办,最简单的方法就是循环调用make_table函数:
//自己去百度"中国有多少个省"
$str = '北京市,天津市,上海市,重庆市,河北省,山西省,辽宁省,吉林省';
$provinces = explode(',',$str);
foreach ($provinces as $value){
make_table($value);
}
我最后生成的总数据是3726条,验证一下
//查所有的省
select * from area where pid = 0;

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