java全世界各国城市地址解析

导读:本篇文章讲解 java全世界各国城市地址解析,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

最近新写了一个关于全世界国家、省会、城市地址解析的功能。
可用于,比如航班管理系统、高铁管理系统、快递系统、定位、一般的系统登录时地址选择等应用场景。
例如:查询全球有哪些国家、查询某个国家下有哪些城市或省会,查询某个省下有哪些城市

一、地址信息文件worldAddress.txt下载

worldAddress.txt 文件包含了全世界所有国家的省市。

百度云下载 https://pan.baidu.com/s/1HAU6NIsU3vrhMJFAqd33Ww(提取码:k5wx)

worldAddress.txt 文件长这样:
国家前没有空格,省会前2个空格,城市前4个空格。
在这里插入图片描述

二、解析地址信息文件代码

用到 fastjson 来返回json,需网上下载该jar包导入,
如果你的项目使用maven,你可以使用如下maven来导入fastjson依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.79</version>
</dependency>

上面下载的文件在下面的addressFilePath 配置路径。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WorldAddressUtils {

    /**
     * 用于读取解析的地址路径
     */
    private final String addressFilePath = "F:/new/worldAddress.txt";
    /**
     * 是否过滤A、B、C...之类的国家分割符号,true过滤,false不过滤
     */
    private final boolean fillterSingleChar = true;

    /**
     * 存放所有国家、省会、城市
     */
    private Map<String, Map<String, List<String>>> addressInfoMap = new HashMap<>();
    /**
     * 存放所有英文和中文,<英文,中文>
     */
    private Map<String, String> englishCnMap = new HashMap<>();
    /**
     * 存放所有国家
     */
    private List<String> countrys = new ArrayList<>();
    /**
     * 存放所有省会
     */
    private List<String> province = new ArrayList<>();
    /**
     * 存放所有城市和省会<城市,省会>
     */
    private Map<String, String> citysToProvince = new HashMap<>();
    /**
     * 存放所有城市和省会<省会,国家>
     */
    private Map<String, String> provinceToCountrys = new HashMap<>();

    public WorldAddressUtils() {
        try (
                //读取文件为字节流
                FileInputStream file = new FileInputStream(addressFilePath);
                //字节流转化为字符流,以UTF-8读取防止中文乱码
                InputStreamReader in = new InputStreamReader(file, "UTF-8");
                //加入到缓存
                BufferedReader buf = new BufferedReader(in);
        ) {
            String str = "";
            //按行读取,到达最后一行返回null
            while ((str = buf.readLine()) != null) {
                String[] engCn = str.split("#");
                //enName是英文的地名
                String enName = engCn[0].trim();
                //enName是中文的地名
                String cnName = engCn[1].trim();
                englishCnMap.put(engCn[0].trim().toLowerCase(), cnName);
                char[] chars = engCn[0].toCharArray();
                //每一行前的空格数,0是国家,2是省会,4是城市
                int spaceCount = 0;
                for (int i = 0; i < chars.length; i++) {
                    if (chars[i] != ' ') {
                        break;
                    } else if (chars[i] == ' ') {
                        spaceCount += 1;
                    }
                }

                if (enName.length() == 1 && fillterSingleChar) {
                    continue;
                }

                if (0 == spaceCount) {
                    countrys.add(cnName);
                    //存放一个新的国家
                    addressInfoMap.put(cnName, new HashMap<>());
                }

                //从countrys获取最后一个国家的所有省会
                Map<String, List<String>> provinceMap = addressInfoMap.get(countrys.get(countrys.size() - 1));
                if (2 == spaceCount) {
                    province.add(cnName);
                    //存放一个新的省会
                    provinceMap.put(cnName, new ArrayList<>());
                    provinceToCountrys.put(cnName, countrys.get(countrys.size() - 1));
                }

                //存放一个新的城市
                if (spaceCount == 4) {
                    String provinceStr = province.get(province.size() - 1);
                    List<String> cityList = provinceMap.get(provinceStr);
                    cityList.add(cnName);
                    citysToProvince.put(cnName, provinceStr);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取所有的国家名称
     */
    public JSONObject getAllCountrys() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("countrys", JSONArray.parseArray(JSON.toJSONString(countrys)));
        return jsonObject;
    }


    /**
     * 获取所有的国家名称和对应的省会
     */
    public JSONObject getAllCountrysProvince() {
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
            JSONObject countrysProvince = new JSONObject();
            JSONArray provinceArray = new JSONArray();
            for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
                provinceArray.add(map.getKey());
            }
            countrysProvince.put("country", entryMap.getKey());//国家
            countrysProvince.put("province", provinceArray);//省会
            jsonArray.add(countrysProvince);
            jsonObject.put("countrysProvince", jsonArray);
        }
        return jsonObject;
    }


    /**
     * 获取所有的国家名称和对应的省会和城市
     */
    public JSONObject getAllCountrysProvinceCity() {
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
            JSONObject countrysProvince = new JSONObject();
            JSONArray provinceArray = new JSONArray();
            for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
                List<String> cityList = map.getValue();//城市
                JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
                JSONObject provinceCity = new JSONObject();//存城市和省会
                provinceCity.put("province", map.getKey());
                provinceCity.put("city", cityArray);
                provinceArray.add(provinceCity);
            }
            countrysProvince.put("country", entryMap.getKey());//国家
            countrysProvince.put("provinceCity", provinceArray);//省会、城市
            jsonArray.add(countrysProvince);
            jsonObject.put("countrysProvince", jsonArray);
        }
        return jsonObject;
    }


    /**
     * 获取指定国家下的省会、城市
     */
    public JSONObject getProvinceFromCountry(String country) {
        if (englishCnMap.containsKey(country.toLowerCase())) {
            //如果输入的是英文转换成中文
            country = englishCnMap.get(country.toLowerCase());
        }
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
            if (country.equals(entryMap.getKey())) {
                JSONObject countrysProvince = new JSONObject();
                JSONArray provinceArray = new JSONArray();
                for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
                    List<String> cityList = map.getValue();//城市
                    JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
                    JSONObject provinceCity = new JSONObject();//存城市和省会
                    provinceCity.put("province", map.getKey());
                    provinceCity.put("city", cityArray);
                    provinceArray.add(provinceCity);
                }
                countrysProvince.put("country", entryMap.getKey());//国家
                countrysProvince.put("provinceCity", provinceArray);//省会、城市
                jsonArray.add(countrysProvince);
                jsonObject.put("countrysProvince", jsonArray);
            }
        }
        return jsonObject;
    }


    /**
     * 获取指定省会下的城市
     */
    public JSONObject getCityFromProvince(String province) {
        if (englishCnMap.containsKey(province.toLowerCase())) {
            //如果输入的是英文转换成中文
            province = englishCnMap.get(province.toLowerCase());
        }
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
            //根据省会获取国家并判断相等
            if (provinceToCountrys.get(province).equals(entryMap.getKey())) {
                JSONObject countrysProvince = new JSONObject();
                JSONArray provinceArray = new JSONArray();
                for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
                    if (province.equals(map.getKey())) {
                        List<String> cityList = map.getValue();//城市
                        JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
                        JSONObject provinceCity = new JSONObject();//存城市和省会
                        provinceCity.put("province", map.getKey());
                        provinceCity.put("city", cityArray);
                        provinceArray.add(provinceCity);
                    }
                }
                countrysProvince.put("country", entryMap.getKey());//国家
                countrysProvince.put("provinceCity", provinceArray);//省会、城市
                jsonArray.add(countrysProvince);
                jsonObject.put("countrysProvince", jsonArray);
            }
        }
        return jsonObject;
    }


    /**
     * 根据城市获取所属省会的城市和国家
     */
    public JSONObject getCityFromCountry(String city) {
        if (englishCnMap.containsKey(city.toLowerCase())) {
            //如果输入的是英文转换成中文
            city = englishCnMap.get(city.toLowerCase());
        }
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
            String getProvince = citysToProvince.get(city);
            if (provinceToCountrys.get(getProvince).equals(entryMap.getKey())) {//根据省会获取国家过滤
                JSONObject countrysProvince = new JSONObject();
                JSONArray provinceArray = new JSONArray();
                for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
                    if (getProvince.equals(map.getKey())) {
                        List<String> cityList = map.getValue();//城市
                        JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
                        JSONObject provinceCity = new JSONObject();//存城市和省会
                        provinceCity.put("province", map.getKey());
                        provinceCity.put("city", cityArray);
                        provinceArray.add(provinceCity);
                    }
                }
                countrysProvince.put("country", entryMap.getKey());//国家
                countrysProvince.put("provinceCity", provinceArray);//省会、城市
                jsonArray.add(countrysProvince);
                jsonObject.put("countrysProvince", jsonArray);
            }
        }
        return jsonObject;
    }
}

