在将新框插入rtree时,我要首先检查树中是否已存在相同的框。如果是这样,我只想获取该值,否则我将需要插入一个新值。最佳(即最有效)的方法是什么?
我可以通过调用nearest(box,1)
,然后检查是否相等来做到这一点:
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
typedef bg::model::point<double, 1, bg::cs::cartesian> TPoint;
typedef bg::model::box<TPoint> TBox;
typedef std::pair<TBox, void*> TPair;
typedef bgi::rtree<TPair, bgi::quadratic<16>> TTree;
TTree::const_query_iterator findExact(const TTree& tree, const TBox& box)
{
auto it = rtree.qbegin(bgi::nearest(box, 1));
if(it == rtree.qend() || !bg::equals(it->first, box))
return rtree.qend();
return it;
}
这真的是执行此查询的最佳方法(即性能最高)吗?
最佳答案
这不是安全的方法。我可以轻松想象出可能无法正常工作的情况:
Rtree的状态,其中有2个框,然后插入新框:
(0,2) --- (1,2)
| b |
(0,1) --- (1,1)
| a |
(0,0) --- (1,0)
所以我们有2个盒子
a
和b
。现在,当您尝试插入与nearest
框具有相同几何形状的新输入框时,您将a
prediacte称为结果数1。输入几何图形和distance
之间的a
为0,但distance(input,b)
也为0。 nearest
只能返回一个框-哪一个?您不知道,如果返回b
框,则将a
的副本插入Rtree。安全方法可以如下:
equals
函数(来自rtee的框,输入框)为此,您可以使用contains predicate,它使用boost::geometry::within方法。作为
contains/within
的输入,您传递了点-重心,如果编译器将其丢弃(我不确定它可以取点),则可以将点重心扩展到小框中以进行编译。关于c++ - boost 几何Rtree查找迭代器以实现框的精确匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56203034/