原文地址:https://blog.safe.com/2016/05/point-cloud-power/
大约6年前,我们把点云作为新成员添加到FME几何类型家族中。从那时起,很多用户就使用FME点云工具处理数据,尤其是LiDAR数据。
最受欢迎的一个应用场景是表面(surface)生成,用于城市场景可视化,植被生长控制,路面质量评价等。我们的用户通常使用传统的形式处理点云数据,达到既定的目的。
点云的典型应用
但其实点云还可以再一些传统的应用场景中发挥重要的作用。
使用点云的优势
为什么我们会考虑把点云用到点云传统的应用范围之外?主要的答案是:当处理海量数据时,点云处理非常高效。
FME如何实现非常高效的点云处理
这里有个示例:如果我们读取超过3,000,000个xyz坐标点记录的文本文件,一个点一个点的读取需要2.5分钟。如果我们使用点云读取相同的文件,只需要不到3秒钟。FMEDataInspector中进行可视化也需要相同的时间。所以我们可以花费5分钟等待数据显示,或者选择立即显示。
使用文本方式和点云方式读取3百万个点的差异
我们如何实现这一点的?FME中的要素转换是基于假设每个要素有它自己的数据结构和几何类型,这对于许多格式类型如CAD或XML来说也如此。这样给FME用户提供了强大的力量,因为我们可以调整转换的最细微的细节。但是,这样需要付出一些代价,那就是转换的速度。
对于点云,我们做了不同的假设——所有点具有相同的组件(即类似于要素属性),且组件的数据类型都相同。这样就使得处理这些点时不是一个一个的处理,而是大块大块的处理,而不用检查它们的数据结构是否存在差异。
灵活的结构
相比其他点云处理的优点,用于处理点云组件的这一优点我把它叫做灵活性。我们可以完全改变点云的显示和几何,执行高级计算,然后恢复点云显示的原始面貌,得到具有新信息的增强点云。
另外有趣的是,FME不要求点云具有所有三个坐标——我们可以把不具有Z值或者Y值,甚至没有任何坐标的点创建为点云。这种情况下,我们得到的是“毫无意义的点云”,这听起来十分荒谬,但是并不意味着它们真的毫无意义,这样只意味它们有超出XYZ的其他组件。我们不能对不存在的几何对象进行可视化,但是在转换过程中可以使用它们,节省存储X,Y,Z的空间。
应用场景
我在下面列出了非传统点云应用的一些场景。它们都是来自客户的需求,而且没有一个要求一定要使用点云技术—我们在转换过程中通常不会考虑变换数据到其他的几何类型。
第一个场景是如何把2维多边形分割为相同的大小。第二个场景是3D分析。后面两个示例是处理栅格——如何对DEM着色,以及如何对任意的栅格进行统计计算。
多边形分割
我不是很清楚客户具体的应用场景,但是这是我第一次尝试用点云来解决非点云的问题。用户需要把多边形分割为几乎相同的面积大小,每个部分的形状不用完全相同。
FME可以从任意几何类型(点、其他点云、栅格、3D实体、表面(surface)甚至多边形和线)中创建点云。能完成如此强大功能的转换器叫做PointCloudCombiner。对于矢量对象,需要指定点的间隔,然后该对象就会被许多等距点替代。
首选,将多边形转为均匀分布的点云
FME还可以使用PointCloudCoercer,把点云按照预设的点数分割为多点类型。考虑到点与点之间的距离相同以及每个多点中的点数相同,我们可以假设从PointCloudCoercer中得到的结果占据几乎相同大小的范围:
然后把点云分割为具有几乎相同大小的多点
那么现在如果我们可以把这些多点转为多边形,我们就得到了解决方案。问题在于,每个多点之间较小有缝隙,因为点要素本身不具备面积的特性。
在把多点转为多边形之前,要消除每个多点之间的缝隙
在我最开始使用2013创建的工作空间中,我使用HullReplacer的到凹包,然后使用许多矢量转换器进行拓扑清洗,包括Generalizer,AnchoredSnapper,CenterlineReplacer等。这也是工作空间中最差的部分——慢,而且输出的矢量质量也不是很好。
当我写这篇文章时,我决定重新评估我的多边形创建的方法,并找到了更简洁的解决办法,这个方法同时也包含了更多的几何类型——我决定对这些多点进行栅格化。栅格单元通常具有大小,如果我们设置栅格大小为点云创建时的距离,我们将填满这些缝隙。
基于分割模式,我们可以得到不同的结果。“Spatial Equal Points Multipoints”(具有相同点的多点)模式生成的面,大小变化较小,“Nested Equal Area Multipoints”(嵌套等面积多点)得到的形状较好。
两种不同模式得到的多边形分割结果
可视域分析
可视域分析是许多GIS包的常见功能。它用来确定从一个明确的点到DEM栅格单元(或DEM栅格单元对于一个明确的点)的可见性。
可视域分析
FME没有专门的转换器执行这个分析。新西兰Oberdries咨询有限公司的Mike 问我关于FME中做可视域分析的可能性,并诱惑我说这是一个“德米特里型”的问题。我对自己透露太多了吗?
在最开始说了“不”之后,我开始思考如何找到这个问题的解决办法。又一次,我决定尝试用点云技术来解决。在几天时间内,我想出了一个主意,并得到了成功实施,还帮我们打破了一些FME的世界纪录——在抓换过程中,我们不得不处理17,000,000,000 各点,花了约24个小时。
Mike的应用场景是与他的数据相关的;在这里我将介绍解决这个问题更通用的方法。
开始前,我们只有栅格DEM和表示观测者位置的点。
可视域分析中的两个输入
我们对每个栅格单元(目标)生成唯一ID,并使用PointCloudCombiner对DEM创建点云,在这个转换器中,每个像素变为一个点,并具有XYZ坐标和单元ID组件。
在下面的步骤中,测量观测者和目标点之间的距离(使用简单的勾股定理-我的算法中没有考虑地球的曲率),用沿着观测者和目标之间3维线的那些点生成可视光线。因此,例如距离是100米,我们决定设置可视光线的点密度应该为5米,那么在观测者和目标之间我们可以得到20个点。
观测者的可视范围,用沿着线的点表达
一旦我们有了所有的点之后,我们使用PointCloudOnRasterComponentSetter将它们与DEM叠加。每个点将得到它所在位置的地面高度。现在我们可以通过比较点与地面高度之间的差异,使用PointCloudFilter把点云分离为两个。如果差异大于或等于0,点高于地面,否则点低于地面。
那么现在,每个点都知道它高于或低于地面,以及属于那条可视线。这意味着从现在开始,在这个点云中,我们不需要X,Y,Z——我们可以删除这些组件(使用PointCloudComponentRemover)以提高处理速度——只保留一个组件,即可视线ID。
我们只使用地面以下的点,并使用PointCloudMerger,按照可视线ID对它本身进行合并。如果我们只使用Referenced端口的输出,我们将对每条可视线生成一个点云。本质上这就是构成观测者不可见射线范围的点。我们将这些点云和原始点云(具有XYZ)进行比较,找到不匹配的射线。我们将得到构成完全可见即高于地面的点。
叠加DEM与可视线的点云并输出可见点的FME工作空间
之后,我们可以对结果进行栅格化(ImageRasterizer),并使用源DEM生成表面(使用TINGenerator),然后将栅格作为表面纹理(SharedItemAdder和SharedItemIDSetter)。
生成表面和栅格,然后进行叠加输出有用的结果
如果我们通过改变观测者的高度生成一系列的栅格,我们可以得到漂亮的GIF动画:
栅格着色
我们得到许多询问关于栅格着色的功能。我们有一个叫做RasterHSVShader的自定义转换器,是Jens Frolik创建的,可以在FMEHub中获取,用它可以制作DEM渲染图,使用HSV(色调,饱和度,值)模式。我们还有一个强大的RasterExpressionEvaluator转换器,可以用来改变任意像素的色彩,但是应用到即使对于一个简单的彩色斜坡,也可能需要创建非常复杂的条件。
在FME WorldTour2016中,我得到了一个需要使用枯燥的灰度色调来渲染DEM栅格的要求,我决定解决这个问题。它的伟大之处在于只使用了一个预定义的颜色渐变,就可以应用到任何DEM中。为了测试这个目的,我使用Paint.Net创建了一个颜色渐变的RGB栅格。
颜色渐变的栅格图片
我如何把这些颜色按照DEM高程范围进行分配呢?答案显而易见——使用点云!
我们把原始栅格转换为点云,将XYZ值拷贝到临时组件中(x_orig, y_orig, z_orig),并设置新的XYZ值:
- X为0.
- Y设置为Z,这样我们得到沿着一条直线的点组成的点云,沿Y轴从最小高程值到最大高程值。
- Z没什么作用,可以设置为任意的值,或者不用设置,甚至删除Z值。
颜色渐变的栅格在我们使用它的色彩前还需要做一些变幻。我们沿Y轴对渐变栅格进行重采样,在高程范围内对每个整数值得到一个像素。然后我们给渐变栅格赋上地理参考,这样它就得到沿着我们DEM的点云的点,现在如上图所示,只需要对沿着一条直线的点进行赋值:
原始栅格变为按高程排序的点云(中间那条线),把渐变栅格与它放在一起
用PointCloudOnRasterComponentSetter给DEM点带上渐变栅格的RGB值,PointCloudComponentCopier恢复原始的XYZ值。现在如果我们栅格化点云,将得到一个着色较好的RGB栅格(左边是原始影像与渐变栅格,右边是着色的结果):
左边是原始影像与渐变栅格,右边是着色的结果
使用该技术意味着渐变栅格不需要一定与传统渐变颜色一样——我们可以使用任何影像对栅格着色,得到漂亮的图片,就像玛瑙一样。
栅格统计
另一个常见要求是栅格统计计算。遗憾的是到2016年5月为止,FME还没有这样的转换器。它很容易得的,就如同上面的例子所示,我们可以把栅格转为点云,利用PointCloudStatisticsCalculator进行统计。
使用FME中的PointCloudStatisticsCalculator进行栅格统计
一旦统计计算完成,我们可以把统计属性合并到原始栅格中或者单独处理。
总结
我真心希望我展示的例子可以说明点云技术在在点云非传统应用领域的强大能力。
把几何类型完全重构为点云并恢复至原始面貌的方法是比较和分析不同数据类型的一个很伟大的方法。
另外,在不同几何类型之间转换的能力让我们可以选择最佳的几何类型用于特殊操作。
最后,想象一下未来,我们可以把点云处理速度应用到规则的矢量要素中。这美好的一天不会太远——我们正在努力实现。