我正在尝试在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>&)’
有人知道我应该改变什么或有建议吗?
答案 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());
然后,在查询时,您可以使用第二个条目来获取索引。
这个问题是在这里发布问题后才想到的...无论如何,也许它将对其他人有所帮助...
谢谢大家!