作者:活力贝贝
第二期兴趣班从3月13日开始,至3月20日截至,一周时间内,14人提交了17份模板。首先感谢大家在繁忙的工作中参与这项活动,有了大家的参与,相信兴趣班会越办越好。这一期的任务小结,是我主动向欣欣班长申请的,一是这项工作需要大家共同参与,二来嘛,本人对国土系统工作及这期任务涉及的格式相对比较熟悉。
各人对于同一件事情,理解不尽相同,小结里面观点仅仅为我本人对于该件事情的理解,说得不一定对,如有错误,欢迎大家批评指正。这也是本人第一次做小结,不到之处,敬请谅解。
一、 本次任务难点
这一期的任务是根据“勘测定界界址点坐标交换格式(TXT文件)”,将界址点坐标生成面,并将其地块属性数据增加到相应的字段中,最终写入SHP文件并设置相应投影系。具体应该怎么做呢?简单说就像大象放冰箱,FME分为三步,第一步读取读模块;二、设置转换器;三、写入写模块,呵呵,开个玩笑啦,事情没有想象的那么简单。这一期的难度,个人认为并不简单。依据文本文件里的坐标生成点、线、面,然后扣除岛难度不太大,本期主要的难点在于如何将地块的属性行数据挂接到该地块的坐标行。从数据格式上可以看出,在同一个文本文件中,一行地块属性行后面,跟着若干坐标行数据。这与大家平时处理的数据格式不太一样吧,如果是刚刚接触FME的新手,更不知从何处下手。那就一起来看看提交作业的同学是如何处理的吧。
二、 模版性能测试汇总表格(图片不清晰,可点击下方链接下载原文)
由于原测试数据只有3个地块,数据行也不多,对于数据性能不能很好地比较,测试时,我将测试文件地块增加到331个,数据2715行。具体统计详见下表:
插播:为了公平起见,活力贝贝做的两个模板是根据他的评分标准由欣欣打分的。
三、 数据处理方案比较
从上表可以看出,数据方案以属性挂接方案来命名的,本次模版的核心就是属性的挂接,属性挂接方案选得合理,模版运行效率就会比较高。数据处理方案有如下几种:AttributeCreator多要素属性赋值、Python代码读取、变量传递属性、变量发布+属性合并、空间挂接、批处理切分属性后生成多文件再读入、列表循环。由于Python、批处理及循环对于新手难以理解,下面主要汇总变量直接赋值、变量创造合并条件赋值及利用AttributeCreator多要素属性赋值。
1、 变量直接赋值
变量直接赋值是在读取属性行数据时使用VariableSetter转换器将属性行数据发布全局变量中,随后在读取该地块的坐标行数据时,使用VariableRetriever转换器将变量取回到属性值。该方法在163博客中也有介绍,本次有几份作业也采用了这种模式,但有个方面需要提醒初学者注意一下,使用全局变量传递属性和我们平时网上传送文件是一样的道理,文件多的时候,我们会将文件做成一个压缩包,收到方的解压缩后,与压缩前没有区别,这样做不止是为了方便传送和接收,也防止出现数据丢失。那么我们在做属性值传递的时候,特别是涉及到内存、地址的相关操作时,尽量合并属性传递,尽可能减少VariableSetter转换器,一是减少内存开销,二是降低出错的概率。
2、 变量创造合并条件后使用Featuremerge合并属性
变量创造合并条件后使用Featuremerge合并属性与变量直接赋值的区别在于,本方法使用时,只传递一个关键值属性给坐标行数据,例如传递一个地块编号给该地块的坐标行,后期依据地块编号可以使用Featuremerge转换器将属性行属性与坐标点或面数据进行属性关联,这也是Fme处理数据的常用方法,即“有条件时直接使用转换器,没有条件时,创造条件使用转换器”,本来属性行数据与坐标行数据并不能直接用Featuremerge转换器进行属性合并,这种情况下,使用其他方式,先创造对应关系再使用合并就能将属性值顺利传送过来了。
3、 AttributeCreator多要素属性赋值
AttributeCreator多要素功能应该是在2013版本时推出的新功能吧, AttributeCreator转换器功能很多,除了能调取前(后)一要素属性外,依据条件赋值、四则运算、属性合并连接等,他都能胜任,建议大家对这个转换器多多掌握,Fme10分钟专门针对这个转换器做了两期节目,可见这个转换器的重要性。AttributeCreator多要素属性赋值,类似于C,C++的指针,使用时十分方便,以本次任务为例,勾选启用多要素后,可以将Feature(-1)的值,也就是上一行的属性值,赋值给本行,例如上一行是属性行,本行为坐标行,那么调用Feature(-1)的相关字段,就可以在当前记录为坐标行行时,将属性行数据赋值给坐标行,依次类推,当前数据为第二行坐标时,能将第一行坐标从属性行得到的属性值传递到第二行。这样就能顺利的将属性行数据像接力棒似的传送到最后一行坐标。
从执行效率上来看,木头狼及太阳の指纹利用Python代码读取文件的方法,耗时最短,效率最高,但对使用者的要求也更高一些。利用全局变量直接对坐标行赋值、利用变量创造合并条件后使用Featuremerge合并属性及AttributeCreator多要素属性赋值三种方法效率差不多,使用空间关系挂接属性及通过循环判断行列等方法效率略低一些。千浪的使用批处理分割TXT文件后再读取生成图形的方法,由于调用SystemCall转换器前使用了延时,时间上会长一些。阿峰的双循环依据行号判断坐标所处地块挂接属性,耗时较长,经过分析日志发现,该模版中使用的ListBuilder转换器对2715个数据行创建一个列表,耗时达到17秒左右,明细如下:
2015-03-24 10:19:01| 0.6| 0.0|STATS |Tester_PASSED Feature Counter -1 12(TeeFactory): Cloned 2715 input feature(s) into 2715 output feature(s)
2015-03-24 10:19:01| 0.6| 0.0|STATS |ListBuilder_fme_type_remover(TeeFactory): Cloned 2715 input feature(s) into 2715 output feature(s)
2015-03-24 10:19:05| 4.6| 4.1|INFORM|Overlaying areas on areas
2015-03-24 10:19:19| 17.9| 13.2|STATS |ListBuilder(ListFactory): Combined 2715 input feature(s) into 1 output feature(s), including 0 singleton(s)
2015-03-24 10:19:19| 18.0| 0.2|STATS |ListBuilder_OUTPUT Feature Counter -1 9(TeeFactory): Cloned 1 input feature(s) into 1 output feature(s)
2015-03-24 10:19:19| 18.0| 0.0|STATS |loop Input Input Collector(TeeFactory): Cloned 1 input feature(s) into 1 output feature(s)
由此可见,ListBuilder转换器对于性能影响不小,建议以后在大数据量使用时要注意一下。由于本次测试使用的机器较老,I5 M560 CPU,2G内存的笔记本,测试结果与现在主流机型测试结果肯定是有区别的,模版运行所耗时间仅供参考。
四、 关于读模块
勘测定界格式文件为纯文本格式,文本类常用的读模块分为两种,一种是Csv格式,逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),一种是Text_Line,即按行读取文本,两种读模块都可以用来读取Txt文件,设置参数也有相同的几个参数,例如本次任务,由于前面11行为描述性数据,因此可以设置从第12行读取。
Csv格式相对来说比Text_Line功能更多一些,我本人的两个方案的读模块都是采用Csv格式读取,设置跳过11行的文件头,取消选择字段名,设置以“,”分割数据,这样从读模块里出来的数据就已经是分好列的数据。
五、 扩展应用
小结到此结束,话题还在继续,勘测定界格式在土地部门用得比较多,不仅是建设用地报批时需要此项数据,涉及到卫片监测或是其他事项的时候,也会用到此类数据,那么怎么使用才是最方便的呢?一起来看看我是如何运用的吧:
没错,我创建了一个自定义格式,这样读取是不是更方便了呢?其实做法很简单,打开你的模版,点击文件(File)>导出自定义格式(Export As Custom Format),然后输入格式名称和描述,点击OK,就搞定了。下次使用时,不需要再打开模版,选择文件再运行转换了,直接在格式中输入“KCDJ”就可以读入文本文件并自动转换成多边形。
同时该格式也可以直接扩展到Arcgis下使用,当然前提是必须先将Fme扩展到Arcgis,然后在Arcgis导航栏Fme Connections下点击Add FME Connection,然后选择勘测定界格式文本文件,就能直接将坐标转换成图形并添加至当前窗口,也可以直接调用Arcgis工具箱内的快速导出或导入功能,直接将数据转换到所需要的格式。
六、 结束语
Fme的快捷、方便的功能不仅仅是我所介绍的这些,还有很多实用的功能等待着我们一起去发现,去使用。希望通过模版兴趣班的学习,使大家更加熟练地使用Fme,感谢大家对模板兴趣班的关注,最后借用@努力的和尚哥一句话:爱她,就教会她用Fme,恨她,就教她用Fme,但不要教会。