Android地区选择:中国最新省、市、区/县数据(更新到2018.10)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lkjfyy/article/details/84448783

最近项目更新,产品提出项目中的地区选择数据落后了,让我更新下数据,于是果断Google了一圈,发现现在网上的所谓的最新中国省市区数据都有点落后了,没办法,只好自己找数据,所以有了这篇文章。

中国大陆地区数据来源:中华人民共和国民政部公布的行政区划代码(截止到2018.10)
港澳地区数据来源:高德地图城市编码表(截止到2018.4)
台湾地区数据来源:网友提供(截止到2018.9)

但是这些拿到的数据都是.txt格式的,不能直接拿来用啊,怎么办呐?只好自己写了个Android程序,只需要把.txt数据文件放在assets文件加下,点击生成.json文件,至此大功告成!

照例先上图:
一键生成.json文件,轻松随意

贴出关键代码:

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *  author  lkj
 *  email   [email protected]
 *  date    2018/11/22 14:33
 *  description 读取assets文件工具类
 */

public class FileUtils {

    /**
     * 逐行读取assets下的txt文件
     * @param context
     * @param path 含后缀名
     * @return 每行string的list集合
     */
    public static List<String> readFile(Context context, String path) {
        List<String> stringList = new ArrayList<String>();
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
            String str = "";
            is = context.getAssets().open(path);
            isr=new InputStreamReader(is);
            br = new BufferedReader(isr);
            while ((str = br.readLine()) != null) {
                if (!TextUtils.isEmpty(str)){
                    str=str.toString().trim();

                    if (str.contains("北京") || str.contains("上海") ||
                            str.contains("天津") || str.contains("重庆")){
                        str=str.substring(0,str.length()-1);
                    }
                    String str1=str.substring(0,7);
                    String str2=str.substring(7);
                    str=str.replace(str,str1.trim()+" "+str2.trim());
                    stringList.add(str);
                }
            }
        } catch (FileNotFoundException e) {
            Log.e("找不到指定文件",e.toString());
        } catch (IOException e) {
            Log.e("读取文件失败",e.toString());
        } finally {
            try {
                br.close();
                isr.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return stringList;
    }

    /**
     * 读取assets下的txt文件,返回utf-8 String
     * @param context
     * @param fileName 不包括后缀
     * @return 文件内容 string
     */
    public static String readAssetsTxt(Context context, String fileName){
        try {
            //Return an AssetManager instance for your application's package
            InputStream is = context.getAssets().open(fileName+".txt");
            int size = is.available();
            // Read the entire asset into a local byte buffer.
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            // Convert the buffer into a string.
            String text = new String(buffer, "utf-8");
            
            text=replaceBlank(text);
            // Finally stick the string into the text view.
            return text;
        } catch (IOException e) {
            // Should never happen!
//            throw new RuntimeException(e);
            e.printStackTrace();
        }
        return "读取错误,请检查文件名";
    }

    public static String replaceBlank(String src) {
        String dest = "";
        if (src != null) {
            Pattern pattern = Pattern.compile("\t|\r|\n|\\s*");
            Matcher matcher = pattern.matcher(src);
            dest = matcher.replaceAll("");
        }
        return dest;
    }

    /**
     * 生成.json文件
     * @param jsonString 需要格式化的json字符串
     * @param filePath 文件保存路径
     * @return 是否生成文件成功
     */
    public static boolean createJsonFile(String jsonString, String filePath) {
        boolean flag = true;
        try {
            File file = new File(Environment.getExternalStorageDirectory(), filePath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();

            // 格式化json字符串
            jsonString = JsonFormatTool.formatJson(jsonString);
            Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            write.write(jsonString);
            write.flush();
            write.close();
        } catch (Exception e) {
            Log.e("失败原因",e.toString());
            flag = false;
            e.printStackTrace();
        }
        return flag;
    }
}

处理读取的地区数据字符串集合关键代码:

/**
     * 格式化从assets中取出的字符串集合
     *
     * @return json字符串
     */
    @SuppressLint("LongLogTag")
    private String formatCityData() {
        List<String> strings = FileUtils.readFile(MainActivity.this, "province.txt");
        Log.e("字符串行数", strings.size() + "");
        for (int i = 0; i < strings.size(); i++) {
            //每一行根据空格分割,便于取出有用的值
            List<String> list = Arrays.asList(strings.get(i).split(" "));
            cityDataList.add(list);
        }

        for (int i = 0; i < cityDataList.size(); i++) {

            String provinceName = cityDataList.get(i).get(1);
            String provinceCode = cityDataList.get(i).get(0);
            //遍历获取省级单位
            if (provinceCode.endsWith("0000")) {
                Province province = new Province();
                provinceList.add(province);
                province.setCode(provinceCode);
                province.setName(provinceName);
                List<City> cities = new ArrayList<>();
                province.setCityList(cities);
                //香港,澳门,只有两级(如果想设成三级,只需自己增加一级即可)
                if (provinceName.contains("香港") || provinceName.contains("澳门")) {
                    for (int k = 0; k < cityDataList.size(); k++) {
                        String cityName = cityDataList.get(k).get(1);
                        String cityCode = cityDataList.get(k).get(0);
                        if (!provinceCode.equals(cityCode) && cityCode.startsWith(provinceCode.substring(0, 2))) {
                            City city = new City();
                            city.setName(cityName);
                            city.setCode(cityCode);
                            cities.add(city);
                        }
                    }
                }
                //直辖市 城市和省份名称一样
                if (provinceName.contains("北京") || provinceName.contains("上海") ||
                        provinceName.contains("天津") || provinceName.contains("重庆")) {
                    City city = new City();
                    List<Area> areas = new ArrayList<>();
                    city.setName(provinceName + "市");
                    city.setCode(provinceCode);
                    city.setAreaList(areas);
                    cities.add(city);
                    //县区
                    for (int k = 0; k < cityDataList.size(); k++) {
                        String areaName = cityDataList.get(k).get(1);
                        String areaCode = cityDataList.get(k).get(0);
                        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 < cityDataList.size(); j++) {
                    String cityName = cityDataList.get(j).get(1).trim();
                    String cityCode = cityDataList.get(j).get(0).trim();
                    //遍历获取地级市
                    if (!cityCode.equals(provinceCode) && cityCode.startsWith(provinceCode.substring(0, 2)) && cityCode.endsWith("00")) {
                        City city = new City();
                        List<Area> areas = new ArrayList<>();
                        city.setName(cityName);
                        city.setCode(cityCode);
                        city.setAreaList(areas);
                        cities.add(city);
                        //遍历获取县区
                        for (int k = 0; k < cityDataList.size(); k++) {
                            String areaName = cityDataList.get(k).get(1);
                            String areaCode = cityDataList.get(k).get(0);
                            if (!areaCode.equals(cityCode) && areaCode.startsWith(cityCode.substring(0, 4))) {
                                Area area = new Area();
                                area.setName(areaName);
                                area.setCode(areaCode);
                                areas.add(area);
                            }
                        }
                    }
                }
            }
        }
        //转化成JSON数据
        String jsonStrings = new Gson().toJson(provinceList);
        //写入文件
        boolean b = FileUtils.createJsonFile(jsonStrings, "/province.json");
        Toast.makeText(MainActivity.this, b ? "创建文件成功" : "创建文件失败", Toast.LENGTH_SHORT).show();
        return jsonStrings;
    }

地区选择控件我用的是:citypicker,安利一下
注意:
因为我港澳地区的数据只有两级,所以我改动了上述作者的库的源码,大家可根据自己项目需要,生成你想要的json数据格式

详情请访问我的Github,源码已上传,欢迎stars

点击获取源码:中国最新省市区数据项目

猜你喜欢

转载自blog.csdn.net/lkjfyy/article/details/84448783