2020年最新省、市、区县、街道乡镇四级数据
完整的sql已经上传到github,可免费获取 https://github.com/MingA21/District-SQL
完整的sql文件已经上传github,https://github.com/MingA21/District-SQL
授人以鱼不如授人以渔
下面教给大家一种获取省市区等地域数据的方式,正所谓授人以鱼不如授人以渔
以下以Java代码为例,我们可以借助高德地图的行政区域查询接口解析获取得到我们想要的数据
链接如下: https://lbs.amap.com/api/webservice/guide/api/district
经过测试发现该接口并不提供直接获取完整的省市区街道(4级),只能查询省市区或者市、区县、街道,等三级,我们可以先查询出省份,然后通过省查询地市区县街道
直接看案例代码
public Msg get() throws IOException {
// 定义变量用于统计省市区街道的数量
int pCount = 0;
int cCount = 0;
int coCount = 0;
int vCount = 0;
// 定义id
int a = 1;
// 首先查询中华人民共和国下的所有省份 (其中key word是中国,由于是get请求需要编码)
String url = "http://restapi.amap.com/v3/config/district?key=" + key
+ "&keywords=%E4%B8%AD%E5%9B%BD&subdistrict=1&extensions=base";
//1、创建httpClient
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = client.execute(httpGet);
//2、获取实体
HttpEntity entity1 = response.getEntity();
// 3.将实体装成字符串
String string = EntityUtils.toString(entity1);
// 通过objectMapper解析
ObjectMapper objectMapper = new ObjectMapper();
Map map = objectMapper.readValue(string, Map.class);
List<District> districtList = new ArrayList<>();
// 获取中华人民共和国
List<Map<String, Object>> fdistricts = (List<Map<String, Object>>) map.get("districts");
// 获取所有的省集合,然后遍历获取市区街道
List<Map<String, Object>> provinceDistrictsList =
(List<Map<String, Object>>) fdistricts.get(0).get("districts");
for (Map<String, Object> provinceDistrictMap : provinceDistrictsList) {
// 统计省数量+1
pCount++;
// 定义了一个District实体,
// 字段包括,id(主键),pid(父Id),code(code编码),name(名称) status(数据状态),level(等级)
// center(坐标中心) cityCode(城市编码) List<District> sonDistrict;
// 大家其实可以code做为上下关系,及生成一个pCode字段,code基本上在全国是统一的比我们自定义的id方便扩展
District provinceDistrict = new District();
provinceDistrict.setLevel(Byte.valueOf("0")).setPid(0).setId(a++)
.setName((String) provinceDistrictMap.get("name"))
.setCode((String) provinceDistrictMap.get("adcode"))
.setCenter((String) provinceDistrictMap.get("center"));
// 根据省份,获取地市区县、街道
String sUrl = "http://restapi.amap.com/v3/config/district?key=" + key + "&keywords="
+ provinceDistrict.getCode() + "&subdistrict=3&extensions=base";
httpGet = new HttpGet(sUrl);
CloseableHttpResponse closeableHttpResponse = client.execute(httpGet);
String string1 = EntityUtils.toString(closeableHttpResponse.getEntity());
// 获取省数据集合
Map map2 = objectMapper.readValue(string1, Map.class);
List<Map<String, Object>> cdistricts =
(List<Map<String, Object>>) map2.get("districts");
// 获取地市数据集合
List<Map<String, Object>> cityDistrictsList =
(List<Map<String, Object>>) cdistricts.get(0).get("districts");
List<District> citySonDistrictsList = new ArrayList<>();
// 遍历获取地市数据
for (Map<String, Object> cityDistrictMap : cityDistrictsList) {
cCount++; // 城市数量++
District cityDistrict = new District();
cityDistrict.setLevel(Byte.valueOf("1"))
.setPid(provinceDistrict.getId()).setId(a++)
.setName((String) cityDistrictMap.get("name"))
.setCityCode((String) cityDistrictMap.get("cityCode"))
.setCode((String) cityDistrictMap.get("adcode"))
.setCenter((String) cityDistrictMap.get("center"));
// 获取地市下的区县
List<Map<String, Object>> countyDistrictsList =
(List<Map<String, Object>>) cityDistrictMap.get("districts");
List<District> countySonDistrictsList = new ArrayList<>();
// 循环区县
for (Map<String, Object> countyDistrictMap : countyDistrictsList) {
coCount++; // 区县++
District countyDistrict = new District();
countyDistrict.setLevel(Byte.valueOf("2"))
.setPid(cityDistrict.getId()).setId(a++)
.setName((String) countyDistrictMap.get("name"))
.setCityCode((String) countyDistrictMap.get("cityCode"))
.setCode((String) countyDistrictMap.get("adcode"))
.setCenter((String) countyDistrictMap.get("center"));
countySonDistrictsList.add(countyDistrict);
// 构建乡镇
List<Map<String, Object>> villagesDistrictsList =
(List<Map<String, Object>>) countyDistrictMap.get("districts");
List<District> villagesSonDistrictsList = new ArrayList<>();
for (Map<String, Object> villagesDistrictMap : villagesDistrictsList) {
vCount++; // 乡镇++
District villagesDistrict = new District();
villagesDistrict.setLevel(Byte.valueOf("3"))
.setPid(countyDistrict.getId()).setId(a++)
.setName((String) villagesDistrictMap.get("name"))
.setCityCode((String) villagesDistrictMap.get("cityCode"))
.setCode((String) villagesDistrictMap.get("adcode"))
.setCenter((String) villagesDistrictMap.get("center"));
villagesSonDistrictsList.add(villagesDistrict);
}
// 添加 乡镇
countyDistrict.setSonDistrict(villagesSonDistrictsList);
}
// 地市添加区县
cityDistrict.setSonDistrict(countySonDistrictsList);
// 添加地市
citySonDistrictsList.add(cityDistrict);
}
provinceDistrict.setSonDistrict(citySonDistrictsList);
// list 添加省
districtList.add(provinceDistrict);
}
// 输出 省、地市、区县、乡镇街道的数量
System.out.println(pCount + "-" + cCount + "-" + coCount + "-" + vCount);
// 解析入库即可
// ------------
return Msg.success();
}
注意:
1. key值需要从高德地图申请
2. 父行政区域和子行政区域,可以使用code关联,代码中使用的是自定义的id,code通用性更好
3. 代码为测试案例代码,可能并不能直接使用
github成品sql文件: https://github.com/MingA21/District-SQL