最新省市数据获取

最新省市数据获取, 数据来源于 民政部网站

2024年中华人民共和国县以上行政区划代码


import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import StringUtils;
import AreaWy;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.io.IOUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.core.io.ClassPathResource;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;


public class AreaUtil {

    private static final List<String> codeRemove = Lists.newArrayList("810000","820000","710000");
    private static final List<String> codeNameRemove = Lists.newArrayList("省直辖县级行政单位","台湾省","香港特别行政区","澳门特别行政区");
    // 直辖市
    private static final String[] MUNICIPALITY_DIRECTLY_UNDER_THE_CENTRAL_GOVERNMENT = new String[]{"北京","天津","上海","重庆"};
    // 包含直辖县的省份
    private static final String[] PROVINCE_INCLUDING_DIRECTLY_ADMINISTERED_AREA = new String[]{"河南","海南", "湖北","新疆"};
   
    /**
     * 获取 中国大陆+港澳台 的所有省市数据
     * 
     * 可根据需要 再处理县城数据
     **/
    public static List<AreaWy.ProvinceAndCity> provinceInfo() {
        List<AreaWy.ProvinceAndCity> provinceAndCities = Lists.newArrayList();
        try {

            //2024年中华人民共和国县以上行政区划代码网页
            Document doc = Jsoup.connect("https://www.mca.gov.cn/mzsj/xzqh/2025/202401xzqh.html").maxBodySize(0).get() ;
            Elements elements = doc.getElementsByClass("xl7021822");
            Elements areaElements=doc.getElementsByClass("xl7121822");
            List<String> stringList = elements.eachText();
            List<String> areaStringList=areaElements.eachText();

            List<String> stringName = Lists.newArrayList();
            List<String> stringCode = Lists.newArrayList();
            List<String> StringAreaName=Lists.newArrayList();
            List<String> StringAreaCode=Lists.newArrayList();
            for (int i = 0; i < stringList.size(); i++) {
                String s = stringList.get(i);
                if (StringUtils.isEmpty(s = StringUtils.trimToEmpty(s))) continue;
                if (i % 2 == 0) {
                    //地区代码
                    if (!stringCode.contains(s) && !codeNameRemove.contains(s)) stringCode.add(s);
                } else {
                    //地区名字
                    if (!stringName.contains(s) && !codeRemove.contains(s)) stringName.add(s);
                }
            }

            for(int i=0;i<areaStringList.size();i++){
                String s = areaStringList.get(i);
                if (StringUtils.isEmpty(s = StringUtils.trimToEmpty(s))) continue;
                if (i % 2 == 0) {
                    //区代码
                    StringAreaCode.add(s);
                } else {
                    //区名字
                    StringAreaName.add(s);
                }
            }

           // 中国大陆数据:三级-省市县
            List<Province> provinceList = processData(stringName, stringCode ,StringAreaName,StringAreaCode);

// provinceAndCities 是为了获取 中国大陆+港澳台 的所有 省市数据
provinceList.forEach(
                    item -> {
                        List<String> cities;
                        if (StringUtils.containsAny(item.getName(), MUNICIPALITY_DIRECTLY_UNDER_THE_CENTRAL_GOVERNMENT)){
                            cities = item.getCityList().get(0).getAreaList().stream().map(Area::getName).collect(Collectors.toList());
                        } else {
                            cities = item.getCityList().stream().map(City::getName).collect(Collectors.toList());
                        }
                        provinceAndCities.add(AreaWy.ProvinceAndCity.builder()
                                .province(item.getName())
                                .cities(cities)
                                .build());
                    }
            );
            
String hmts = IOUtils.toString(new ClassPathResource("HK-MO-TW.json").getInputStream(), StandardCharsets.UTF_8);
            JSONObject HK_MO_TW_JSON = JSONObject.parseObject(hmts);

            // 港澳台数据 - 省市数据
            for (Map.Entry<String,Object> entry: HK_MO_TW_JSON.entrySet()){
                String province = entry.getKey();
                Set<String> citySet = ((JSONObject) entry.getValue()).keySet();
                if (citySet.isEmpty()) continue;
                provinceAndCities.add(
                        AreaWy.ProvinceAndCity.builder()
                                .province(province)
                                .cities(Lists.newArrayList(citySet))
                                .build()
                );
            }
      
        } catch (Exception e) {
            e.printStackTrace();
        }
        return provinceAndCities;
    }

