真实感受一下县比省大不包邮,省市区乡镇多级数据重装上阵

1,499 阅读7分钟

以前采集的旧版省市区三级或四级城市数据总是觉得怪怪的,经过多方探讨,终于下定决心进行了一次重大更新,发布了这个重(chong)装版。除了省市区乡镇数据外,坐标和边界范围、还有拼音都是有的。

GitHub: github.com/xiangyuecn/… 在线预览:多级联动测试和预览、转换成JSON

城市的坐标和边界范围

坐标边界数据全部来自高德地图接口(GCJ-02坐标系),几个地图里面质量算是最好的。保存为csv格式,导入SQL Server也是很方便的,先睹为快(大到不包邮😮):

大到不包邮😮

从一幅中国地图里面去看,那种大到不包邮地方可能看不出什么太大的感觉;没有对比就没有伤害,单独把最大的县抠出来对比一下就有感觉了,👉看左边那一块纯色😁

这些坐标和边界数据使用js代码采集的,得到的csv文件有130M+,压缩成7z文件后有13M大小,采集速度很快,省市区三级数据大概3分钟就采集完成了。目前GitHub库里面的省市区三级和高德地图的城市蛮匹配,除了台湾的城市没有边界外,其他城市均有匹配的数据。

采集源码见此目录:github.com/xiangyuecn/…

另外贴一张图片乐呵乐呵:

大到不包邮😮

新版城市数据采集

原何重装

  1. 以前只从统计局获取数据,数据源过于单一,后来合并了民政部数据,还是感觉数据不太好使。
  2. 很多人提醒只用民政部的数据会比用统计局的更好;甚至有的会从很多数据源获取城市数据,唯独不要统计局的。
  3. 研究发现高德地图行政区域、腾讯地图行政区划,这些地图都有开放接口提供数据,并且数据开起了也不错。
  4. 强迫症又要犯了。

技能要点

综合分析了一下统计局、民政部、高德地图行政区域、腾讯地图行政区划,并且结合各大网站的城市选择数据,如:淘宝、QQ、58这些有城市选择的,发现统计局的数据主要问题出现在以下两点:

  1. 数据缺失,有些确实是没有,有些是因为数据没有更新导致的滞后,只能靠自己去补全。
  2. 包含了大约160来个开发区、经济区、高新区、国家级新区,这种区划应该算专门的区域,一般由多个城市的区域组成,在区级内算是重复的区域,因此需要剔除,但剔除后这些区域下面的镇级需要划分到实际的归属城市下面,这就很困难了,因为量太大了,一个个去查归属地几乎不可能。

围绕着这主要两点,从多个数据源里采集数据,然后上人工+智能(人工多些),问题才能够解决。为什么要这么麻烦?因为没有找到特别优秀的数据源,其他各大平台、网站的数据在感官上显得都不够完美,综合一下舒畅多了。

采集源码见此目录(其中1-3打头的js文件):github.com/xiangyuecn/…

数据特性

  1. id编号和国家统计局的编号基本一致,方便以后更新,有很多网站接口数据中城市编号是和这个基本是一致的,包括民政部、腾讯地图和高德地图的城市数据这套编号都是大部分通用的。

  2. 东莞中山儋州等不设区的直筒子市没有第三级区级,自动添加同名的一级作为区级,以保证整个数据结构的一致性,添加的城区编号以上级的ID结尾加两个0作为新ID,此结构ID兼容性还不错,比如:东莞(4419)下级只有一个区 东莞(441900)。

  3. 省直辖县级市(河南济源、湖北潜江、海南五指山、新疆昆玉等)根据编号来看本来只能放到区级,但为了便于用户选择,所有直辖市自动添加一个同名的市级,比如:湖北-直辖市-仙桃-*镇 调整后为 湖北-仙桃-仙桃-*镇,新添加数据的编号规则和第二条规则相同。

  4. 如果市、区没有下级,自动添加同名的一个城镇作为下级,编号规则和上一条规则相同,以保证数据层次的一致性(任何一个数据都能满足省市区镇4级结构,没有孤立的);比如:福建-泉州-金门没有镇,调整后为福建-泉州-金门-金门;另外从民政部等数据源中补全的新增城市也会缺失下级,照此规则自动补齐。

  5. 台湾数据只有省市区三级没有镇级,因此镇级通过前面几条规则自动补齐;香港、澳门数据源有两级,当做直筒子市来处理,比如把香港当做东莞,从面积和人口来看还算合理,因此港澳数据中省市区三级是完全相同的,第四级镇级才有城市数据,如:香港-香港-香港-湾仔区。

  6. 地区名字是直接去掉常见的后缀进行精简的,如直接清除结尾的市|区|县|街道办事处|XX族自治X,数量较少并且移除会导致部分名字产生歧义的后缀并未精简。

  7. 省市区前三级数据的合并:统计局采集过来的数据会先和民政部的数据交叉对比后进行合并;由于统计局的数据明显的滞后,民政部内新添加的市、区将不会有镇级(自动补齐同名镇级);如果民政部数据存在明文撤销的市、区,那么合并的时候会删除统计局对应的数据,如:山东-莱芜市于2019-01撤销,并在济南市新加莱芜区钢城区;如果统计局中的数据在民政部数据内不存在,将原样保留。高德地图行政区域会和腾讯地图行政区划数据进行交叉对比,然后择优选取需要的数据。最后(统计局+民政部)和(高德+腾讯的数据)的前三级数据进行交叉融合,得到的【省市区】 ≈ 【统计局的数据】 - 【160来个开发区、经济区、高新区、国家级新区】 - 【撤销城市】 + 【新设城市】 + 【港澳台】。

  8. 第四级镇级主要采用腾讯地图行政区划数据,综合高德和统计局的数据,和统计局的数据差异在3000个左右,占比7.5%(3000/40000),得到的【镇级】 ≈ 【腾讯地图行政区划数据】。

数据应用和更新

综合应用

库里面提供了一个在线测试的页面,提供3级或4级数据的多级选择测试,并且提供数据格式转换导出,方便转换成需要的格式。

  1. 城市数据、坐标和边界均可导入数据内使用。
  2. 城市数据因为全部有拼音,因此在选择界面显示时很容易分组和显示拼音前缀,省市区3级拼音准确度奇高,第4级稍微差点。
  3. 边界坐标可用来根据用户坐标解析出城市信息,除台湾外全部城市均能覆盖到。
  4. 库里面提供了采集源码,采集方式为浏览器控制台内执行js采集,全部自己采集也很快速,大约30分钟以内就搞定了;当然直接下载也是可以的。

更新计划

目前来看,新版的数据前3级看起来和其他大网站的区别不会太大了,并且比他们新,主要是丢弃了那160多个开发区、经济区的功劳。第4级由于直接采用的腾讯地图的数据,对照统计局的来看,区别不大,其他网站没有对比,蛮很少有提供这么深层级的,并且数据量太大也不好怎么对比出一个可信的数据。

目前更新主要看民政部,民政部有新数据放出后,会去对比一下数据是否有变化,如果没有变化就会全量更新。不过对已在使用的数据库内的老数据的更新,目前并没有什么简洁的解决方案,因为这种数据在数据库里面更新时一件很麻烦的事情。

== 完 ==