版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lkjfyy/article/details/84448783
最近项目更新,产品提出项目中的地区选择数据落后了,让我更新下数据,于是果断Google了一圈,发现现在网上的所谓的最新中国省市区数据都有点落后了,没办法,只好自己找数据,所以有了这篇文章。
中国大陆地区数据来源:中华人民共和国民政部公布的行政区划代码(截止到2018.10)
港澳地区数据来源:高德地图城市编码表(截止到2018.4)
台湾地区数据来源:网友提供(截止到2018.9)
但是这些拿到的数据都是.txt格式的,不能直接拿来用啊,怎么办呐?只好自己写了个Android程序,只需要把.txt数据文件放在assets文件加下,点击生成.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
点击获取源码:中国最新省市区数据项目