boost中rtree中的打包算法

Posted

技术标签:

【中文标题】boost中rtree中的打包算法【英文标题】:packing algorithm in rtree in boost 【发布时间】:2015-09-28 00:20:36 【问题描述】:

大家好,我知道如果 rtree 是在 boost 中使用范围值创建的,它将使用打包算法。我需要一个使用打包算法的 rtree 示例。这是我使用二次算法的代码

    using  point = bg::model::point < int, 2, bg::cs::cartesian >;
    using  pointI = std::pair<point, std::size_t>;
 vector<point> contourCenters // has some value
bgi::rtree< pointI, bgi::quadratic<16> > rtree;
vector< pointI > cloud;

for (size_t i = 0; i < contourCenters.size(); ++i)

    int x = contourCenters[i].get < 0 >();
    int y = contourCenters[i].get < 1 >();

    cout << "Contour Centers: (" << x << "," << y << ")";
    cloud.push_back(mp(x, y, i));
    rtree.insert(make_pair(contourCenters[i], i));

我想用打包算法创建 rtree,因为它似乎是 boost 中最快的。请指导我如何在 boost 中使用打包算法创建 rtree。

【问题讨论】:

【参考方案1】:

您只需要使用range constructor。

为此,必须在构建 rtree 之前创建范围。在您的示例中实现这一目标的最简单方法是首先构建您的 cloud 向量,然后从中构建索引:

Live On Coliru

#include <boost/geometry/index/rtree.hpp>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <vector>
#include <iostream>

namespace bg = boost::geometry;
namespace bgi = bg::index;
using  point  = bg::model::point <int, 2, bg::cs::cartesian>;
using  pointI = std::pair<point, std::size_t>;

pointI mp(int x, int y, size_t v) 
    return std::make_pair(point(x,y), v);


int main()

    std::vector<point> contourCenters; // has some value
    std::vector<pointI> cloud;

    size_t id_gen = 0;
    std::transform(
            contourCenters.begin(), contourCenters.end(),
            back_inserter(cloud), 
            [&](point const& p)  return std::make_pair(p, id_gen++); 
        );

    for(pointI& pi : cloud)
        std::cout << "Contour Centers: (" << bg::get<0>(pi.first) << "," << bg::get<1>(pi.first) << ")";

    bgi::rtree<pointI, bgi::quadratic<16> > rtree(cloud);

我用std::transform 替换了循环以获得良好的风格,但您可以保持循环不变。

【讨论】:

感谢您提供优雅的解决方案。如果我看到 boost 文档boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/…,它说 RTree 有四种变体。如果以这种方式初始化时,此二次 rtree 变为放置 rtree。如果我将 rtree 定义行更改为以下内容会发生什么: bgi::rtree > rtree(cloud); @Prem:此构造函数使用特殊的批量加载算法,所以我认为打包算法并不重要,除非您稍后从树中添加/删除元素。 "nemo boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/… 根据本文档我想创建基于打包算法的 rtree...这似乎是使用 boost 库创建 rtree 时存储和检索数据的最有效方式. 你能指导我怎么做吗?我可以创建 r*tree 和四元树,但不知道如何基于打包算法创建 rtree。 您有没有机会对此进行更详细的说明?轮廓中心和云中有什么? @xaxxon 云基本上是一个pair的集合(所以你可以使用id查询和关联找到的点到外部数据)

以上是关于boost中rtree中的打包算法的主要内容,如果未能解决你的问题,请参考以下文章

我可以在线程中使用 Boost.Geometry.index.rtree 吗?

从 boost::geometry::index::rtree 中删除点的问题

查询与 boost::geometry::index::rtree 的交集

在将元素插入 boost::geometry::index::rtree 时获取“可索引无效”

Boost geometry rtree find iterator for the exact match of box

Boost rtree.bounds():获取更多盒子和/或访问其结构