概述

本服务提供中国标准行政区划数据查询功能,支持:
1 . 全国省、市、区/县、乡镇/街道 四级行政区划数据;
2 . 支持三级区划(省/市 - 区/县)轮廓数据;
3 . 支持区划查询、省市区列表、查询子级区划等功能。

开发轮子(一):全国省/市/区/街道三、四级联动_ci

数据来源

腾讯位置服务:WebService API | 腾讯位置服务

接口服务

接口1:获取省市区列表

本接口用于获取全部省市区三级行政区划列表。
注:获取四级乡镇/街道数据,需要通过获取子级区划接口,传入指定三级区划,获取相应四级数据。

请求地址:

https://apis.map.qq.com/ws/district/v1/list

接口2:获取下级行政区划

获取指定行政区划的子级行政区划
本接口支持获取 指定区县(三级)其下乡镇/街道(四级)列表

请求地址:

https://apis.map.qq.com/ws/district/v1/getchildren // get请求

开发准备

申请开发者秘钥:开发密钥(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