原文发布时间:2010-11-16
作者:跑
联系:QQ44295133
有些情况下,我们需要对多边形按一定的规律进行排序编号。以图斑为例,土地行业规范一般要求斑块特征点按照从左到右、自上而下的顺序编排。其又可细分为‘弓’字、‘Z’字两种形式。
此外,多边形特征点习惯上采用外接矩形左上角、重心两种方案。
下面大致描述一下在FME中实现这一功能的思路。首先根据多边形特征点生成外接矩形,按照一定的高度值对这些矩形进行切片,从上到下对这些多边形行排序编号,再通过与特征点的叠加将行号传递给特征点,最后就是依据行号、Xmin坐标的升、降序组合实现唯一编号(Counter转换器)。
考虑到图形按一定属性分组,以及不同比例尺下对应的斑块大小不同,这里将分组字段及切片行高作为独立参数发布。
(一) 提取特征点
可以把特征点选择方案发布到参数区,经Tester后如图。其中上一流程提取的是外接矩形左上角,下一流程提取的是重心点,并且特征点坐标值提取备用。
(二) 外接矩形切片
这里,假定已获取分组字段,随后若干操作都按该字段Group By。
特征点的外接矩形由BoundingBoxAccumulator生成即可。由于切片都是自下而上的,顶行的高度都是余数,因此有必要对该矩形下边界取整。
随后就是按一定的行列值对上述矩形进行切片了,Tiler、2DgridReplacer均可实现。相较而言,后者可以按属性分组切片,此处选择它。其中行高度由参数区指定、列宽度取矩形宽度即可。值得一提的是,Column Width/Row Height的值要求包含Group By里面、或者指定为常量,否则运行报错。
(三) 行编号并将属性传递给特征点
行编号并将属性传递给特征点按切片行序号倒序重新给定行编号,并且通过计算将这些多边形行按奇、偶数分类。这样做是为了实现‘弓’字形——即奇数行从左到右,偶数行从右到左交替编排。
同时,特征点通过与这些多边形行的叠加,传回行号。至此,编号的预备工作结束。
(四)特征点编号及与初始多边形的属性关联
(略)
附:将此操作制作成自定义转换器,如图
『问答与思考』
⑴为什么常选外接矩形左上角作为多边形特征点?
相比重心,这种方案能解决复杂多边形编号顺序问题,更具现实意义。
⑵为什么不直接提取多边形的外接矩形而是提取其特征点的外接矩形进行切片?
这是为了确保顶行的图斑必须按从左到右的顺序。试想,如果切片的外接矩形是针对初始多边形氛围生成的,顶行不一定存在特征点,反过来包含特征点的最高行号未必是奇数。
⑶为什么把切片的高度作为参数发布,而宽度取矩形自宽即可?
这里的编排规律就是逐行对多边形(实质是特征点)排序,行的高度决定了编号变化频率。至宽度,可以任意值,考虑到切片效率,尽可能取最大值、即矩形宽度。
⑷该流程中按Counter Name编号的结果是从切片的最大行号+1开始的。
目前,原因不详。通过一次计算,将该值减去即可。