FME实现三调地类变化流量表制作

 

作者:谢杨

 

今年的三调进行的如火如荼,三调的成果数据做完了之后,相信今后很大的工作就是要想办法将三调的成果数据更好的利用起来。而为了更直观的了解到相较于二调,三调的地类变化情况,三调地类变化流量表的制作就很有必要了。近期我就遇到了这么一个需求。

其实地类流量表的制作并不是很复杂的事情,很多方法都能做,我了解到的方法就有,先在arcgis里面做相交,统计出Excel的各个地类的面积,然后再在Excel里面或者通过VB写的小程序对统计好的Excel进行加工填写到标准的模板表里。而这样的办法有一个缺陷就是需要分几步走,可能会用到好几种软件。那么能不能把所有的步骤都融合到一个软件里面,实现“一步到位”的方法呢?答案当然有,而且可能还有很多,而我作为一个FME的技术支持人员,当然思考的就是如何通过FME来实现这个步骤了。

其实整个的流程很简单,就是三调二调的地类图斑,先相交,然后统计相交后的面积,然后再想办法写入到标准的Excel表里面。大致的流程如下:

 

流程很简单,其实相对困难一点的就是如何想办法将统计得到的数值填入到标准的模板表里面,标准模板表长这样:

 

大致的填写要求是这样的:

 

实现步骤

压盖分析

其实这一步要做的就是要用二调的地类图斑来切割三调的地类图斑,并且对分割后的小图斑不仅要有三调的地类名称还得有二调的地类名称。说到这个功能,在FME里面第一时间想到的就是AreaOnAreaOverlayer这个转换器。于是我进行了测试,为了加快速度,用了64位的FME,由于源数据的两个mdb,事先还先将mdb转换成了gdb,模板是这样的:

 

过了几分钟我的电脑变成了这样的:

 

电脑资源实在是有限,然后进入了漫长的等待...

 

1个小时过去了...

 

2个小时过去了...

 

3个小时过去了...

 

在等待的过程中在arcgis里面尝试了一下,标识工具:

 

测试了之后发现,只需要不到20分钟就能把标识做完,标识后的三调图斑都带了二调地类名称的属性。于是果断放弃了AreaOnAreaOverlayer这个转换器。正好最近学了一点Python的皮毛,决定在FME里面用PythonCaller来调用arcgis的标识工具,调用的方法很简单,arcgis工具箱打开帮助,查看示例代码即可:

 

这样的话我就只需要在某个路径下生成标识后的shp数据,然后再用FeatureReader转换器去读取这个shp数据进行面积统计即可。实现过程如下:

 

由于传给标识模块的参数的输出路径必须是存在的路径,所以代码里用了os模块去检查路径是否存在,如果存在删除掉原有的数据,如果不存在新建一个文件夹。

PS:由于我对Python只是懂点皮毛,在调用arcpy的时候经常遇到传参不对的问题,往往都不知道该如何去找错,后来发现一个很好的办法就是在代码里面把所有要传的参数都print出来,这样一目了然。

统计图斑面积

标识做完了之后,现在要做的就是统计各地类的面积,在FME中AreaCalculator转换器进行面积计算,StatisticsCalculator转换器进行统计。原始的二调的各个地类的面积直接读取二调的mdb进行统计,变化后的面积统计用FeatureReader读取上一步生成的shp文件然后再用AreaCalculator转换器进行面积计算,StatisticsCalculator转换器进行统计。统计二调原始的地类面积:

 

变化后的三调地类面积统计:

二调的地类面积统计后的结果是这样的:

其中DLMC为地类名称字段,_sum字段为该地类对应的面积。变化后的三调图斑统计后的成果为:

其中DLMC为二调的地类名称,DLMC_1为变化后对应的三调地类名称,_sum为对应的面积。

统计的结果得到了,但是现在面临一个问题,在Excel的表格当中,横向为二调的地类名称,竖向为三调的地类名称,那么对于得到的统计信息,我们需要按照表的形式,以二调的地类名称作为字段名称,对应的面积作为值。相当于要将DLMC字段的值生成新的字段名称,FME里面没有可以直接实现的转换器,这个时候又可以用上Python了,把DLMC的值和对应的面积_sum组成一个列表list[],循环去读取list的值生成字段和对应的值,如list[0]为字段名称,list[1]则为该字段对应的值,实现步骤如下:

Pyhoncaller转换器出来的结果如下:

问题又来了,Pyhoncaller生成的属性如果没有在转换器里面设置暴露,那么久并不会出现在属性列表里面,如何批量的暴露字段又成了一个问题,手动一个一个写显得太不智能,于是又想到了一个办法,将模板表读取进来,并且以第10行开始为属性字段名称,读取后的效果如下:

取一条模板的要素和PythonCaller出来的要素进行合并,由于模板的要素有属性表,PythonCaller出来的要素合并后则自动暴露出了相应的属性字段。同样的变化后三调的地类面积也用这样的方式进行,但是可通过xlsx_row_id进行决定填到第几行,而xlsx_row_id可通过读取模板数据的B列与DLMC_1做挂接。所有的数据合并后可用NullAttributeMapper转换器对缺失的字段值进行填0处理。整个的处理步骤如下:

得到的结果如下:

写出数据到Excel模板表

再次查看模板表,发现里面有很多合计的单元格,为了方便起见,直接在模板表里先对合计的单元格填好公式,待其他单元格填入值后合计的值就会自动出现:

通过写模块或者FeatureWriter转换器进行Excel的写出,需要设置的参数有模板文件,以及写入的模式,和开始写的其实行列:

整个模板做完后是这样的:

得到的成果:

总结

通过FME实现了一键式的自动的三调地类流量表制作。其实我也是第一次写出这样的Excel表格,在最终填写的方式的时候纠结了一两天,一直没有找到合适的办法,直到想到了Python。FME并不是万能的,它是数据处理很好的工具,我们不能要求FME能处理任何的数据问题,但是FME有一个很好的点就是它可以通过一些转换器和其他的方法结合起来,比如将FME和Python结合起来,将FME和CAD结合起来通过lisp语句实现一些cad的操作等等。总之,只要你有想法,就能去实现。

 

发布了350 篇原创文章 · 获赞 169 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/97245411