概述
本服务提供中国标准行政区划数据查询功能,支持:
1 . 全国省、市、区/县、乡镇/街道 四级行政区划数据;
2 . 支持三级区划(省/市 - 区/县)轮廓数据;
3 . 支持区划查询、省市区列表、查询子级区划等功能。
数据来源
腾讯位置服务:WebService API | 腾讯位置服务
接口服务
接口1:获取省市区列表
本接口用于获取全部省市区三级行政区划列表。
注:获取四级乡镇/街道数据,需要通过获取子级区划接口,传入指定三级区划,获取相应四级数据。
请求地址:
接口2:获取下级行政区划
获取指定行政区划的子级行政区划
本接口支持获取 指定区县(三级)其下乡镇/街道(四级)列表
请求地址:
开发准备
申请开发者秘钥:开发密钥(Key)
调用示例
// GET请求,注意参数值要进行URL编码
// list接口:获取全部行政区划数据
https://apis.map.qq.com/ws/district/v1/list?key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
// getchildren接口:获取北京市的子级行政区划
https://apis.map.qq.com/ws/district/v1/getchildren?id=110000&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
核心代码
第一步:创建行政区划SQL表结构
CREATE TABLE `b2b2c_addresses` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '名称',
`full_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '中文全称',
`pinyin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '拼音',
`unicode_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '行政区划唯一标识(adcode)',
`pid` bigint DEFAULT NULL COMMENT '父级ID',
`level_no` int DEFAULT NULL COMMENT '级别',
`english_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '英文名',
`order_no` int DEFAULT NULL COMMENT '排序号',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_addresses_pid` (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='地址表';
第二步:创建行政区划实体对象
/**
* 行政区划信息表
* @TableName b2b2c_addresses
*/
@TableName(value ="b2b2c_addresses")
@Data
public class Addresses implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 父级ID
*/
private Long pid;
/**
* 名称
*/
private String name;
/**
* 名称
*/
private String fullName;
/**
* 级别
*/
private Integer levelNo;
/**
* 拼音
*/
private String pinyin;
/**
* 英文名
*/
private String englishName;
/**
* ASCII码
*/
private String unicodeCode;
/**
* 排序号
*/
private Integer orderNo;
/**
*
*/
private Date createdAt;
/**
*
*/
private Date updatedAt;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
第二步:获取省级行政区划
Addresses addresses= null;
HttpRequest request = HttpRequest.get("https://apis.map.qq.com/ws/district/v1/list/ws/district/v1/list?key=XXXXXX");
String level1 = request.body();
JSONObject jsonObject1 = JSONObject.parseObject(level1);
List<Object> mapList1 = (List<Object>) jsonObject1.get("result");
List<Map> list1 = (List<Map>) mapList1.get(0);
for(int i = 0;i < list1.size() ;i++){
addresses = new Addresses();
Map a = list1.get(i);
List<Object> pinyinList1 = (List<Object>) a.get("pinyin");
String pinyin1 = "";
for(Object o: pinyinList1){
pinyin1 += o;
}
addresses.setName(a.get("name").toString());
addresses.setFullName(a.get("fullname").toString());
addresses.setLevelNo(1);
addresses.setPid(0l);
addresses.setPinyin(pinyin1);
addresses.setOrderNo(i+1);
addresses.setUnicodeCode(a.get("id").toString());
addressesService.create(addresses);
}
将获取到的省级行政区划存放到数据库里面,然后再通过省级行政编码去查询市级数据。
第三步:获取市/县级行政区划
// TODO 从数据库中查询出省级数据,或者直接在上面进行循环获取
List<Addresses> addressesList = addressesService.selectListByLevel(1);
for(int i = 0;i < addressesList.size() ;i++){
addresses = new Addresses();
Addresses record = addressesList.get(i);
if(record.getFullName().contains("市")){
addresses.setName(record.getName());
addresses.setFullName(record.getFullName());
addresses.setUnicodeCode(record.getUnicodeCode());
addresses.setPinyin(record.getPinyin());
addresses.setLevelNo(2);
addresses.setPid(record.getId());
addresses.setOrderNo(i+1);
addressesService.create(addresses);
}else{
HttpRequest request = HttpRequest.get("https://apis.map.qq.com/ws/district/v1/getchildrend="+id+"&key="+lbsProperties.getKey());
String level2 = request.body();
JSONObject jsonObject2 = JSONObject.parseObject(level2);
List<Object> mapList2 = (List<Object>) jsonObject2.get("result");
List<Map> list2= (List<Map>) mapList2.get(0);
Addresses addresses2 = null;
for(int j = 0;j < list2.size() ;j++) {
addresses2 = new Addresses();
Map b = list2.get(j);
List<Object> pinyinList2 = (List<Object>) b.get("pinyin");
String pinyin2 = "";
for (Object o : pinyinList2) {
pinyin2 += o;
}
addresses2.setUnicodeCode(b.get("id").toString());
addresses2.setName(b.get("name").toString());
addresses2.setFullName(b.get("fullname").toString());
addresses2.setLevelNo(2);
addresses2.setPid(record.getId());
addresses2.setPinyin(pinyin2);
addresses2.setOrderNo(j + 1);
addressesService.create(addresses2);
}
}
}
备注:获取四级街道数据也是同样的思路。
总结
直辖市 的处理方法是 一级和二级的数据一样,通过以上代码可以看出,如果一级的名字带“市”就会吧数据重写一份放到二级里面。
如果小伙伴们不想这么麻烦获取这些数据也可以直接下载,这份省、市、区/县、街道 四级联动的数据。
链接: https://pan.baidu.com/s/1PbtDOp10kog_UOBkx3Okpg 提取码: kdgg