/AreaCity-JsSpider-StatsGov

国家统计局中的省市区镇行政区划数据带拼音标注,高德地图的坐标和行政区域边界范围,在浏览器里面运行js代码采集的2019年发布的最新数据,含采集源码

Primary LanguageJavaScriptMIT LicenseMIT

📖省市区数据采集并标注拼音、坐标和边界范围

当前最新版为2019文件夹内的2018版数据,此数据发布于2019-01-31

可直接打开采集到的数据文件夹内的ok_data_level4.csv来使用,level4是省市区镇4级数据,level3是省市区3级数据。另外不需要的数据可以简单的用Excel筛选后直接删除。csv格式非常方便解析或导入数据库。

坐标和行政区域边界范围数据可到releases中下载,实际数据存储在AreaCity-JsSpider-StatsGov-GEO分库中。

数据源

采集环境

chrome 控制台,41.0.2272.118这版本蛮好,新版本乱码、SwitchyOmega代理没有效果、各种问题(简单制作chrome便携版实现多版本共存

采集深度

  • 2019文件夹采集了4层,省、市、区、镇,2018版数据。采集高德省市区三级坐标和行政区域边界范围。
  • 2018文件夹采集了3层,省、市、区,2017版数据
  • 2017文件夹采集了3层,省、市、区,2016版数据
  • 2013文件夹采集了4层,省、市、区、镇,2013版数据

ok_data表字段

省市区镇数据表。

字段 描述
id 统计局的编号经过去除后缀的0{3,6,8}得到的短编号;如果是添加的港澳台等数据,此编号为自定义编号。
pid 上级ID
deep 层级深度,0:省,1:市,2:区,3:镇。
name 城市名称,为统计局的名称精简过后的。
pinyin_prefix name的拼音前缀,取的是第一个字前两个字母和后两个字首字母组成的。
pinyin name的完整拼音。
ext_id 统计局原始的编号;如果是添加的港澳台等数据,此编号为0。
ext_name 原始名称,为未精简的名称。

ok_geo表字段

此表为坐标和行政区域边界范围数据表,因为数据文件过大(130M+),所以分开存储。

字段 描述
id ok_data表中的ID相同,通过这个ID关联到省市区具体数据。
geo 城市中心坐标,高德地图GCJ-02火星坐标系
polygon 行政区域边界,高德地图GCJ-02火星坐标系。存在多个地块时用;分隔,每个地块的坐标点用 空格分隔,特别要注意:多个地块组合在一起可能是MULTIPOLYGON或者POLYGON,需用工具进行计算和对数据进行验证。js没找到求polygon并集的方法。

📖拼音标注

拼音源

省市区这三级采用在线拼音工具转换,据说依据《新华字典》、《现代汉语词典》等规范性辞书校对,多音字地名大部分能正确拼音,重庆->chong qing朝阳->chao yang郫都->pi du闵行->min hang康巴什->kang ba shi

镇级以下地名采用本地拼音库转换,准确度没有省市区的高。

拼音前缀

从完整拼音中提取的拼音前缀,取的是第一个字前两个字母和后两个字首字母,意图是让第一个字相同名称的尽量能排序在一起。排序1:黑龙江helj、湖北hub、湖南hun;排序2:湖北hb、黑龙江hlj、湖南hn,排序一胜出。

📖坐标和行政区域边界范围

数据源

使用高德接口采集的,本来想采百度地图的,但经过使用发现百度地图数据有严重问题:

参考 肃宁县(右下方向那块飞地)路南区(唐山科技职业技术学院那里一段诡异的边界) 边界,百度数据大量线段交叉的无效polygon百度地图测试),没有人工无法修正,高德没有这个问题(高德地图测试);

并且高德对镂空性质的地块处理比百度强,参考天津市唐山大块飞地的处理,高德数据只需要Union操作就能生成polygon,百度既有Union操作又有Difference操作,极其复杂数据还无效。

所以放弃使用百度地图数据。

如何使用坐标和边界数据

坐标和边界数据省市区 数据是分开存储的,通过ID来进行关联。

