行政区划省市县数据

  前言

  这里有一个开源库:https://gitee.com/gaohuazi/china_regions

 

 

  或者调用各大地图商的API

  腾讯地图:https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistrict

 

 

  或者自己去抓取官方发布的区划数据

  民政局:http://www.mca.gov.cn/article/sj/

 

  统计局:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/

 

 

  推荐直接使用开源库数据,省的自己折腾,如果需要满足自定义数据结构,可以把region.json(包含所有省市区/县数据)下载下来,自己解析存库

  

  解析json

  我们选择使用开源库里面的数据

  首先先把region.json下载下来,同时创建我们自己结构的表

CREATE TABLE `region`  (
  `code` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '行政区划代码',
  `p_code` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '上级行政区划代码',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省份/城市/[区]县城 名称',
  `sort` int(3) NULL DEFAULT NULL COMMENT '排序字段(如果不需要可以不用)',
  PRIMARY KEY (`code`, `p_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '行政区划省市县数据' ROW_FORMAT = Compact;

 

 

  解析json、存库

    public static void main(String[] args) {
        System.out.println("数据解析开始...");
        TimeInterval timer = DateUtil.timer();//计时器

        //读取、处理json
        StringBuilder stringBuilder = new StringBuilder();
        try {
            File regionJson = new File("D:\\region.json");
            BufferedReader reader = new BufferedReader(new FileReader(regionJson));
            Object[] lines = reader.lines().toArray();
            for (Object o : lines) {
                stringBuilder.append(o);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //JSONUtil工具类使用hutool
        JSONArray jsonArray = JSONUtil.parseArray(stringBuilder.toString());

        //获取实例,DbUtil工具类:https://www.cnblogs.com/huanzi-qch/p/15474928.html
        DbUtil dbUtil = new DbUtil("jdbc:mysql://localhost/jfinal_demo","root","123456");

        //清空表
        dbUtil.execute("truncate table region");

        //关闭自动提交事务,提高效率
        dbUtil.setAutoCommit(false);

        //插入数据
        for (int i = 0; i < jsonArray.size(); i++) {
            int sort = i+1;//排序字段

            Object element = jsonArray.get(i);
            JSONObject o = (JSONObject) element;
            String oCode = o.getStr("code");
            dbUtil.execute("insert into region values (?,?,?,?)", new Object[]{oCode,"-1",o.getStr("name"),sort});

            JSONArray a = (JSONArray) o.get("children");
            for (Object item : a) {
                sort++;
                JSONObject o1 = (JSONObject) item;
                String o1Code = o1.getStr("code");
                dbUtil.execute("insert into region values (?,?,?,?)", new Object[]{o1Code,oCode,o1.getStr("name"),sort});

                JSONArray a1 = (JSONArray) o1.get("children");
                for (Object value : a1) {
                    sort++;
                    JSONObject o2 = (JSONObject) value;
                    String o2Code = o2.getStr("code");
                    dbUtil.execute("insert into region values (?,?,?,?)", new Object[]{o2Code,o1Code,o2.getStr("name"),sort});

                }
            }
        }

        //手动管理事务
        dbUtil.commit();

        //关闭连接
        dbUtil.close();

        System.out.println("数据解析、保存完成!耗时:"+timer.interval()+"毫秒");
    }

 

 

   效果

  省

select
    name
    ,min(sort)
from
    region
where
    p_code = '-1' --
    -- p_code = '110000' -- 市
    -- p_code = '110100' -- 区/县
group by
    name
order by
    min(sort)

 

 

  市

select
    name
    ,min(sort)
from
    region
where
    -- p_code = '-1' -- 省
    p_code = '110000' --
    -- p_code = '110100' -- 区/县
group by
    name
order by
    min(sort)

 

 

  区/县

select
    name
    ,min(sort)
from
    region
where
    -- p_code = '-1' -- 省
    -- p_code = '110000' -- 市
    p_code = '110100' -- 区/县
group by
    name
order by
    min(sort)

 

posted @ 2021-11-04 17:13  huanzi-qch  阅读(693)  评论(0编辑  收藏  举报