    /**
     * 生成省份列表数据
     *
     * @param stringName
     * @param stringCode
     * @return
     */
    private static List<Province> processData(List<String> stringName, List<String> stringCode,List<String> stringAreaName,List<String> stringAreaCode) {
        List<Province> provinceList = Lists.newArrayList();
        for (int i = 0; i < stringCode.size(); i++) {
            String provinceName = stringName.get(i);
            String provinceCode = stringCode.get(i);
            if (provinceCode.endsWith("0000")) {
                Province province = new Province();
                provinceList.add(province);
                province.setCode(provinceCode);
                province.setName(provinceName);
                List<City> cities = Lists.newArrayList();
                province.setCityList(cities);

                //直辖市 城市和省份名称一样
                if (StringUtils.containsAny(provinceName, MUNICIPALITY_DIRECTLY_UNDER_THE_CENTRAL_GOVERNMENT)) {
                    City city = new City();
                    List<Area> areas = Lists.newArrayList();
                    city.setName(provinceName);
                    city.setCode(provinceCode);
                    city.setAreaList(areas);
                    cities.add(city);
                    //县区
                    for (int k = 0; k < stringAreaCode.size(); k++) {
                        String areaName = stringAreaName.get(k);
                        String areaCode = stringAreaCode.get(k);
                        if (!provinceCode.equals(areaCode) && areaCode.startsWith(provinceCode.substring(0, 2))) {
                            Area area = new Area();
                            area.setName(areaName);
                            area.setCode(areaCode);
                            areas.add(area);
                        }
                    }
                }
                for (int j = 0; j < stringCode.size(); j++) {
                    String cityName = stringName.get(j);
                    String cityCode = stringCode.get(j);
                    //遍历获取地级市
                    if (!cityCode.equals(provinceCode) && cityCode.startsWith(provinceCode.substring(0, 2)) && cityCode.endsWith("00")) {
                        City city = new City();
                        List<Area> areas = Lists.newArrayList();
                        city.setName(cityName);
                        city.setCode(cityCode);
                        city.setAreaList(areas);
                        cities.add(city);
                        //遍历获取县区
                        for (int k = 0; k < stringAreaCode.size(); k++) {
                            String areaName = stringAreaName.get(k);
                            String areaCode = stringAreaCode.get(k);
                            if (!areaCode.equals(cityCode) && areaCode.startsWith(cityCode.substring(0, 4))) {
                                Area area = new Area();
                                area.setName(areaName);
                                area.setCode(areaCode);
                                areas.add(area);
                            }
                        }
                    }
                }

                // 省直辖县级行政单位
                String provice2Code = provinceCode.substring(0, 2);
                if (StringUtils.containsAny(provinceName,PROVINCE_INCLUDING_DIRECTLY_ADMINISTERED_AREA)){

                    for(int idx = 0,len = stringAreaCode.size(); idx <len;idx++){
                        if (!StringUtils.equals(provice2Code, stringAreaCode.get(idx).substring(0,2))) continue;
                        if (!StringUtils.endsWith(stringAreaName.get(idx),"*")) continue;
                        cities.add(City.builder().code(stringAreaCode.get(idx)).name(StringUtils.substringBefore(stringAreaName.get(idx),"*")).build());
                    }
                }

            }
        }
        return provinceList;
    }

    @Data
    static class Province {
        String code;
        String name;
        List<City> cityList;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    static class City {
        String code;
        String name;
        List<Area> areaList;
    }

