机器视觉

自由、创新、技术、经典

JTS快速多边形联合

JTS快速多边形联合
2007年11月17日

原文:
http://lin-ear-th-inking.blogspot.com/2007/11/fast-polygon-merging-in-jts-using.html

多边形联合(Union)是空间处理(SpatialProcessing,即WPS中的P)中常见的一项需求。在实际应用中,多边形可能相互覆盖、重叠,这增大了这项处理的难度。到目前位置,JTS中通过两种方法可以完成这一操作:
  • 迭代联合(Iterated Union): 通过迭代所有多边形,一个一个地做联合获得结果
  • 缓冲联合(Buffer Union): 把所有多边形作为一个GeometryCollection,为其做距离为0的buffer

前者方法比较直白,但是在大数据量的情况下效率不高。第二种方法在很多时候效率更高,但是在大规模复杂的数据处理中也会出错。

由于这是一个较常用的操作,我一直在寻找一种更加快速和可靠的方法。这个替代方法被称为层级联合(Cascaded Union)。简单的说,就是将规模较小的子集首先做联合,然后再对得出的结果继续做联合,直至多边形全部联合完成。这可以被认为是树的后序遍历,每一个联合的结果被存储在迭代的父节点上。如果这种树状结构由输入数据的空间接近程度定义的,并且输入的数据集里叠合、邻接关系较多,这个算法的效率相对较高。这是因为在树的上层联合的操作更加快速。

更方便的是,JTS提供的空间索引可以用来定义一个完美的树状结构。现在的Sort-Tile-Recursive的R-Tree索引正被使用,它可以生成一个效果非常好的树(尽管我认为此算法对空间树使用的精度并不合适)。

计算的结果显示层级联合的效率要远高于迭代联合。通过30000个相互叠合度很高的多边形测试,运行的结果如下:
层次叠合: 20秒
迭代联合: 3小时40分

不错,这值得我们编写为代码。而且他比缓冲联合更加稳健,更加快。

这个算法将作为JTS1.9版本的Geometry.union()默认实现。

posted on 2008-10-11 21:11  塞伦盖蒂之鹰  阅读(1468)  评论(0)    收藏  举报

导航