【FME技能】沿三维线生成均匀点

2021-09-08 15:59:58 浏览数 (2)

前言

关于如何把长线拆分成短线,我已经写过好几篇文章了(可以看这次推送发出的下面几篇)。这些写过的文章里,既有沿线生成点的FME方式,也有生成线段的ArcGIS方式。其中FME方式可以沿线生成均匀的节点,通过调整参数,可以实现生成线的功能,也可以实现生成非均匀节点。而ArcGIS方式,可以直接生成线、均匀的、不均匀的都写了,通过调整,也可以实现生成点的功能。

有朋友有个需求:将一段线、按照均匀的距离生成点。但在实际操作中,遇到了一些问题:线段的实际长度,和线段的测量值(measure)是不一样的。经过了解,发现线段是三维的线,有Z值。以往的数次推送中,生成点或者拆分线,针对的都是二维对象,这次增加了一个维度,直接用之前的方法,会有些问题。不过,简单调整下就可以了,至于怎么调,往下看就行!

本文知识点:转换器调参数、拆分三维线!

拆分

如同上面讲过的,怎么调整参数,来满足各种业务需求呢?其实很简单,核心转换器只要调整一个参数就可以了。下面我来介绍一下各个步骤:

计算线长度

按照长度拆分,首先要计算线长度(如果已有长度,此步骤可忽略)。 需要注意的是,在拆分三维线的时候,需要线的三维长度,FME长度计算转换器,默认计算的是二维投影面长度,需要按照如下图中进行参数调整:

传入步长

这里我发布了一个步长参数,可以传入一个数字,来拆分线。

拆分线

拆分线有多种方式,多种模式,在进行拆分的时候可以选择合适自己的那种。针对我们这次的拆分来说,不论选择那种方式,下面截图中的这个参数是都是必须要进行设置的。

那么接下来,真正的拆分还是有很多的方案可以选择的。之前就介绍过循环的方式,本篇推送,我分别使用循环与克隆来进行线的拆分。

循环

在这篇文章中使用了FME自带的循环来进行线的拆分。这次我们来点不一样的,搞个Py循环,直接拆分。 之前的拆分中,使用的是按照比例进行拆分,那么我们如果要按照距离进行拆分的话,就需要进行一个距离到比例的转换。

经过简单的转换,不管是按照长度,还是按照比例,都可以使用同样的方式进行拆分了。

本次推送中使用的Py方式与原生FME循环相比,得到的结果是一样的。但过程更加丝滑了(转换器少了一个)。

拆分前的线段:

使用20的间隔进行拆分,拆分后的线段:

改参数即可变成点:

克隆

相比FME和Py的循环,克隆的方式非常简单。只需要简单配置一下,就可以拆分线。非常容易掌握,所以我着重介绍一下。

克隆个数

首先是拆分个数,应该是总的长度除以拆分长度(步长),然后向上取整(生成点的时候复制的个数要加上1)。

拆分

然后拆分的时候,选择拆分的模式与拆分的起始终止长度(生成点或者线,参数设置略有差别)。

生成线参数:

生成点参数:

拆分后数据

拆分后的线,跟py的结果一样,没有区别。

总结

工作中,只舞一把锤子是不够的。多掌握几个工具,才能轻松应对各种突发情况!

参数

使用FME的时候,开始的时候总会被各种参数搞混,什么转换器参数、模板参数、公有参数、私有参数,总之有很多的参数。我们在做工作的时候,如果不了解这些参数,一直处于一种一知半解的状态,就很难做到灵活的调整参数来满足各种需求。

就像我以前写过怎么把二维的线进行均匀的拆分,那么现在突然来了个拆三维的需求。不做任何调整直接上去就干,那是会出问题的。所以参数这块,要下功夫去学,不管是转换器参数还是别的参数,都要下功夫去学,掌握了才能对各种需求做到游刃有余。

Py那么酷要不要学
是不是非要用py

熟悉我的朋友都知道,我喜欢写点py代码来处理数据,但是不是非写不可呢?其实大多数时候,FME本身都有原生的转换器来做到同样的事情。只是我写顺手了,选择了我熟悉的一种方式而已。

py的效率是不是更高

其实py的效率不怎么高,我们使用的高级语言,效率都不咋地。之所以要用它,是因为它高级,是因为它好用!以本文为例,在以20为步长进行拆分的时候,两种方式都耗时2.1s。当步长调整为0.05时,py循环用了2.7s,FME克隆用了3.4s,差别真的不大。我们使用FME就是因为它高级又好用,至于效率,我觉得够用了。再说,你还差那0.7s

最后,祝大家周末玩的开心!

0 人点赞