乐趣区

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

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

GitHub: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov
在线预览:多级联动测试和预览、转换成 JSON

城市的坐标和边界范围

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

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

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

采集源码见此目录:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/2019/ 坐标和边界

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

新版城市数据采集

原何重装

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

技能要点

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

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

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

采集源码见此目录(其中 1 - 3 打头的 js 文件):https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/2019

数据特性

  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 级由于直接采用的腾讯地图的数据,对照统计局的来看,区别不大,其他网站没有对比,蛮很少有提供这么深层级的,并且数据量太大也不好怎么对比出一个可信的数据。

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

== 完 ==

退出移动版