三、测试

import utils.WorldAddressUtils;
import java.io.IOException;
public class Test {
    public static void main(String[] args) throws IOException {
       WorldAddressUtils a=new   WorldAddressUtils();
        System.out.println(a.getProvinceFromCountry("中国"));//获取指定国家下的省会、城市
       /* System.out.println(a.getAllCountrys());//获取所有国家
        System.out.println(a.getAllCountrysProvince());//获取所有国家、省会
        System.out.println(a.getAllCountrysProvinceCity());//获取所有国家、省会和城市
        System.out.println(a.getCityFromProvince("河北"));//获取指定省会下的城市
        System.out.println(a.getCityFromCountry("保定"));//根据城市获取所属省会的城市和国家*/
    }
}

四、结果

{
	"countrysProvince": [{
		"provinceCity": [{
			"province": "山东",
			"city": ["滨州", "东营", "德州", "菏泽", "济宁", "济南", "聊城", "莱芜", "临沂", "青岛", "日照", "泰安", "潍坊", "威海", "烟台", "淄博", "枣庄"]
		}, {
			"province": "福建",
			"city": ["福州", "龙岩", "宁德", "南平", "莆田", "泉州", "三明", "厦门", "漳州"]
		}, {
			"province": "台湾",
			"city": ["高雄市", "花莲县", "基隆市", "金门县", "嘉义市", "嘉义县", "连江县", "苗栗县", "南投县", "屏东县", "澎湖县", "台北市", "台东县", "台南市", "桃园县", "台中市", "新北市", "新竹市", "新竹县", "宜兰县", "云林县", "彰化县"]
		}, {
			"province": "河北",
			"city": ["保定", "承德", "沧州", "邯郸", "衡水", "廊坊", "秦皇岛", "石家庄", "唐山", "邢台", "张家口"]
		}, {
			"province": "河南",
			"city": ["安阳", "鹤壁", "济源", "焦作", "开封", "漯河", "洛阳", "南阳", "平顶山", "濮阳", "三门峡", "商丘", "许昌", "新乡", "信阳", "周口", "驻马店", "郑州"]
		}, {
			"province": "重庆",
			"city": ["北碚", "巴南", "璧山", "城口", "大渡口", "垫江", "大足", "丰都", "奉节", "涪陵", "合川", "江北", "江津", "九龙坡", "开县", "两江新区", "梁平", "南岸", "南川", "彭水", "黔江", "綦江", "荣昌", "沙坪坝", "双桥", "石柱", "铜梁", "潼南", "武隆", "巫山", "万盛", "巫溪", "万州", "秀山", "渝北", "永川", "云阳", "酉阳", "渝中", "长寿", "忠县"]
		}, {
			"province": "湖北",
			"city": ["恩施", "鄂州", "黄冈", "黄石", "荆门", "荆州", "潜江", "神农架", "十堰", "随州", "天门", "武汉", "孝感", "咸宁", "仙桃", "襄阳", "宜昌"]
		}, {
			"province": "湖南",
			"city": ["常德", "郴州", "怀化", "衡阳", "娄底", "邵阳", "湘潭", "湘西", "益阳", "岳阳", "永州", "张家界", "长沙", "株洲"]
		}, {
			"province": "海南",
			"city": ["白沙", "保亭", "昌江", "澄迈", "定安", "东方", "儋州", "海口", "乐东", "临高", "陵水", "琼海", "琼中", "三沙", "三亚", "屯昌", "文昌", "万宁", "五指山"]
		}, {
			"province": "江西",
			"city": ["抚州", "赣州", "吉安", "景德镇", "九江", "南昌", "萍乡", "上饶", "新余", "宜春", "鹰潭"]
		}, {
			"province": "黑龙江",
			"city": ["大庆", "大兴安岭", "哈尔滨", "鹤岗", "黑河", "佳木斯", "鸡西", "牡丹江", "齐齐哈尔", "七台河", "绥化", "双鸭山", "伊春"]
		}, {
			"province": "天津",
			"city": ["北辰", "宝坻", "滨海新区", "东丽", "河北", "河东", "和平", "红桥", "河西", "静海", "津南", "蓟县", "宁河", "南开", "武清", "西青"]
		}, {
			"province": "贵州",
			"city": ["安顺", "毕节", "贵阳", "六盘水", "黔东南", "黔南", "黔西南", "铜仁", "遵义"]
		}, {
			"province": "陕西",
			"city": ["安康", "宝鸡", "汉中", "商洛", "铜川", "渭南", "西安", "咸阳", "延安", "榆林"]
		}, {
			"province": "新疆",
			"city": ["阿克苏", "阿拉尔", "阿勒泰", "博尔塔拉", "巴音郭楞", "昌吉", "哈密", "和田", "克拉玛依", "喀什", "克孜勒苏", "石河子", "塔城", "吐鲁番", "图木舒克", "五家渠", "乌鲁木齐", "伊犁"]
		}, {
			"province": "澳门",
			"city": ["大堂区", "氹仔", "风顺堂区", "花地玛堂区", "路环岛", "圣安多尼堂区", "望德堂区"]
		}, {
			"province": "江苏",
			"city": ["常州", "淮安", "连云港", "南京", "南通", "宿迁", "苏州", "泰州", "无锡", "徐州", "盐城", "扬州", "镇江"]
		}, {
			"province": "安徽",
			"city": ["安庆", "蚌埠", "亳州", "巢湖", "池州", "滁州", "阜阳", "淮北", "合肥", "淮南", "黄山", "六安", "马鞍山", "宿州", "铜陵", "芜湖", "宣城"]
		}, {
			"province": "西藏",
			"city": ["阿里", "昌都", "拉萨", "林芝", "那曲", "日喀则", "山南"]
		}, {
			"province": "吉林",
			"city": ["白城", "白山", "吉林", "辽源", "四平", "松原", "通化", "延边", "长春"]
		}, {
			"province": "上海",
			"city": ["宝山", "崇明", "奉贤", "虹口", "黄浦", "静安", "嘉定", "金山", "卢湾", "闵行", "浦东新区", "普陀", "青浦", "松江", "徐汇", "杨浦", "闸北", "长宁"]
		}, {
			"province": "甘肃",
			"city": ["白银", "定西", "甘南", "金昌", "酒泉", "嘉峪关", "陇南", "临夏", "兰州市", "平凉", "庆阳", "天水", "武威", "张掖"]
		}, {
			"province": "宁夏",
			"city": ["固原", "石嘴山", "吴忠", "银川", "中卫"]
		}, {
			"province": "山西",
			"city": ["大同", "晋城", "晋中", "临汾", "吕梁", "朔州", "太原", "忻州", "运城", "阳泉", "长治"]
		}, {
			"province": "香港",
			"city": ["北区", "大埔区", "东区", "观塘区", "黄大仙区", "九龙城区", "葵青区", "离岛区", "南区", "荃湾区", "深水埗区", "沙田区", "屯门区", "湾仔区", "西贡区", "油尖旺区", "元朗区", "中西区"]
		}, {
			"province": "四川",
			"city": ["阿坝", "巴中", "成都", "德阳", "达州", "广安", "广元", "甘孜", "凉山", "乐山", "泸州", "眉山", "绵阳", "南充", "内江", "攀枝花", "遂宁", "雅安", "宜宾", "自贡", "资阳"]
		}, {
			"province": "广西",
			"city": ["北海", "百色", "崇左", "防城港", "贵港", "桂林", "河池", "贺州", "来宾", "柳州", "南宁", "钦州", "梧州", "玉林"]
		}, {
			"province": "浙江",
			"city": ["湖州", "杭州", "金华", "嘉兴", "丽水", "宁波", "衢州", "绍兴", "台州", "温州", "舟山"]
		}, {
			"province": "云南",
			"city": ["保山", "楚雄", "德宏", "大理", "迪庆", "红河", "昆明", "临沧", "丽江", "怒江", "普洱", "曲靖", "文山", "西双版纳", "玉溪", "昭通"]
		}, {
			"province": "内蒙古",
			"city": ["阿拉善", "包头", "巴彦淖尔", "赤峰", "鄂尔多斯", "呼和浩特", "呼伦贝尔", "通辽", "乌海", "乌兰察布", "兴安", "锡林郭勒"]
		}, {
			"province": "辽宁",
			"city": ["鞍山", "本溪", "朝阳", "丹东", "大连", "抚顺", "阜新", "葫芦岛", "锦州", "辽阳", "盘锦", "沈阳", "铁岭", "营口"]
		}, {
			"province": "广东",
			"city": ["潮州", "东莞", "佛山", "广州", "河源", "惠州", "江门", "揭阳", "茂名", "梅州", "清远", "韶关", "汕头", "汕尾", "深圳", "云浮", "阳江", "珠海", "湛江", "肇庆", "中山"]
		}, {
			"province": "青海",
			"city": ["果洛", "海北", "海东", "黄南", "海南", "海西", "西宁", "玉树"]
		}, {
			"province": "北京",
			"city": ["昌平", "朝阳", "东城", "大兴", "房山", "丰台", "海淀", "怀柔", "门头沟", "密云", "平谷", "石景山", "顺义", "通州", "西城", "延庆"]
		}],
		"country": "中国"
	}]
}

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80323.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!