用FME创造大量随机位置的测试数据

因为在国内测绘数据属于保密数据,我们做项目的时候很多时候只能拿到很小很小的一部分测试数据,有时候这部分测试数据都不是真实数据而是造的假数据。因为造数据实际上挺费事的,所以通常这个数据不会太多,可能就几十条上百条了不起,有的甚至就几条。然而真实世界的地理数据通常是几万条几十万条几百万条的。也许处理几十条数据的系统和处理几千条数据的系统不会有啥区别,但是处理几十条数据的系统和处理几十万条数据的系统的差别绝对是巨大的。以我上一篇博文为例,看起来可以在几百几千条数据上运行的代码,在几十万条数据上运行就需要十几分钟甚至可能导致系统卡死,因此造出大量的测试数据就很有必要。

无论如何对于程序员来说,通过代码来造大量的测试数据总是第一选择,但这并不是最快的选择,在GIS领域有一个数据处理神器——FME,当然也是说FME只能处理GIS数据,以我使用的经验来看,只要是结构化数据他处理起来都还挺好用的。

言归正传,来聊怎么用FME造大量测试数据。FME是什么怎么用我就不废话了,官方有中文文档,总的来说一个典型的FME工程是包括一个数据读取器,一个数据写入器,中间通过各种数据转换器连接起来,把数据搓圆捏扁。我们创造大量测试数据,就是以最开始小批量测试数据为基础,对数据进行循环赋值,再对复制之后的数据进行位置和属性的变换,就可以了。

但是我们在FME转换器里搜索一下,发现是没有复制要素这个转换器的,这里就有了第一个技巧,如下图,我分了两条线,第一条是直接输出,第二条我先创建一个属性,然后移除一个属性,等于啥都没干,但因为走了两条线,就是双份输出,等于是复制了。

复制

第二个就是自定义循环转换器了,通常一个自定义的,带循环的转换器是如下图结构的,循环器是必须的,他可以指定循环到哪个输入器,所以Loop实际上是一个输入器,只不过一般把他的属性设置为不发布,处理过的数据要从哪里开始循环,就把这个输入器连到哪里。Tester转换器也是必须的,他需要判定符合什么调教的时候循环,符合什么条件的时候输出,否则就成了死循环了。

自定义循环转换器

第三个就是发布参数了,自定义转换器完成之后发布参数就可以成为自定义转换器的可以修改的参数,比如咱们使用复制的方式创造大量测试数据,复制多少份,就可以用发布参数来设置。

最后,贴上自己的创造随机位置测试数据的自定义转换器RandomCopy,进来先创造一个LoopCount属性来标记循环了多少次,每次循环之后+1,两个RandomNumberGenerator分别创造随机平移的X值和Y值,Offsetter对对象平移,Tester判定LoopCount是否小于要复制的份数,小于的话继续循环,否则输出。

RandomCopy

加载评论框需要翻墙