【发布时间】:2018-11-20 18:32:50
【问题描述】:
假设我有以下设置:
我有一个boost::geometry::index::rtree,它以二维框为键,以点为值。
盒子的第一个维度,实际上将应用于(实值封闭)区间,而第二个维度仅应用于点。
所以我的盒子看起来像:
using namespace std;
typedef bg::model::point<unsigned long, 2, bg::cs::cartesian> _pt_t;
typedef bg::model::box<_pt_t> _box_t;
typedef pair<_box_t, unsigned long> tree_v_t;
typedef bgi::rtree<tree_v_t, bgi::quadratic<16> > rtree_t;
一个盒子总是会使用以下方法初始化:
_box_t _mb(unsigned long i, unsigned long s, unsigned long d){
_box_t b(_pt_t(s, i), _pt_t(s + d, i));
return b;
}
现在假设我已经初始化了 rtree,我想做两种复杂的查询:
- 给定一组
si的间隔set<pair<unsigned int, unsigned int> >和一组sp的点set<unsigned int>,我想迭代作为以下伪代码查询结果的所有值:
any(si, intersect(rtree_level1)) && any(sp, contains(rtree_level2)) && value in ps
换句话说,我想要包含si 中包含的区间和sp 中包含的点的交集的rtree 的子树,并且它的值也在sp 中。如果你愿意,你可以假设 si 中的所有区间都是不相交的。
- 给定一组
spi的点和区间set<unsigned int, pair<unsigned int, unsigned int> >,我想迭代作为以下伪代码查询结果的所有值:
any(spi, intersect(rtree_level1)(spi.interval) && contains(rtree_level2)(spi.point) && value in spi.point )
换句话说,我想要来自spi 的每个元素的所有子树的联合,它们是给定区间的交集,并且它们包含 仅作为键(第二级)和值的那些点。如果 si 和 sp 都有一个元素,这就像 union 从 query 1 生成的所有 R-tree .
我可以理解如何使用satisfy 谓词并将transform 应用于qbegin 生成的迭代器,但是
在 boost 中最有效的方法是什么?
【问题讨论】:
-
“rtree_level1”、“rtree_level2 和“subtree”是什么意思?
set是什么意思?通常是std::set。是这样吗?如何set<unsigned int>是一组点吗?你的点是一维的吗?这是什么意思:set<unsigned int, pair<unsigned int, unsigned int> >?std::set只接受一个定义value_type的类型。你的意思是std::map还是有什么不同?这看起来像是一个 XY 问题。您一般想要实现什么目标? -
我的意思是
std::set。要了解一般情况下的问题,您可以查看this 帖子(这也是由我完成的)。set<unsigned int, pair<unsigned int, unsigned int> >表示一组点,其中每个点在给定的时间间隔内都有效。非常感谢您的关注:) -
set<unsigned int, pair<unsigned int, unsigned int> >在std::set的上下文中没有意义。 “一组点,每个点在给定间隔内有效”是什么意思?那个数字在区间内?我是否正确理解您的数据是一维的?如果是这种情况,1d rtree 将等同于区间图。您的问题应该在更高的抽象级别上考虑,而不是选择特定数据结构来索引 1d 间隔。这意味着这个问题是XY问题。 -
我在 StackExchange 上阅读了您的原始帖子。我是否正确理解您在 1d 间隔和某些数据([min, max] {key})之间存在双向映射,并且您想双向搜索?由于区间和键都位于不同的空间中,因此您需要为它们提供 2 个单独的索引或排序机制,每个方向一个。
-
另一件事是:如果同一个键有 2 个重叠间隔怎么办?它们应该被视为一个扩大的区间还是两个独立的区间?例如。 ([1,3]'a') 和 ([2,4]'a') 应该返回为 ([1,4]'a') 吗?如果应该合并间隔,您必须决定是在存储到索引(例如 rtree)之前完成合并还是在执行所需间隔的查询后合并。
标签: c++ boost boost-geometry r-tree