AreaCity 开源库整理了省、市、区县、乡镇街道四级行政区划数据,配套了在线工具转换成三级、四级联动JavaScript代码,使用自带的转换工具软件可以导入数据库;数据源自: 统计局、民政部、腾讯地图行政区划、高德地图行政区划,从这四大平台整合。
开源库内带有省市区三级坐标边界数据,数据来源:高德开放平台,使用配套提供的转换工具软件可以转换成shp、geojson、sql、导入数据库;另配套有开源Java查询工具,内存占用低,性能优良,1秒可查1万个以上坐标对应的城市信息。
GitHub地址:
https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov
Gitee地址:
https://gitee.com/xiangyuecn/AreaCity-JsSpider-StatsGov
数据在线预览:
https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/
截止到发文(2023-02-08),开源库内于2023年02月02日发布了新整理的最新版数据;行政区划数据更新频繁,仅区县每年都有好多个变更,统计局、民政部每年都会发布新数据(目前最新版的为统计于2022-12-29日发布的数据),不过需要自行处理;所以省市区数据需要经常去同步维护,好在这个开源库有在持续的长期维护,且有配套的转换工具,新数据发布后更新相对容易很多。
由于开源库更新维护数据比较及时,所以只要开源库没有被关闭,本文介绍的提取方法就一直适用,不仅仅是适用于今年;
比那些上传到下载平台就万年不更新的数据优秀很多。
一、最新版行政区划数据提取
1. 获取通用json格式文件
在
数据在线预览
页面底下,提供了个在线转换工具,打开就是当前库里面整理好的最新版数据(开源库更新维护数据比较及时),能将省市区镇四级数据转成json格式文件,控制选项也丰富,想要导出一级、两级、三级、四级数据都可以:
转换好后直接可以下载到json文件,json文件对于跨平台使用很方便,不单单是网页里面使用,手机app、桌面程序、后端代码内使用均适用。
通过自定义功能可以导出任意格式的JSON数据,比如第三方开源的级联操作库需要特定结构的JSON数组,部分自定义操作参考:
Android-PickerView:
province.json 的自定义更新操作
AndroidPicker:
china_address.json 的自定义更新操作
citypicker:
china_city_data.json 的自定义更新操作
2. 获取多级联动js版数据代码
在
数据在线预览
页面底下,提供了个在线转换工具,打开就是当前库里面整理好的最新版数据(开源库更新维护数据比较及时),能将省市区镇四级数据转成多级联动js,控制选项也丰富,转成两级、三级、四级联动都可以,还能在页面上直接体验到四级联动下拉选择:
转换好后直接可以下载到js文件,其实js代码内已经内嵌了json格式的数据,并且封装好了多级联动js代码,我们只需要按代码内的说明,调用方法即可在html网页里面快速实现多级联动,用户选择后会有事件回调。
3. 导入数据库、导出SQL文件
导入前先下载好:
【转换工具软件】在数据在线预览页面内,点击
转换工具软件
链接可以下载到开源库提供的转换工具,使用此工具,可以将省市区镇四级行政区划数据导入到MySQL、SQL Server数据库,或者转换成sql文件(导入到其他兼容数据库);
【ok_data_level4.csv数据文件】在数据在线预览页面内,点击显示的数据下载链接,下载解压得到
ok_data_level4.csv
数据文件。
准备好后,打开转换工具,开始将数据导入数据库(这里导入的MySQL,导入SQL Server一样操作):
点击工具内的“高级>>”按钮,打开自定义脚本界面;
在脚本界面点击顶上的选择文件,选择下载解压的
ok_data_level4.csv
数据文件;
在内置脚本下拉框中选择“省市区镇导入数据库”选项,然后点击应用按钮;
在左侧界面的数据库设置中,选择类型为MySQL,填写好数据库连接端口+数据库名+账号密码;
自定义脚本界面中点击“导入数据库”按钮,等待一会,4万多条数据3分钟不到就就导入数据库了。
MySQL客户端查看数据:
以上操作同样适用于SQL Server,一样的步骤
,另外内置脚本中还支持“省市区镇转SQL”功能,可以直接导出SQL文件,可以导入到其他兼容的数据库。
4. 行政区划数据的一些要注意的地方
开源库会尽量和民政部的更新频率保持一致,但由于最为主要的两个数据源
国家统计局
、
腾讯地图行政区划
更新频度并没有民政部高;因此省市区三级准确度和民政部准确度是一量级,并且要更完整些;第四级镇级主要由
腾讯地图行政区划
提供,腾讯数据源并不经常更新,因此会导致小部分新增、调整的城市第四级没有数据(会用上级数据补齐),使用前应该考虑此缺陷。
数据通过使用上级数据补齐的形式(具体细节请参考库文档后面的数据规则),使得任何一个数据都能满足省市区镇4级结构,没有孤立的(ID全局唯一),因此不管从哪级进行下级选择,都能进行有效操作。可以通过ID结构来识别这种补齐填充的数据,只要ID为上级的ID+多个0,就代表此数据为补齐填充数据,比如:东莞(4419)-东莞(441900),很容易鉴别出441900为补齐用的填充数据。
会发生补齐行为的数据很少,约50来个,主要为:直筒子市(东莞、儋州等)、省直辖县级市(济源、潜江等),他们的下一级仅有补齐的这条数据。另外直辖市(北京、天津等)下级也仅有一条数据,ID结尾为01(不包括重庆,重庆下级分成了市、县两个)。
数据中不包含大部分
行政管理区
(请自行查阅和行政区划的差别),比如:雄安新区、天府新区、苏州工业园区等。
二、省市区县坐标边界数据提取
省市区三级在线预览和下载:
https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html
,提供了ECharts + 高德地图四级下钻代码。
数据大小:13MB+压缩包 解压后130M+
数据来源:高德开放平台
文件格式:csv通用纯文本格式 (可转换成shp、geojson、sql、导入数据库)
文件名:ok_geo.csv.7z
坐标系:默认GCJ-02 (可转换成WGS-84、CGCS2000、BD-09等坐标系)
更新频度:开源库一月一更(直接从高德同步,忙的时候没时间会久一点)
下载到的数据是最新的csv纯文本格式,可以自行转换成需要的格式;也可下载一下开源库提供的
格式转换工具
,工具支持将csv数据转换成:shp、geojson、sql、导入数据库、坐标系转换,功能比较丰富。
1. 转成GeoJSON文件
geojson是通用格式,可以在网页中使用:地图、ECharts 都能直接支持,也可以在GIS软件中打开和编辑边界。
打开下载的格式转换工具,选择下载并解压出来的
ok_geo.csv
文件;
点击
转成geojson文件
按钮,耐心等待一会,数据就导出完成了;
导出的json文件和csv文件在同一个目录内,默认是所有数据在一个json文件内,点开高级使用里面geojson拆分工具可以按省、市、区拆分成单独的小文件。
开源库另外配套有Java坐标边界查询工具:
AreaCity-Query-Geometry
,使用
jts库
从
geojson边界数据
文件中查找出和任意点、线、面有相交的矢量边界,内存占用低,性能优良,1秒可查1万个以上坐标对应的城市信息;此工具自带了一个HTTP API服务,可以在在线预览页面的
自定义数据源
中进行调用测试,页面会立即绘制查询出来的边界图形。
2. 转成SHP文件
shp文件一般是在GIS软件中使用和编辑,比如:ArcGIS、QGIS软件;使用格式转换工具可以导出shp格式文件,导出操作和上面geojson文件一样,点击
转成shp文件
按钮即可导出。
3. 导入数据库、导出SQL文件
使用格式转换工具可以将省市区边界数据导入到数据库,使用数据库提供的空间查询可以轻松做到查询任意坐标点对应的省市区名称;也可通过后端程序查询出省市区多级边界数据WKT格式,供前端使用。
打开下载的格式转换工具,选择下载并解压出来的
ok_geo.csv
文件;
数据库设置中选择要导入的数据库类型,支持:
MySQL
、
SQL Server
,再填写数据库连接,包括:端口、数据库名称、账号密码;
点击
导入数据库
按钮,等待一会,大约3分钟左右,所有数据就都导入到了数据库按今天日期新建的表里面。
对空间字段的查询,需要用`ST_AsText()`方法才能查询出字符串文本(WKT: Well Known Text),否则查询出来的是二进制数据
-- MySQL版:
SELECT id, name, ST_AsText(geo) AS geo, ST_AsText(polygon) AS polygon FROM 表名
-- SQL Server版:
SELECT id, name, geo.STAsText() AS geo, polygon.STAsText() AS polygon FROM 表名
省市区边界导入到了数据库后,我们就可以在在 `Java`、`Python`、`PHP`、`C#` 等程序中对数据库进行查询,通过SQL的空间计算函数`ST_Intersects`来查询一个坐标在哪些边界范围内,就能得到对应的省市区信息了
比如要查询坐标`lng:113.929976 lat:22.529497`是在哪个城市:
-- MySQL版:
SELECT id,deep,name FROM 表名 WHERE ST_Intersects(polygon, ST_GeomFromText('POINT(113.929976 22.529497)',0))=1
-- SQL Server版:
SELECT id,deep,name FROM 表名 WHERE polygon.STIntersects(geometry::STGeomFromText('POINT(113.929976 22.529497)',0))=1
注:csv文件内的边界数据默认是高德地图GCJ-02
火星坐标系,如果需要其他坐标系,比如百度的BD-09
或GPS的WGS-84
,可以通过高级脚本中的坐标系转换插件进行转换,选择好对应的插件后,点击应用就可以了,在导入数据库时会自动进行坐标系转换。
三、乡镇级坐标边界数据获取
乡镇级的坐标边界数据未开源,但和省市区三级一样的可以在线预览,大约半年重新整合一次,数据参考文档和下载地址:https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-level4.html
数据大小:109MB+压缩包 导出后300M+
数据来源:多个数据源整合
文件名:ok_geo4_*.csv.7z
坐标系:默认GCJ-02 (可转换成WGS-84、CGCS2000、BD-09等坐标系)
乡镇级坐标边界数据的使用方法和省市区三级一样,使用配套的转换工具可转换成shp、geojson、sql、导入数据库,请参考上面省市区三级的操作步骤。