项目场景:
提示:参考数据国家统计局,[http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2021/index.html
](http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2021/index.html)
用户地址和可销售区域以及物流配送都需要有一个统一的标准,但是行政区域有可能会被撤销以及新增,所以要不定时进行数据同步。国家统计局会定时更新数据,我们可以根据需要进行拉取。
数据及介绍
下面提供一套最近我拉取的数据,如果有需要的可以进行下载使用。
csdn下载地址不需要金币
1-3级地址示例
第四级街道示例
按照国家统一编码,北京市编码11,天津编码12以及其他省份或者直辖市都是有固定的编码,全国统计用区划代码(12位)和城乡分类代码(3位),实际分析数据12位过于长保留6位即可。街道则根据第三级区名称定义
数据读取:
提示:如何从list中确定出省市区
代码长度为6位,前两位代表省份,中间两位代表市/区,后面两位代表县。
前两位代表省【110000,120000,130000】其提取方式为【代码%1000】
中间两位代表市【110100,120100,130100】 其提取方式为【代码%100】
剩余则代表区/县
现在我们已经知道字符长度中都是代表什么样的区域,但是如何实现三级联动的效果呢?
方案如下:
1.先取出所有的省/直辖市级获取其编码
2.循环list配置值计算方式为【0<(当前值-省编码)<1000】即为此省下面的市区
3.循环list配置值计算方式为【0<(当前值-市编码)<100】即为此省下面的区县
4.由于第四级是单独的文件则直接根据选定的区编码读取文件即可
获取代码如下:
/// <summary>
/// 获取四级地址
/// </summary>
/// <param name="code">区域编码</param>
/// <returns></returns>
public static object GetAreaCodeList(int? code)
{
//获取json文件
var JsonFile = Common.HtmlGet_Json(Config.openUrl + "Json/Area/list.json");
//文件转键值对
var ADic = JsonConvert.DeserializeObject<Dictionary<int, string>>(JsonFile);
//返回数据
List<string> areaList = new List<string> { };
//循环数据
foreach (var item in ADic)
{
//code为空
if (!code.HasValue)
{
//读取所有省
if (item.Key % 10000 == 0)
{
areaList.Add(item.Value);
}
}
else
{
var p = item.Key - code; // lxj,
//判断当前code是否为省
if (code % 10000 == 0)
{
//则取出市
if (p > 0 && p < 10000)
{
areaList.Add(item.Value);
}
}
else if (code % 100 == 0)
{
//则取出区/县
if (p > 0 && p < 100)
{
areaList.Add(item.Value);
}
}
else
{
//第四级根据code读取文件名
}
}
}
return areaList;
}
如果是过滤直辖市的是市辖区适当改变下代码即可如下:
/// <summary>
/// 获取四级地址
/// </summary>
/// <param name="code">区域编码</param>
/// <returns></returns>
public static object GetAreaCodeList(int? code)
{
//获取json文件
var JsonFile = Common.HtmlGet_Json(Config.openUrl + "Json/Area/list.json");
//文件转键值对
var ADic = JsonConvert.DeserializeObject<Dictionary<int, string>>(JsonFile);
//返回数据
List<string> areaList = new List<string> { };
//直辖市
int[] sxq = new int[] { 110000, 120000, 310000, 500000 };
//循环数据
foreach (var item in ADic)
{
//code为空
if (!code.HasValue)
{
//读取所有省
if (item.Key % 10000 == 0)
{
areaList.Add(item.Value);
}
}
else
{
var p = item.Key - code;
//过滤直辖市的市辖区
if (sxq.Contains(code.Value))
{
// 不同直辖市的区县
if (p > 100 && p < 100)
{
areaList.Add(item.Value);
}
}
else
{
//判断当前code是否为省
if (code % 10000 == 0)
{
//则取出市
if (p > 0 && p < 10000)
{
areaList.Add(item.Value);
}
}
else if (code % 100 == 0)
{
//则取出区/县
if (p > 0 && p < 100)
{
areaList.Add(item.Value);
}
}
else
{
//第四级根据code读取文件名
}
}
}
}
return areaList;
}
后面我会介绍如何从国家统计局拉取数据!