提升树查询点交集

时间:2018-07-30 07:46:44

标签: c++ boost tree boost-geometry

我正在尝试在C ++代码中实现升压树。目前,我正在执行以下操作:给定边界框v_bboxes的向量,我将在其中构建一棵树。

  LinearPointRtree built_tree(v_bboxes.begin(), v_bboxes.end());

然后,给定一点,我想知道该点在v_bboxes的哪个边界框中(可能是一个或多个)。目前,我正在执行以下查询:

built_tree.query(bgi::intersects(point), std::back_inserter(result));

结果是一个向量,该向量包含包含该点的边界框,而我对引用原始向量v_bboxes的索引感兴趣。

我可以将“结果”与原始向量进行比较,并找到返回的边界框,但是这样做效率不高,我相信有一种直接使用boost的更好的方法,我只是在文档中找不到任何东西。

当前,我还想做的是从元组(边界框,索引)的向量开始构建一棵树,但它会抛出一个很长且看起来很糟糕的编译错误:

  

错误:没有匹配的函数可以调用   ‘boost :: geometry :: index :: detail :: varray>,   17> :: push_back(std :: tuple>,unsigned int>&)’

有人知道我应该改变什么或有建议吗?

1 个答案:

答案 0 :(得分:0)

除非提出一个更好的主意,否则我尝试的事情是正确的(问题是我没有正确定义树)。因此,定义树

template<int spacedim, int leaf_number>
using LinearPointRtree = bgi::rtree<std::tuple<bgBox<spacedim>,unsigned int>, bgi::linear<leaf_number>>;

现在创建对象:

std::vector< std::tuple<bgBox<spacedim>, unsigned int> > boxes_and_indices;

每个条目的位置都有一个边界框和所需的索引。最后,只需构建树(boost可自动处理对和元组):

LinearPointRtree<spacedim,leaf_number> rstar_tree(flat_global_bboxes.begin(), flat_global_bboxes.end());

然后,在查询时,您可以使用第二个条目来获取索引。

这个问题是在这里发布问题后才想到的...无论如何,也许它将对其他人有所帮助...

谢谢大家!