参赛单元:传统GIS数据处理
自2017年毕业以来,接触了很多国土行业的东西,最令我头痛的问题还是把国土用地报备坐标表(下文简称“坐标表”)转换成shp格式的矢量。如何快速且准确的进行批量转换,这是目前很多这个行业的公司有待解决的一个问题。
2018年11月,我有幸参加了安图世纪公司的FME培训,这时候才开始接触FME,经过3天各老师对FME的详细讲解,我被FME的强大功能及魅力深深吸引。回去就开始换各种尝试,前不久,终于用FME做出了全新的坐标表(excel或txt)转shp格式的流程,仅5分钟就处理好了长期累计下来的3000多张excel表。甚是兴奋,现在趁此机会把自己的成果分享给大家,希望对大家有帮助!
要解决这个问题,首先我们要分析数据的格式,国土用地报备坐标无论是excel格式还是txt格式都是有特定格式的。
如图2.1所示,前4行或前7行是坐标表的基本属性,后一行就是地块的基本描述(包括界址点个数,面积,部件个数,地块编号,类型,分幅号,用途或项目名称),每一个的地块具体描述属性就是从这行开始,随后第一列是界址点的序号,第二列是地块部件唯一值,第三列是Y坐标,第四列是X坐标。
每个面都是以界址点初始序号开始,然后以初始序号结束,这样就构成了一个多边形的坐标序。
图2.1
如图2.2所示,与excel格式类似,前4行或前7行是坐标表的基本属性,后一行就是地块的基本属性(包括界址点个数,面积,部件个数,地块编号,类型,分幅号,用途或项目名称),每一个的地块具体描述属性就是从这行开始,随后第一列是界址点的序号,第二列是地块部件唯一值,第三列是Y坐标,第四列是X坐标。
同样,每个面都是以界址点初始序号开始,然后以初始序号结束,这样就构成了一个多边形的坐标序。
图2.2
如图3.1所示,此次利用FME解决问题的思路是和我之前利用Python编程处理的思路一样。先将excel或txt转换成点,根据点集转换成面,利用生成的面抠出多余的面,最后投影到正确坐标系。
图3.1
根据图3.1总体思路流程图,我利用FME制作了进行excel转面的处理流程如下图4.1。第一步先用AttributeManager转换器对excel中的内容进行过滤,处理成可以转点正确的格式,然后利用VertexCreator转换器将坐标转换成点,再用LineBuilder转换器把点转面,再利用AreaBuider把生成的多余面剔除,其实这一步就已经完成了转换工作,为了数据的规范,又用了AttributeManager、TestFileter和Reprojector转换器给shp加了正确的投影和所需的字段并赋值。
图4.1 excel转shp流程图
先来看看处理效果,如下就是用来测试excel数据。
这里我们用output文件夹来放转换出来的结果。处理前文件为空白的。
(注明,目标文件选择为输出目录output;源文件是需要转换的excel,ctrl+A全选我们的excel就行了;读取要素类为我们每个表的Book1(即每个小的sheet))
点击确定即运行。处理的结果是按3度分带带号来整理成文件夹,34代表34度带的地块,以此类推。
可以看到所有的excel都成功转换成了我们想的shp格式,为检验是否是我们想要的效果,我们将转换前后的数据再做个对比(以《泸县2018年第3批城市建设用地 (泸县2018年第3批城市建设用地)》的excel转换来展示),如下。
转换前打开表格,这里我们可以看到这个坐标表中有5个地块的属性,所以转换后会有5个地块才算成功。
转换后视图1中有五个蓝色的地块,下面属性表中还有“地块编号”、“项目名称”的字段,转换是成功的。
在4.1中我们看到了处理过程,最后得到效果也是相当不错的,下面介绍一下几个关键的转换器。
AttributeManager是我们经常用来创建属性、重命名属性、重新计算属性、属性排序等有很多属性操作的功能。虽然说这个转换器很普通,但是整个流程的关键都是在这个转换器上,这也是我把放在最后讲的原因。
在这个流程中,第一AttributeManager起了很大的作用,它把excel内容的格式调整成了LineBuilder能识别的样子,即同一个面具有相同的“_属性描述_”,同一个面的同一个部件具有同一个“B”,LineBuilder能根据选择的“连接打断的属性”参数按相同属性构成多边形。这也是为什么选了“_属性描述_”(即第一列)和“B”(即第二列)作为LineBuilder的参数“连接打断的属性”后能成功转换出面原因。
下面是AttributeManager转换器参数设置。
如下图:首先打开高级设置,需要获取前一个属性和后一个属性。
第二步进行“_属性描述_”和“B”属性值计算。
(一)“_属性描述_”计算,参数条件定义如下:
只要有逗号就让“_属性描述_”值就不变,如果没有逗号让当前行的值等于前一行的值。这样就可以保证每个面都以自己“地块描述”当“_属性描述_”的值了。
(二)“B”计算,参数条件定义如下:只要为空就和下一个相同。这样是为了处理第一个“_属性描述_”的问题。
以泸县2018年第3批城市建设用地 (泸县2018年第3批城市建设用地).xls为例。
先看看直接在Data inspector打开看下表中内容的格式,如下:
经过处理后的结果如下:地块一的“_属性描述_”属性都是“35,4.3234,1,地…”,“B”属性都是“1”;地块二的“_属性描述_”属性都是“15,3.2460,1,地…”,“B”属性都是“1”;地块三的“_属性描述_”属性都是“120,21.9629,1…”,“B”属性都是“1”。
这个转换器,官方解释是附加坐标到空的、点、文本、直线和电弧几何或用点几何代替现有几何。意思就是可以把我们的坐标值转换成点要素。
在对应参数中把相应的X值和Y值填好就可以了,这里X值是D列,Y值是C列。
利用VertexCreator转换出来的点如下。
它可以把输入的点要素按其输入的顺序连接起来,构成线要素或多边形要素。
难点解析:我们的每个excel中不只描述的是一个面,而是很多个单独面的信息,LineBuilder可以把点转换成线或面,我们怎么控制它转换成我们想要的单独的面呢?我们这儿设置了一个特别重要的参数“连接打断的属性”,这也是整个流程的关键,我们把“_属性描述_”(即第一列)和“B”(即第二列)作为这个属性便可以实现这一效果。
看下用LineBuilder的效果,点已经构成了面。
它可以获取一系列拓扑上连接的线,当线形成首尾闭合时创建拓扑正确的多边形要素。
难点解析:看了LineBuilder转换的结果,有人会问为什么会用AreaBuilder,而且流程上有个处理空洞或者是处理多余的面是什么意思?下面对比一下用AreaBuilder前后转换的区别。
以成都市地铁5号线一、二期工程(成都市地铁5号线一、二期工程).xls为例。
好了,看到了AreaBuilder的用处,有人会问我是怎么知道中间的面是多余的,这个在后面转换器讲。这才是我们想要的shp成果,现在看下转换器中参数是怎么设置的,如下:
把创建环勾上,再把丢弃洞选为“是”,这样就可以抠出中间的多余面了。
Txt转面的流程和excel转面的流程唯一的区别就是AttributeSplitter转换器把txt的每一行用“,”隔开,然后其他处理大致相似,且主要转换器也基本相同,用法也相同。只要理解LineBuilder转换器是如何把一系列点集转成面的关键就可以写出来了,就不多讲了,如果有问题可以联系我[email protected],这里展示下FME的流程图和效果图,如下:
运行。
原始数据。
转换后。
自去年十一月份参加成都FME的培训以来,我后悔没有早点接触到FME。FME真的是太强大、太方便了,节约了我很多的时间和精力,特别是在数据过滤和数据批量处理方面。现在基本上一涉及到这方面的数据时,首先想到的是FME而不是Arcgis,然后写出一个流程来解决这个问题,这种感觉就像以前读书的时候解决了一个数学难题一样的激动。
现在我的FME水平正处于小白阶段,在做流程过程中也遇到了很多问题,这些问题都来自对FME的不够熟悉,我也必将继续学习,非常期待下一次FME的进阶培训。