基于FME国内县级及以上网络公开行政区划边界的获取

在上一篇记录《基于FME零编码获取新冠病毒(COVID-2019)患者曾逗留小区(场所)数据及可视化》中,给自己挖了个坑,这篇记录就是为了填坑,同时也可以使上一篇中的模板无需输入外源文件达到一键下载的功能。

百度收集的确诊病患曾逗留小区(场所)的获取需要使用国内地市一级的行政区边界文件,这篇记录就分享下国内两个县级以上行政区接口的获取方法:高德API接口和地图选择器(阿里云上的一个接口)(个人试过天地图的接口,数据缩放级别为11级,在实际工作中用处不大)。

一、地图选择器

(一)数据接口介绍。地图选择器的网页为(http://datav.aliyun.com/tools/atlas/#&lat=33.521903996156105&lng=104.29849999999999&zoom=4),这个接口是“麻辣GIS”公众号一篇推文中看到的。这个接口非常友好,可以查询全国县级以上的行政区划,可以同时查询两级的行政区划,并提供三种文件下载格式(geojson、svg和excel),见图1。

图1 地图选择器接口页面

(二)数据可能来源与坐标系。该接口可以获取2889个县级行政数据(见图2)与高德接口的数据数量一致,因此猜测数据可能来源于高德。

图2 接口获取的县级行政区数据与高德矢量图叠加效果

将获取的数据叠加到高德矢量(GCJ02坐标)上,两者能完美的叠加(见图3),而与天地图(CGCS2000坐标)进行叠加会产生偏移(见图4),因此猜测坐标系应为GCJ02坐标(加密的WGS84)。在实际使用前需进行纠偏处理。

图3 与高德矢量地图叠加效果(局部放大)

图4 与天地图矢量地图叠加效果(局部放大)

(三)数据质量。对比国家统计局网站上(http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/index.html)获取的截止2019年10月的全国县级行政区数量(3000个,不含台港澳)少了111个,接口数据包含港台地区的数据,因此,差异的数量应该更大,这可能是统计的行政代码包含很多工业园区和经济开发区,而这些又不是传统行政区划的地域范围;通过数据对比两者有2780个数据的行政区划代码是一致的。总体数据质量较好,不影响本次使用。

(四)数据获取思路。

1.数据接口形式。这个接口提供了两个数据接口,一个是指能下载查询范围级别的行政区划边界(如,https://geo.datav.aliyun.com/areas/bound/100000.json,可还回中国行政区划边界),另一个接口则包含下一级(子区域)的行政区划边界(如,https://geo.datav.aliyun.com/areas/bound/100000_full.json,可还回查询中国行政区划边界及各省一级的行政边界),显然第二个接口是我们需要的。接口只需要一个参数即行政区划代码,见图5。

图5 数据接口参数

2.数据内容分析。图6是调用第二个(https://geo.datav.aliyun.com/areas/bound/100000_full.json)获得的数据,数据内容处理地理坐标范围("geometry"),还有行政区划代码、名称、中心坐标、行政区级别等数据,数据中含有用于进一步数据获取的参数:行政区划代码,也就是说只要给个起始入口就可以获取全量数据了。

图6 接口提供的数据内容

3.FME建模思路。1、以查询中国行政区划(含子域)获取,中国行政区划范围及各省级的行政区划范围及相关信息;2、以省级行政区划代码为参数获取市级行政区划;3以市级行政区划代码为参数获取县级行政区划(本记录不介绍)。流程很简单(见图7),但还是有需要注意的,在FME流程介绍时再说明。

图7 地图选择器全量数据获取流程

(五)模板分步骤介绍。

1、省级行政区的获取及行政区代码提取

这一共用到五个转转换器(其中3个为辅助使用),第一个“Creator”创建流程的起点,第二个“HTTPCaller”用于获取行政区geojson数据,第四个“AttributeManager”提取的省级行政区的“name”与“adcode”重命名(也可用“BulkAttributeRenamer”代替,FME做同样工作有太多的选择了,就看个人习惯)并删除无用的属性。接下来介绍其余两个转换器,“JSONFragmenter”转换器这次的参数设置与解析“json”数据不同,(接下来的表述基于个人理解的非专业术语描述,如有错误请斧正)如图8所示,“Fragmet as Format”有三个选项“JSON” “GEOJSON”和“ESRIJSON”,这次选用“GEOJSON”,按照json格式的要在“Attribute to Expose”选项中直接暴露出“adcode”“name”等字段,“JSON Query”应填入“json["features"][*]["properties"]”,但这样设置转换器将无法输出正确的结果,这是因为由于存储空间信息的经纬度数据集的“geometry”与存储属性信息的“properties”属于同一层级(同一父集),选择“GEOJSON”转换器无法将数据识别为地理数据,就的不到正确的结果。那“JSON Query”和“Attribute to Expose”需如何设置呢?一种是按照图2所示的手动设置“JSON Query”设置成“json["features"][*]”这可以保证存储地理数据的“geometry”的完整性,手动将需要的属性暴露出来;第二种就更简单,将第一种设置中的“JSON Query”改为“json”,其余的不变。这样省级行政区已经提取完成了,可以保存输出,图9。

图8 “JSONFragmenter”的第一种设置

图9 省级行政区提取结果

图10 市级行政区提取结果

现在接着介绍“Tester”转换器,这个转换器主要是为市级行政区的提取做准备。这就需要简单介绍下我国的省市级行政区划体系,我国各个省一般下辖地市、地市下辖区县,但直辖市港澳台下辖为区县级行政区(同时还有部分省级行政区设有省管县,如湖北省的潜江市,但这一部分不影响地市数据的提取工作),直辖市可以理解为有国家直管的地级市(这些都纯粹个人基于行政区空间范围上的理解,肯定有不正确的地方)。因此需要将直辖市港澳台单独过滤出来,否者这提取地市行政区就可能出错。“Tester”参数设置见图11,说了这么多其实这个转换器可以不要的!

图11 “Tester”参数设置参考

2、市级行政区的获取及参数提取

这步共需要用到4个转换器(不含写文件转换器),“HTTPCaller”“JSONFragmenter”与省级行政区提取流程的设置相同,就不再介绍。接在“JSONFragmenter”后面的“Tester”是将省级行政区与市级行政区进行分离【这是由于用省级行政代码进行含子区域查询,将获得两级的行政区边界,详见一(一)】,第一个“Tester”设置见图12。

图12 第一个“Tester”参数设置

第二个“Tester”的作用是将第一个“Tester”分离出的省级行政区中将直辖市和十段线(九段线)与其他省级行政区划进行分离,参数设置见图13。接着将两个“Tester”的“Passed”输出端口与写文件转换器连接到(为了模板整洁增加了个“Connection Junction”转化器)文件写模块,文件格式选择“EsriShapefile”,坐标系统选择“LL-WGS84”,其余参数就不再介绍,市级行政区划结果见图14。县级行政区的下载跟市级行政区相似就不再展开。

图13 第二个“Tester”参数设置

图14 市级行政区划数据

二、高德行政区域查询API

(一)数据接口介绍。高德行政区查询接口(API文档:https://lbs.amap.com/api/webservice/guide/api/district)https://restapi.amap.com/v3/config/district?keywords=北京&subdistrict=2&key=<用户的key>&extensions=all&output=JSON,共需要4个以上的参数,有两个是必填的:

  • Key:用户在高德地图官网申请Web服务API类型KEY,这是必填的,否则无法使用。

  • keywords:这也是必填项,只支持单个关键词词搜索关键词支持,行政区名称、citycode、adcode,由于只支持单个关键词因此无法进行批量获取(使用一次key只能获取一个行政区的边界)。

  • subdistrict:设置显示下级行政区级数(行政区级别包括:国家、省/直辖市、市、区/县、乡镇/街道多级数据);0,不返回下级行政区;1,返回下一级行政区;2,返回下两级行政区;3,返回下三级行政区。这次要查询的是市一级行政区划,因此本记录中默认为2。(需要在此特殊说明,目前部分城市和省直辖县因为没有区县的概念,故在市级下方直接显示街道。例如:广东-东莞、海南-文昌市)

  • extensions:此项控制行政区信息中返回行政区边界坐标点;可选值:base、all;base:不返回行政区边界坐标点;all:只返回当前查询district的边界值,不返回子节点的边界值;目前不能返回乡镇/街道级别的边界值。由于需要获取行政边界,因此填“all”,同时要注意的是下一级的数据(子级行政区)不还回行政边界。

接口的参数介绍见图15,还回数据结构见图16。

图15 接口的参数介绍

图16 还回数据结构

(二)获取思路。1、由于这次需要获取到市一级的行政边界数据,因此以中国(100000)作为关键词(keyword),子级行政区(subdistrict)设置为2,即可以获取所有市级行政区的名称;2以市级行政区名称/adcode为关键词获取行政边界的json数据;3对json数据进行解析,构建行政边界并保存。

(三)FME模板流程分布介绍。模板流程图见图17,内建的自定义转换器流程见图18。

图17 高德省市县行政区边界接乡镇点获取流程图

图18 模板内建自定义转换器流程图

1、起始url的构建与属性数据解析。根据上面介绍这里构建了国界url,“keyword=中国”(也可以为:keyword=100000)“subdistrict=3”(这可以一次性解析到县一级的属性参数)。这一共用到四个转换器,一是“Creator”创建流程的起点;二是将“中国”两个汉字转码成URL(Percent Encoding)编码,防止出错(用100000和拼音就无需转码);三是“HTTPCaller”获取json数据,url见图19;四是“JSONFragmenter”将各级行政区属性值及国界数据进行暴露,参数设置见图20。

图19 url参数示意图

图20 “JSONFragmenter”参数设置

2、各级行政区属性的暴露。将省市县三级行政区的属性暴露出来用了三个“ListExploder”,图20中可见各级行政区的属性都保存在“districts”中并且属性名都是一样的,因此在属性暴露参数不能采用默认,否则最后一次暴露出的属性会代替将前一次暴露出来的属性。“ListExploder”进行省级属性暴露设置见图21,“Accumulation Mode”选择“Prefix List Attributes”(列表属性添加前缀),“Prefix”填“P_”(province的缩写),这样暴露出来的属性名就会全部添加了“P_”(相当于“BulkAttributeRenamer”添加前缀的功能);其他两个“ListExploder”也进行相似的设置。

图21 “ListExploder”进行省级属性暴露设置时的参数设置

其他需要注意的是,市级属性暴露时由于台湾省高德没有下一级的行政区边界,会从“Rejected”端口输出,而导致转换失败,这只需之后面增加任意一个转换器,或是在“Workspace Paraters”中将的“Rejected FeatureHandling”改为“Continue Translation”,见图22;县级行政区属性暴露时“Rejected”端输出的数据也是县级行政区,“Elements”端输出的数据由县级行政区数据也有街道数据(为下设县的市、省管县等)因此需要将两者分开,这就用“Tester”设置见图23。

图22 “Workspace Paraters”参数设置

图23 “Tester”参数设置

3、自定义转换器流程介绍。自定义转换器主要作用是将国界解析出的“polyline”构建成面,及将解析各级行政区的数据并构建成面。这个转化器共设置了3个发布参数:一是“polyline”用于获取国界的多边形数据,二是“key”用于接收高德的key,三是“name”用于接收“keyword”(因此这个自定义转换器是个完整功能的高德行政区下载器,可以直接导出使用;本文主要是为了一次性获取国省市县四级行政边界及乡镇街的点位而写的较为啰嗦)。

“ParameterFetcher”获取自定义参数,“TextEncoder”将关键词转码(保证输入中文时,不会出错),“HTTPCaller”的url参数将“subdistrict”设为“1”(这是为了获取乡镇街级的点位数据,要是到处是自定义转换器建议,这个参数也建个发布参数),“JSONFragmenter”的设置见图24,解析出下级districts数据是主要是为了获取乡镇街级的点数据。

图24 “JSONFragmenter”参数设置

“当一个行政区范围,由完全分隔两块或者多块的地块组成,每块地的polyline坐标串以‘|’分隔”,构建行政区的第一步是将多个面拆分,然后将每个面的“polyline”坐标串拆分成坐标点(以‘;’进行分割),接着将坐标点的经纬度拆分成两个独立的属性用于构建矢量点(以‘,’进行分割),最后将点按顺序连接。

第一个“AttributeSplitter”对由多个地块组成的行政区拆分(见图25),接着用“ListExploder”将其暴露成多条数据,第二组“AttributeSplitter” “ListExploder”作用相似。

图25 第一个“AttributeSplitter”属性设置

“LineBuilder”构建面时的“ConnectionBreak Attributes”,选择“adcode”及“_element_index2”(有多个地块组成的行政区分割时产生的顺序号),参数设置见图26。

图26 “LineBuilder”参数设置

这样整个模板基本完成,这主界面点击自定义转换器“CTRL+D”拷贝多份,连接到各个“ListExploder”后面,并对参数进行设置就可以了;在获取县级行政区边界的自定义转换器后面连接“ListExploder”即可以获取乡镇街道的点位数据了。如果在增加一个发布参数和几个“TestFilter”就可以做到按需下载各级行政区边界数据或乡镇街的点数据了,封装成自定义转换器的工作就不介绍。

这两种获取行政区的方法各有优缺点,第一种方法快速(geojson格式的优点)高效,但时效性无法保证;第二种方法时效性好,但好费时间,同时还得有高德的key。

行政编码json_基于FME国内县级及以上网络公开行政区划边界的获取相关推荐

  1. 2020FME博客大赛——基于FME的天地图·浙江融合数据质检程序的设计与应用

    作者:闻达 单位:浙江省测绘科学技术研究院 摘 要:基于FME技术,根据天地图·浙江融合设计要求,并结合天地图日常运维工作,建立一套严格的质检规则,用于检查天地图数据是否符合标准.对数据进行逻辑一致性 ...

  2. 基于FME的地形图图面压盖检查工具的设计与制作

    基于FME的地形图图面压盖检查工具的设计与制作 程丽萍 (1,2.昆明市测绘研究院,云南 昆明650051) The Design and Implementation of  FME-based T ...

  3. 2019FME博客大赛——基于 FME 求算最佳租房方案

    参赛单元:互联网.大数据及云计算 作者:黄文强 单位:成都润成信息技术有限公司 摘要 本文基于FME实现了最佳租房的求算.首先抓取了租房网站上房源的信息,再根据房源所在的公寓的名称或详细地址利用百度地 ...

  4. 基于FME的水库功能分区生态红线批量处理方案(从文本到gdb)

    作者:凡江林   QQ:564438737  项目背景 2017年7月,环境保护部办公厅.发展改革委办公厅共同印发<生态保护红线划定指南>(环办生态[2017]48号). (1)问题描述 ...

  5. MYSQL 全国省市区源数据,行政编码

    CREATE TABLE `t_d_areainfo` (   `id` int(11) NOT NULL,   `name` varchar(48) NOT NULL DEFAULT '' COMM ...

  6. 2020FME博客大赛——基于FME的地理国情监测 全集水网检查与入库

    作者:陈兴波 单位:宁夏回族自治区测绘地理信息院 摘要 本文针对2019年基础性地理国情监测全集水网数据更新工作,利用FME软件设计了关于数据质量检查及入库的方法,实现了全集水网数据快速检查和水体实体 ...

  7. 基于FME和ARCGIS的福州市辖区城镇土地调查建库技术研究

    作者:福州市勘测院  白 昕 摘要:在GIS技术迅速发展的今天,GIS软件及二次开发平台,在具体使用过程中,不足以兼容工作人员现有熟练技术,并不能灵活解决实际作业过程中遇到的各种问题.ARCGIS方便 ...

  8. 2021FME博客大赛 —— 基于FME的电子地图道路面快速构建方法研究

    作者:吴国华 随着基础测绘成果应用的不断推广,电子地图数据的快速生产与更新的需求成为近年来备受关注的热点问题.道路面作为电子地图中主要地物要素有着举足轻重的作用,针对电子地图中道路面生产和更新的应用需 ...

  9. 2019FME博客大赛——【零编码】利用FME实现城市高德路况抓取及增量更新——以深圳为例

    参赛单元:互联网.大数据及云计算 作者:杨忠智 单位:平安国际智慧城市科技股份有限公司 前言 继续我的[零编码]系列. 简单是美.虽为"码农",但本身还是个GISer,所以在进行数 ...

最新文章

  1. python3运行报错:TypeError: Object of type ‘type‘ is not JSON serializable解决方法(详细)
  2. NET框架下如何使用PaddleOCRSharp
  3. python sqllite远程_Python实现Sqlite将字段当做索引进行查询的方法
  4. ORACLE JOB 失败 查看,Oracle JOB异常中断原因分析
  5. 服务应用监控健康检测
  6. python 穷举法 算24点(史上最简短代码)
  7. java同步和异步概念
  8. Java:使用Java调用打印机进行打印(JPG、PDF和Word三种文件格式)实现
  9. 关于华为P9手机的解锁、刷Recovery、获取Root、安装Busybox,以及升级降级的全过程(和一些错误的解决方法)
  10. 面试时被问有没有别家offer,回答没有,面试总是挂!回答有,就说我是面试选手,欺骗公司!...
  11. teamviewer检测到商业用途的解决办法(win7 win8 win10亲测) 修改teamviewerID
  12. python量化实战 顾比倒数线_龙腾四海:顾比倒数线+顾比均线
  13. 严蔚敏数据结构源码及习题解析
  14. DICOM:基于fo-dicom的简易DICOM Viewer
  15. oracle11g数据库导入导出
  16. win7打印机共享出现0x000006d9错误的解决方法
  17. 广西省谷歌卫星地图下载
  18. 在M1上安装Rosetta
  19. 记录学习Android基础的心得00
  20. python统计中文字符数量_Python实现统计文本文件字数的方法

热门文章

  1. SQL实战篇:SQL窗口函数及真题
  2. Elasticsearch新增一个字段并赋值
  3. idea将maven项目打包成war包的方式,以及使用war包
  4. 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
  5. 数据湖之iceberg系列(三)iceberg快速入门
  6. 广告点击率常用模型的优点和缺点
  7. 推荐系统遇上深度学习(二十)-贝叶斯个性化排序算法原理及实战
  8. [VSTO系列]三、简单的UI设计/QQ联系人导出(下)
  9. Restorator V2009 单文件版
  10. 雅虎对提升网站性能的最佳实践(英文)