调用高德的【行政区划查询】接口,组装省市区SQL

高德API

没有高德开发平台的账号,自己去注册一个。高德开放平台地址

创建一个应用,web服务,主要用到【行政区域查询API】,找到你的key
**在这里插入图片描述**
在这里插入图片描述
复制上面的key,等会调用的时候要用

添加依赖

这两个都是工具包,一个转换为拼音,一个通用的,还有一个简化get/set

  		<dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>
         <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.7</version>
        </dependency>
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

工具类

package com.lee.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.commons.lang3.StringUtils;

/**
 * @author lwh
 * @date 2022/1/27
 * @description
 **/
public class PinYinUtil {

    public static void main(String[] args) {
        String str = "吉林省";
        // 北京市,天津市,重庆市,上海市
        if (str.contains("省") || str.contains("市")) {
            // 省和市忽略,保留前面的
            String province = str.substring(0, str.length() - 1);
            String bj = getUpperStr(province);
            System.out.println(bj);
        }
        // 宁夏回族自治区,新疆维吾尔自治区,西藏自治区,广西壮族自治区,内蒙古自治区
        if (str.contains("区")) {
            // 区保留前2位
            String province = str.substring(0, 2);
            String bj = getUpperStr(province);
            System.out.println(bj);
        }

    }

    public static String getUpperStr(String name) {
        if (StringUtils.isNotBlank(name)) {
            StringBuilder str = new StringBuilder();
            for (int i = 0; i < name.length(); i++) {
                String characters = String.valueOf(name.charAt(i));
                str.append(converterToFirstSpell(characters).toUpperCase().charAt(0));
            }
            return str.toString();
        }
        return "";
    }

    private static String converterToFirstSpell(String str) {
        StringBuilder pinyinName = new StringBuilder();
        char[] nameChar = str.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (char characters : nameChar) {
            String string = String.valueOf(characters);
            if (string.matches("[\\u4e00-\\u9fa5]")) {
                try {
                    String[] mPinyinArray = PinyinHelper.toHanyuPinyinStringArray(characters, defaultFormat);
                    pinyinName.append(mPinyinArray[0]);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName.append(characters);
            }
        }
        return pinyinName.toString();
    }

}

数据库表映射类

package com.lee.gaode;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @author lwh
 * @date 2022/1/27
 * @description
 **/
@Data
public class GaodeArea {

    private Long id;

    /**
     * 名称
     */
    private String name;
    /**
     * 父类
     */
    private Long parentId;
    /**
     * 全名称 , 号分隔;中华人民共和国,北京市,北京城区,石景山区,
     */
    private String fullName;
    /**
     * 全id  , 号分隔;100000,110000,110100,110107,
     */
    private String treePath;
    /**
     * 树形结构等级
     */
    private Integer treeLevel;
    /**
     * 地区等级
     */
    private String level;
    /**
     * 中心点经度
     */
    private BigDecimal centerLng;
    /**
     * 中心点纬度
     */
    private BigDecimal centerLat;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 省份前缀,例如北京市:BJ;黑龙江省:HLJ
     */
    private String initials;

}

高德转换类

package com.lee.gaode;

import lombok.Data;

import java.util.List;

/**
 * @author: lwh
 * @date: 2021/9/15
 **/
@Data
public class Geocoding {

    private String adcode;
    private String name;
    private String center;
    private String level;
    private List<String> citycode;
    private List<DistrictsBeanX> districts;

