有谁知道在生产代码R-tree
实现中使用的好且简单的?(实际上,任何实现 -R*, R+
或者PR-tree
会很棒)
不管是模板实现还是库实现都无所谓,但谷歌发现的一些实现看起来很令人失望……
您还可以查看 Boost.Geometry 库提供的 rtree 变体:
http://www.boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html
Boost.Geometry rtree 实现允许在空间索引中存储任意类型的值并执行复杂的查询。像最大节点元素这样的参数可以作为编译或运行时参数传递。由于 Boost.Move,它支持 C++11 移动语义,也可以在 C++11 之前的编译器上模拟。它还支持有状态分配器,例如允许使用 Boost.Interprocess 将 rtree 存储在共享内存中。而且速度很快。
不利的一面是,目前尚不支持持久存储,因此如果您需要的不仅仅是内存空间索引,您可能应该检查其他提到的库之一。
快速示例:
最常见的用例可能是当您将一些几何对象存储在容器中时,它们的边界框在空间索引中具有一些 id。在 Boost.Geometry rtree 的情况下,它可能如下所示:
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <vector>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
/* The definition of my_object type goes here */
int main()
{
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef std::pair<box, size_t> value;
std::vector<my_object> objects;
/* Fill objects */
// create the R* variant of the rtree
bgi::rtree< value, bgi::rstar<16> > rtree;
// insert some values to the rtree
for ( size_t i = 0 ; i < objects.size() ; ++i )
{
// create a box
box b = objects[i].calculate_bounding_box();
// insert new value
rtree.insert(std::make_pair(b, i));
}
// find values intersecting some area defined by a box
box query_box(point(0, 0), point(5, 5));
std::vector<value> result_s;
rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
// find 5 nearest values to a point
std::vector<value> result_n;
rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
return 0;
}
检查http://www.superliminal.com/sources/sources.htm上的 R-Trees 代码
还要检查
http://www.virtualroadside.com/blog/index.php/2008/10/04/r-tree-implementation-for-cpp/
我更新了http://www.superliminal.com/sources/sources.htm中的实现以支持更广泛的数据类型。
你可以在 github 上找到我的版本:https ://github.com/nushoin/RTree
原始版本是公共领域,我的也是。
空间索引为不同类型的空间(和时空)索引结构提供了一个很好的接口,包括http://libspatialindex.github.com/上的 R、R*、TPR 树