在项目过程中经常会需要一套完整的通用的城市编码表用于地址选择、定位查询、区域管理等等相关的区域字典数据
本文基于最新高德发布的城市编码映射文件做的地址区域字典数据处理
数据来源:https://lbs.amap.com/api/webservice/download 该数据更新于2019年5月27日
- DB设计
CREATE TABLE `sxpay_district` (
`id` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
`province` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '省份名称',
`province_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '省份编码',
`province_ad_code` varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '省份区域编码',
`city` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '城市名称',
`city_code` varchar(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '城市编码',
`city_ad_code` varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '城市区域编码',
`district` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '区县名称',
`district_ad_code` varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '区县区域编码',
`district_level` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '行政区划级别 (country:国家,province:省份,city:市,district:区县)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='全国区域表';
- 代码
@Service
public class SxpayDistrictService implements AbstractService<SxpayDistrict, String> {
@Autowired
private SxpayDistrictMapper sxpayDistrictMapper;
@Override
public SxpayDistrictMapper getMapper() {
return sxpayDistrictMapper;
}
/**
* 导入高德城市编码表
* @param contentMap
*/
public void exportDistrict(Map<Integer, Map<Integer, Object>> contentMap) {
for (Map.Entry<Integer, Map<Integer, Object>> entry : contentMap.entrySet()) {
Map<Integer, Object> contentRow = entry.getValue();
String name = contentRow.get(0).toString().trim();
String adcode = contentRow.get(1).toString().trim();
String citycode = null;
if (null != contentRow.get(2)) {
citycode = contentRow.get(2).toString().trim();
}
SxpayDistrict sxpayDistrict = new SxpayDistrict();
String level = "province";
//1,citycode为空,是省份+国家
if (StringUtils.isBlank(citycode)) {
if ("中华人民共和国".equals(name)) {
name = "全国";
level = "country";
}
this.packageProvince(sxpayDistrict, name, adcode, citycode, level);
if (StringUtils.isNotBlank(sxpayDistrict.getId())) {
getMapper().add(sxpayDistrict);
}
} else {
//2,citycode不为空,分为直辖市和区县两种情况
//2.1,直辖市做省份处理,判断citycode是否在省份出现过
this.proccessProvince(sxpayDistrict, name, adcode, citycode);
//2.2,城市处理,判断citycode是否在城市出现过
SxpayDistrict condition = new SxpayDistrict();
condition.setCityCode(citycode);
List<SxpayDistrict> sxpayDistricts = getMapper().find(condition);
if (ListUtils.isEmpty(sxpayDistricts)) {
getMapper().add(this.packageCity(name, adcode, citycode));
} else {
//2.3,区县处理
getMapper().add(this.packageDistrict(name, adcode, citycode));
}
}
}
}
/**
* 处理数据
* @param sxpayDistrict
* @param name
* @param adcode
* @param citycode
*/
private void proccessProvince(SxpayDistrict sxpayDistrict, String name, String adcode, String citycode) {
switch (citycode) {
case "010":
case "021":
case "022":
case "023":
case "1852":
case "1853":
case "1886":
SxpayDistrict condition = new SxpayDistrict();
condition.setProvinceCode(citycode);
List<SxpayDistrict> sxpayDistricts = getMapper().find(condition);
if (ListUtils.isEmpty(sxpayDistricts)) {
this.packageProvince(sxpayDistrict, name, adcode, citycode, "province");
getMapper().add(sxpayDistrict);
}
break;
default:
break;
}
}
/**
* 处理省份
* @param sxpayDistrict
* @param name
* @param adcode
* @param citycode
* @param level
*/
private void packageProvince(SxpayDistrict sxpayDistrict, String name, String adcode, String citycode, String level) {
sxpayDistrict.setId(IdUtils.get32UUID());
sxpayDistrict.setProvince(name);
sxpayDistrict.setProvinceCode(citycode);
sxpayDistrict.setProvinceAdCode(adcode);
sxpayDistrict.setDistrictLevel(level);
}
/**
* 处理城市
* @param name
* @param adcode
* @param citycode
* @return
*/
private SxpayDistrict packageCity(String name, String adcode, String citycode) {
String provinceAdCode = adcode.substring(0, 2) + "0000";
SxpayDistrict condition = new SxpayDistrict();
condition.setProvinceAdCode(provinceAdCode);
List<SxpayDistrict> sxpayDistricts = getMapper().find(condition);
if (ListUtils.isEmpty(sxpayDistricts)) {
return new SxpayDistrict();
}
SxpayDistrict sxpayDistrict = sxpayDistricts.get(0);
sxpayDistrict.setId(IdUtils.get32UUID());
sxpayDistrict.setCity(name);
sxpayDistrict.setCityCode(citycode);
sxpayDistrict.setCityAdCode(adcode);
sxpayDistrict.setDistrictLevel("city");
sxpayDistrict.setDistrict(null);
sxpayDistrict.setDistrictAdCode(null);
return sxpayDistrict;
}
/**
* 处理区县
* @param name
* @param adcode
* @param citycode
* @return
*/
private SxpayDistrict packageDistrict(String name, String adcode, String citycode) {
SxpayDistrict condition = new SxpayDistrict();
condition.setCityCode(citycode);
List<SxpayDistrict> sxpayDistricts = getMapper().find(condition);
if (ListUtils.isEmpty(sxpayDistricts)) {
return new SxpayDistrict();
}
SxpayDistrict sxpayDistrict = sxpayDistricts.get(0);
sxpayDistrict.setId(IdUtils.get32UUID());
sxpayDistrict.setDistrict(name);
sxpayDistrict.setDistrictAdCode(adcode);
sxpayDistrict.setDistrictLevel("district");
return sxpayDistrict;
}
public List<SxpayDistrict> findProvince(SxpayDistrictCondition sxpayDistrictCondition) {
return getMapper().findProvince(sxpayDistrictCondition);
}
public List<SxpayDistrict> findCity(SxpayDistrictCondition sxpayDistrictCondition) {
return getMapper().findCity(sxpayDistrictCondition);
}
}