基于高德标准城市编码维护数据库数据

在项目过程中经常会需要一套完整的通用的城市编码表用于地址选择、定位查询、区域管理等等相关的区域字典数据
本文基于最新高德发布的城市编码映射文件做的地址区域字典数据处理

数据来源: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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值