增强几何Rtree查找与框完全匹配的迭代器

时间:2019-05-18 21:37:35

标签: c++ boost boost-geometry

当在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;
}

这真的是执行此查询的最佳方式(即性能最高)吗?

1 个答案:

答案 0 :(得分:2)

这不是安全的方法。我可以轻松想象出可能无法正常工作的情况:

Rtree的状态,其中有2个框,然后插入新框:

(0,2) --- (1,2)
  |    b    |
(0,1) --- (1,1)
  |    a    |
(0,0) --- (1,0)

因此我们有2个框ab。现在,当您尝试插入与nearest框具有相同几何形状的新输入框时,将结果数量设为a谓词1。输入几何和distance之间的a为0,但distance(input,b)的{​​0}也为0。 nearest只能返回一个框-哪个?您不知道,如果它返回b框,则将a的副本插入Rtree。

安全方法可以如下:

  1. 获取新的输入框
  2. 计算其质心
  3. 从rtree中获取所有包含输入质心的框
  4. 遍历返回的框并成对调用equals函数(来自rtee的框,输入框)

为此,您可以使用contains predicate,该方法使用boost::geometry::within方法。作为contains/within的输入,您传递了点-重心,如果编译器将其丢弃(我不确定它可以取点),则可以将点重心扩展到小框中以进行编译。