【问题标题】:boost tree query point intersection提升树查询点交集
【发布时间】:2019-01-06 10:09:59
【问题描述】:

我正在尝试在 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>&)'

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

【问题讨论】:

  • 把代码放到创建rtree对象的地方。 rtree 对象的第一个模板参数是什么 - pair<bbox,integer-type> 如何将元素插入 rtree ?显示代码,没有错误。

标签: c++ boost tree boost-geometry


【解决方案1】:

除非提出更好的想法,否则我尝试的方法是正确的(问题是我没有正确定义树)。所以,定义树

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

那么,在查询的时候,就可以使用第二个条目来获取索引了。

这个想法是在我在这里发布问题后想到的......无论如何,也许它会帮助其他人......

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2020-06-04
    • 2019-05-18
    • 2011-08-27
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多