Boost Geometry:联合多个多边形 C++

Posted

技术标签:

【中文标题】Boost Geometry:联合多个多边形 C++【英文标题】:Boost Geometry: Union multiple polygons C++ 【发布时间】:2020-02-12 00:00:06 【问题描述】:

我有一个由几个 Boost.Geometry 多边形组成的数组,我需要将它们合并成一个多边形。我已经成功地实现了将每个连续的多边形与前两个的并集合并的东西(只是循环它们并合并另一个多边形)。

multi_polygon polygons; // an array of initial polygons
multi_polygon border;   // the unioned polygons

for (polygon p : polygons) 
    // add another polygon each iteration
    multi_polygon tmp_poly;
    union_(border, p, tmp_poly);
    border = tmp_poly;

但是,这需要相当长的时间来执行。我听说在一个视频中提到了assign 函数可以用于此,但没有详细说明如何使用,我也找不到关于此的任何其他内容。我怎样才能加快这个过程?

【问题讨论】:

也许可以实现一个更好的算法,通过线扫描同时合并所有多边形。如果做不到这一点,请尝试将它们分组到二叉树中(合并 1 和 2,合并 3 和 4,合并结果),这可能会稍微快一些。 【参考方案1】:

这不如建议的答案有效,但我通过这种方式获得了一些显着的加速,而无需从头开始创建新算法。

multi_polygon polygons; // an array of initial polygons
multi_polygon border;   // the unioned polygons
multi_polygon tmp_poly; // a temporary variable

for (const polygon &p : polygons) 
    // add another polygon each iteration
    union_(border, p, tmp_poly);
    border = tmp_poly;
    boost::geometry::clear(tmp_poly);


【讨论】:

【参考方案2】:

不,assign 只会盲目地将多边形添加到多边形而不合并它们。

目前在 Boost.Geometry (1.73) 中没有将多个多边形合并为一个有效的多多边形的算法。

但是,您可以加快算法速度。只有合并相交的多边形才有意义。其他所有不相交的东西都可以简单地添加到生成的多面体中。所以你可以:

计算所有多边形的边界框 (boost::geometry::envelope()) 将它们(边界框 + 多边形的 id)放入 R-tree (boost::geometry::index::rtree<>) 只合并那些边界框相交的部分(bgi::rtree<>::query()),保留当前合并的部分(与bg::union_()),跟踪与其合并的多边形的ID(例如,将一些bool标志与多边形一起存储在容器中) 并迭代扩展当前部分的边界框 (bg::expand()) 将所有不相交(不可合并)的部分放在一个多多边形中

【讨论】:

以上是关于Boost Geometry:联合多个多边形 C++的主要内容,如果未能解决你的问题,请参考以下文章

Boost Geometry 多边形内两点之间的路径

boost::geometry 中无效几何的数据集

用 boost::geometry 扩展多边形?

奇怪的行为将 boost::geometry::within() 用于多边形和环

合并许多凸多边形的快速算法或库

boost::geometry::Polygon 和“有向”折线的交集