数据存储在AreaCity-JsSpider-StatsGov-GEO分库中,也可自行到releases中下载。分开的原因是冗余数据总有那么一天会忘记更新,这个库人工操作的多,尽量减少这种重复数据避免产生问题。

可以导入到数据库内使用,由于POLYGON需要解析,蛮复杂的,可以参考2019/map_geo_格式化.js内的SQL Server导入用的SQL语句的例子。

如果需要特定的POLYGON格式,可以根据上面介绍的字段格式,自行进行解析和验证。

使用过程中如果遇到多种不同坐标系的问题,比如请求的参数是WGS-84坐标(GPS),我们后端存储的是高德的坐标,可以通过将WGS-84坐标转成高德坐标后进行处理,百度的坐标一样。转换有相应方法,转换精度一般可以达到预期范围,可自行查找。或者直接把高德的原始坐标数据转换成目标坐标系后再存储(精度?)。

边界效果预览

📖数据问题

  1. id编号和国家统计局的编号基本一致,方便以后更新,有很多网站接口数据中城市编号是和这个基本是一致的。

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

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

  4. 2017版开始数据结尾添加了自定义编号的港澳台 90海外 91数据,此编号并非标准编码,而是整理和参考标准编码规则自定义的,方便用户统一使用(注:民政部的台港澳编码为71、81、82)。

  5. 参考链接:统计用区划代码和城乡划分代码编制规则民政部发布的行政区划代码

  6. 2019版开始从高德采集了省市区三级坐标和行政区域边界范围数据,由于边界原始数据文件太大(100M+),RAR4高压后相对来说还是太大(20M+),分开来独立存储到了AreaCity-JsSpider-StatsGov-GEO分存储库中,采集的中间数据请到这个库进行查阅。

  7. 坐标和行政区域边界范围数据只含省市区三级,省市区总计3300+条数据,未采集到边界的有160条以内。关于未获取到坐标或边界的城市,本采集方案采取不处理策略,空着就空着,覆盖主要城市和主要人群,未覆盖区域实际使用过程中应该进行降级等处理。比如:尽最大可能的根据用户坐标来确定用户所在城市,因为存在没有边界信息的区域,未匹配到的应使用ip等城市识别方法。

2019修正数据

  • issues/2 乐亭县lào ,此县下面的乐亭读音均已修正。

📖使用js自行采集

在低版本chrome控制台内运行1、2、3打头的文件即可完成采集,前提是指定网页打开的控制台。这三个文件按顺序执行。

最新采集代码内对拼音转换的接口变化蛮大,由于优秀的那个公网接口采取了IP限制措施,就算使用了全自动的切换代理,全量转换还是极为缓慢,因此采用了本地转换接口和公网转换接口结合的办法,省市区三级采用公网接口,其他的采用本地接口。公网接口转换的正确度极高,本地的略差那么一点。

步骤1

  1. 打开国家统计局任页面 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/。
  2. 控制台内粘贴1_抓取国家统计局城市信息.js代码执行。
  3. 采集完成自动弹出下载,保存得到文件data.txt

步骤2

  1. 打开拼音接口页面,具体看2_抓取拼音.js开头注释。
  2. 复制data.txt内容到控制台执行,数据完成导入。
  3. 执行2_抓取拼音.js内代码。
  4. 拼音采集完成自动弹出下载,保存得到文件data-pinyin.txt

注:如果是2_x_抓取拼音.js,依次同样的运行。

步骤3

  1. 任意页面,最好是第二步这个页面。
  2. 复制data-pinyin.txt内容到控制台执行,数据完成导入。
  3. 执行3_格式化.js内代码。
  4. 格式化完成自动弹出下载,保存得到最终文件ok_data.csv

坐标和行政区域边界采集

使用坐标和边界目录内的map_geo.jsmap_geo_格式化.js高德地图测试页面,根据文件内的说明即可完成采集。

⭐捐赠

如果这个库有帮助到您,请 Star 一下。

你也可以选择使用支付宝给我捐赠: