根据国家统计局处理四级地址库

项目场景:

提示:参考数据国家统计局,[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;
        }

后面我会介绍如何从国家统计局拉取数据!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值