提升几何体:C++并集多个多边形

Boost Geometry: Union multiple polygons C++

本文关键字:多边形 C++ 几何体      更新时间:2023-10-16

我有一个包含多个 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功能可以用于此目的,但没有详细说明如何操作,我找不到有关此的任何其他内容。如何加快此过程?

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

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

但是,您可以加快算法的速度。仅合并相交的多边形才有意义。其他所有不相交的内容都可以简单地添加到生成的多多边形中。因此,您可以:

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

这不如提议的答案有效,但我从这样做中获得了一些显着的加速,而无需从头开始创建新算法。

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);
}