    @Data
    public static class DistrictsBeanX {
        private String citycode;
        private String adcode;
        private String name;
        private String center;
        private String level;
        private List<DistrictsBeanX> districts;

    }

}

生成类

restapi.amap.com/v3/config/district?key=您的key&keywords=100000&subdistrict=3&extensions=base
代码中的路径的高德key别忘了换成你自己的

package com.lee.gaode;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.lee.utils.FileUtils;
import com.lee.utils.PinYinUtil;
import com.rnkrsoft.bopomofo4j.Bopomofo4j;
import com.rnkrsoft.bopomofo4j.ToneType;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.CharSet;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author lwh
 * @date 2022/1/27
 * @description 生成最新的高德数据SQL
 **/
@Slf4j
public class GaodeTest {
    public static void main(String[] args) {

        // 1、读取静态JSON文件,转换为数据
        // JSON json = JSONUtil.readJSON(new File("datas/GaoDeGeCoding.json"), CharsetUtil.CHARSET_UTF_8);
        // Geocoding geocoding = json.toBean(Geocoding.class);
        // 获取第一级
        // List<Geocoding.DistrictsBeanX> districts = geocoding.getDistricts();
        // analysis(districts);

        // 2、实时去查高德【行政区域查询接口】,转换为数据
        String jsonStr = HttpUtil.get("restapi.amap.com/v3/config/district?key=您的key&keywords=100000&subdistrict=3&extensions=base");
        Geocoding geocoding = JSONUtil.toBean(jsonStr, Geocoding.class);
        analysis(geocoding.getDistricts());
    }

    /**
     * @author lwh
     * @date 2022/1/27
     * @description 解析到省、市、区/县,同时生成SQL
     **/
    private static void analysis(List<Geocoding.DistrictsBeanX> districts) {
        List<GaodeArea> list = Lists.newArrayList();
        for (Geocoding.DistrictsBeanX country : districts) {

            // 国家
            GaodeArea countryGaodeArea = getGaodeArea(country, null, country.getName() + ",", country.getAdcode() + ",", null);
            list.add(countryGaodeArea);
            // 省份
            for (Geocoding.DistrictsBeanX province : country.getDistricts()) {
                String provinceFullName = country.getName().concat(",").concat(province.getName()).concat(",");
                String provinceTreePath = country.getAdcode().concat(",").concat(province.getAdcode()).concat(",");
                GaodeArea provinceGaodeArea = getGaodeArea(province, countryGaodeArea.getId(), provinceFullName, provinceTreePath, province.getName());
                list.add(provinceGaodeArea);

                // 城市
                for (Geocoding.DistrictsBeanX city : province.getDistricts()) {
                    String cityFullName =  country.getName().concat(",").concat(province.getName()).concat(",").concat(city.getName()).concat(",");
                    String cityTreePath =  country.getAdcode().concat(",").concat(province.getAdcode()).concat(",").concat(city.getAdcode()).concat(",");
                    GaodeArea cityGaodeArea = getGaodeArea(city, provinceGaodeArea.getId(), cityFullName, cityTreePath, null);
                    list.add(cityGaodeArea);

                    // 区县
                    for (Geocoding.DistrictsBeanX district : city.getDistricts()) {
                        String districtFullName =  country.getName().concat(",").concat(province.getName()).concat(",").concat(city.getName()).concat(",").concat(district.getName()).concat(",");
                        String districtTreePath =  country.getAdcode().concat(",").concat(province.getAdcode()).concat(",").concat(city.getAdcode()).concat(",").concat(district.getAdcode()).concat(",");
                        GaodeArea districtGaodeArea = getGaodeArea(district, cityGaodeArea.getId(), districtFullName, districtTreePath,null);
                        list.add(districtGaodeArea);

                        // 街道
                        for (Geocoding.DistrictsBeanX districtDistrict : district.getDistricts()) {
                            String districtDistrictFullName =  country.getName().concat(",").concat(province.getName()).concat(",").concat(city.getName()).concat(",").concat(district.getName()).concat(",").concat(districtDistrict.getName()).concat(",");
                            String districtDistrictTreePath =  country.getAdcode().concat(",").concat(province.getAdcode()).concat(",").concat(city.getAdcode()).concat(",").concat(district.getAdcode()).concat(",").concat(districtDistrict.getAdcode()).concat(",");
                            GaodeArea districtDistrictGaodeArea = getGaodeArea(districtDistrict, districtGaodeArea.getId(), districtDistrictFullName, districtDistrictTreePath, null);
                            list.add(districtDistrictGaodeArea);
                        }
                    }
                }
            }
        }
        // 按照code进行排序
        List<GaodeArea> sortList = list.stream().sorted(Comparator.comparing(GaodeArea::getId)).collect(Collectors.toList());
        // code有重复的,济源市下面的镇,code都和济源市一样,按照以前表的处理,只保留济源市,也就是第一个,其他的还有仙桃市等
        Map<Long, List<GaodeArea>> collect = sortList.stream().collect(Collectors.groupingBy(GaodeArea::getId));

        // 组装SQL
        List<String> sqlList = collect.entrySet().stream().map(areaId -> {
            GaodeArea area = areaId.getValue().get(0);
            String sql = "INSERT INTO `db_puxian_account`.`t_gaode_area`(`id`, `name`, `parent_id`, `full_name`, `tree_path`, `tree_level`, `level`, `center_lng`, `center_lat`, `create_time`, `initials`) VALUES (";
            StringBuilder sb = new StringBuilder(sql);
            sb.append(area.getId()).append(",")
                    .append("'").append(area.getName()).append("'").append(",")
                    .append(area.getParentId()).append(",")
                    .append("'").append(area.getFullName()).append("'").append(",")
                    .append("'").append(area.getTreePath()).append("'").append(",")
                    .append(area.getTreeLevel()).append(",")
                    .append("'").append(area.getLevel()).append("'").append(",")
                    .append(area.getCenterLng()).append(",")
                    .append(area.getCenterLat()).append(",")
                    .append("'").append(DateTime.of(area.getCreateTime()).toString()).append("'").append(",");

            if (StringUtils.isNotBlank(area.getInitials())) {
                sb.append("'").append(area.getInitials()).append("'").append(" );");
            } else {
                sb.append(area.getInitials()).append(" );");
            }
            return sb.toString();
        }).collect(Collectors.toList());

        sqlList.forEach(log::info);
        File file = new File("D:\\gao_de_area.txt");
        FileUtil.writeLines(sqlList, file, Charset.defaultCharset());
    }

