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

被折叠的 条评论
为什么被折叠?



