前言
這里有一個開源庫: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)