    /**
     * @author lwh
     * @date 2022/1/27
     * @description 组装对象
     **/
    private static GaodeArea getGaodeArea(Geocoding.DistrictsBeanX k,Long parentId,String fullName,String treePath,String provinceName) {
        GaodeArea gaodeArea = new GaodeArea();
        gaodeArea.setName(k.getName());
        gaodeArea.setId(Long.valueOf(k.getAdcode()));
        gaodeArea.setCreateTime(new Date());
        gaodeArea.setFullName(fullName);
        gaodeArea.setTreePath(treePath);
        gaodeArea.setParentId(parentId);
        int treeLevel = 0;
        if (k.getLevel().equals("country")) {
            treeLevel = 1;
        } else if (k.getLevel().equals("province")) {
            treeLevel = 2;
        } else if (k.getLevel().equals("city")) {
            treeLevel = 3;
        } else if (k.getLevel().equals("district")) {
            treeLevel = 4;
        } else if (k.getLevel().equals("street")) {
            treeLevel = 4;
        }
        // 级别
        gaodeArea.setTreeLevel(treeLevel);
        gaodeArea.setLevel(k.getLevel());
        String[] centerArray = k.getCenter().split(",");
        // 中心点经度
        gaodeArea.setCenterLng(new BigDecimal(centerArray[1]));
        // 中心点纬度
        gaodeArea.setCenterLat(new BigDecimal(centerArray[0]));
        // 省份前缀
        if (StringUtils.isNotBlank(provinceName)) {
            // 北京市,天津市,重庆市,上海市
            if (provinceName.contains("省") || provinceName.contains("市")) {
                // 省和市忽略,保留前面的
                String province = provinceName.substring(0, provinceName.length() - 1);
                String bj = PinYinUtil.getUpperStr(province);
                gaodeArea.setInitials(bj);
            }
            // 宁夏回族自治区,新疆维吾尔自治区,西藏自治区,广西壮族自治区,内蒙古自治区
            if (provinceName.contains("区")) {
                // 区保留前2位
                String province = provinceName.substring(0, 2);
                String bj = PinYinUtil.getUpperStr(province);
                gaodeArea.setInitials(bj);
            }
        }
        // log.info(">>>>>>>>>>>>>>>:{}", JSONUtil.toJsonStr(gaodeArea));
        return gaodeArea;
    }

}

最后去这个路径下,找到这个文件【D:\gao_de_area.txt】,SQL已经生成了,直接插入到表里面就行,每家业务的省市区表可能不一样,自己改改就行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术武器库

一句真诚的谢谢,胜过千言万语

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值