    @Data
    static class Area {
        String code;
        String name;
    }

}

港澳台 数据
HK-MO-TW.json

{
  "香港特別行政區": {
    "香港島": [
      "中西區",
      "灣仔區",
      "東區",
      "南區"
    ],
    "九龍": [
      "油尖旺區",
      "深水埗區",
      "九龍城區",
      "黃大仙區",
      "觀塘區"
    ],
    "新界": [
      "荃灣區",
      "屯門區",
      "元朗區",
      "北區",
      "大埔區",
      "西貢區",
      "沙田區",
      "葵青區",
      "離島區"
    ]
  },
  "澳門特別行政區": {
    "澳門半島": [
      "花地瑪堂區",
      "聖安多尼堂區",
      "大堂區",
      "望德堂區",
      "風順堂區"
    ],
    "氹仔島": [
      "嘉模堂區"
    ],
    "路環島": [
      "聖方濟各堂區"
    ]
  },
  "臺灣省": {
    "臺北市": [
      "大安区",
      "内湖区",
      "士林区",
      "文山区",
      "北投区",
      "中山区",
      "信义区",
      "松山区",
      "万华区",
      "中正区",
      "大同区",
      "南港区",
      "其它区"
    ],
    "新北市": [
      "板桥区",
      "新庄区",
      "中和区",
      "三重区",
      "新店区",
      "土城区",
      "永和区",
      "芦洲区",
      "汐止区",
      "树林区",
      "淡水区",
      "三峡区",
      "林口区",
      "莺歌区",
      "五股区",
      "泰山区",
      "瑞芳区",
      "八里区",
      "深坑区",
      "三芝区",
      "万里区",
      "金山区",
      "贡寮区",
      "石门区",
      "双溪区",
      "石碇区",
      "坪林区",
      "乌来区",
      "平溪区"
    ],
    "桃園市": [
      "桃园区",
      "中坜区",
      "平镇区",
      "八德区",
      "杨梅区",
      "芦竹区",
      "龟山区",
      "龙潭区",
      "大溪区",
      "大园区",
      "观音区",
      "新屋区",
      "复兴区"
    ],
    "臺中市": [
      "北屯区",
      "西屯区",
      "大里区",
      "太平区",
      "南屯区",
      "丰原区",
      "东区",
      "南区",
      "西区",
      "北区",
      "中区",
      "潭子区",
      "大雅区",
      "沙鹿区",
      "清水区",
      "龙井区",
      "大甲区",
      "乌日区",
      "神冈区",
      "雾峰区",
      "梧栖区",
      "大肚区",
      "后里区",
      "东势区",
      "外埔区",
      "新社区",
      "大安区",
      "石冈区",
      "和平区"
    ],
    "臺南市": [
      "永康区",
      "安南区",
      "东区",
      "北区",
      "南区",
      "中西区",
      "新营区",
      "仁德区",
      "归仁区",
      "安平区",
      "佳里区",
      "善化区",
      "麻豆区",
      "新化区",
      "新市区",
      "关庙区",
      "安定区",
      "白河区",
      "学甲区",
      "盐水区",
      "西港区",
      "下营区",
      "后壁区",
      "七股区",
      "六甲区",
      "官田区",
      "柳营区",
      "东山区",
      "将军区",
      "玉井区",
      "北门区",
      "大内区",
      "楠西区",
      "南化区",
      "山上区",
      "左镇区",
      "龙崎区"
    ],
    "高雄市": [
      "凤山区",
      "三民区",
      "左营区",
      "前镇区",
      "楠梓区",
      "苓雅区",
      "小港区",
      "鼓山区",
      "大寮区",
      "冈山区",
      "仁武区",
      "林园区",
      "路竹区",
      "新兴区",
      "鸟松区",
      "大树区",
      "美浓区",
      "桥头区",
      "旗山区",
      "梓官区",
      "大社区",
      "茄萣区",
      "燕巢区",
      "湖内区",
      "阿莲区",
      "旗津区",
      "前金区",
      "盐埕区",
      "弥陀区",
      "内门区",
      "永安区",
      "六龟区",
      "杉林区",
      "田寮区",
      "甲仙区",
      "桃源区",
      "那玛夏区",
      "茂林区"
    ],
    "基隆市": [
      "安乐区",
      "七堵区",
      "信义区",
      "中正区",
      "中山区",
      "仁爱区",
      "暖暖区"
    ],
    "新竹市": [
      "东区",
      "北区",
      "香山区"
    ],
    "嘉義市": [
      "东区",
      "西区"
    ],
    "新竹縣": [
      "竹北市",
      "竹东镇",
      "新埔镇",
      "关西镇",
      "湖口乡",
      "新丰乡",
      "芎林乡",
      "宝山乡",
      "横山乡",
      "尖石乡",
      "北埔乡",
      "峨眉乡",
      "五峰乡"
    ],
    "苗栗縣": [
      "头份市",
      "苗栗市",
      "竹南镇",
      "苑里镇",
      "后龙镇",
      "通霄镇",
      "卓兰镇",
      "公馆乡",
      "铜锣乡",
      "三义乡",
      "大湖乡",
      "造桥乡",
      "头屋乡",
      "南庄乡",
      "西湖乡",
      "三湾乡",
      "泰安乡",
      "狮潭乡"
    ],
    "彰化縣": [
      "彰化市",
      "员林市",
      "和美镇",
      "鹿港镇",
      "溪湖镇",
      "二林镇",
      "田中镇",
      "北斗镇",
      "福兴乡",
      "花坛乡",
      "社头乡",
      "秀水乡",
      "伸港乡",
      "大村乡",
      "永靖乡",
      "埔心乡",
      "芳苑乡",
      "埔盐乡",
      "埤头乡",
      "溪州乡",
      "田尾乡",
      "芬园乡",
      "线西乡",
      "大城乡",
      "二水乡",
      "竹塘乡"
    ],
    "南投縣": [
      "南投市",
      "草屯镇",
      "埔里镇",
      "竹山镇",
      "集集镇",
      "名间乡",
      "国姓乡",
      "鹿谷乡",
      "水里乡",
      "信义乡",
      "仁爱乡",
      "鱼池乡",
      "中寮乡"
    ],
    "雲林縣": [
      "斗六市",
      "虎尾镇",
      "西螺镇",
      "斗南镇",
      "北港镇",
      "土库镇",
      "麦寮乡",
      "古坑乡",
      "莿桐乡",
      "口湖乡",
      "二仑乡",
      "元长乡",
      "水林乡",
      "仑背乡",
      "台西乡",
      "四湖乡",
      "大埤乡",
      "林内乡",
      "东势乡",
      "褒忠乡"
    ],
    "嘉義縣": [
      "朴子市",
      "太保市",
      "大林镇",
      "布袋镇",
      "民雄乡",
      "水上乡",
      "中埔乡",
      "竹崎乡",
      "新港乡",
      "东石乡",
      "六脚乡",
      "梅山乡",
      "义竹乡",
      "鹿草乡",
      "溪口乡",
      "番路乡",
      "阿里山乡",
      "大埔乡"
    ],
    "屏東縣": [
      "屏东市",
      "潮州镇",
      "东港镇",
      "恒春镇",
      "内埔乡",
      "万丹乡",
      "新园乡",
      "长治乡",
      "里港乡",
      "盐埔乡",
      "高树乡",
      "枋寮乡",
      "九如乡",
      "万峦乡",
      "佳冬乡",
      "林边乡",
      "竹田乡",
      "崁顶乡",
      "琉球乡",
      "麟洛乡",
      "南州乡",
      "新埤乡",
      "车城乡",
      "满州乡",
      "三地门乡",
      "来义乡",
      "玛家乡",
      "枋山乡",
      "泰武乡",
      "牡丹乡",
      "狮子乡",
      "春日乡",
      "雾台乡"
    ],
    "宜蘭縣": [
      "宜兰市",
      "罗东镇",
      "苏澳镇",
      "头城镇",
      "冬山乡",
      "五结乡",
      "礁溪乡",
      "员山乡",
      "壮围乡",
      "三星乡",
      "大同乡",
      "南澳乡"
    ],
    "花蓮縣": [
      "花莲市",
      "玉里镇",
      "凤林镇",
      "吉安乡",
      "新城乡",
      "寿丰乡",
      "秀林乡",
      "光复乡",
      "瑞穗乡",
      "富里乡",
      "万荣乡",
      "卓溪乡",
      "丰滨乡"
    ],
    "臺東縣": [
      "台东市",
      "卑南乡",
      "成功镇",
      "太麻里乡",
      "关山镇",
      "东河乡",
      "池上乡",
      "鹿野乡",
      "长滨乡",
      "大武乡",
      "兰屿乡",
      "海端乡",
      "绿岛乡",
      "金峰乡",
      "延平乡",
      "达仁乡"
    ],
    "澎湖縣": [
      "马公市",
      "湖西乡",
      "白沙乡",
      "西屿乡",
      "望安乡",
      "七美乡"
    ],
    "金門縣": [
      "金城镇",
      "金湖镇",
      "金沙镇",
      "金宁乡",
      "烈屿乡",
      "乌坵乡"
    ],
    "連江縣": [
      "南竿乡",
      "北竿乡",
      "莒光乡",
      "东引乡"
    ]
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值