2010-04-25 151 views
21

有没有人知道在生产代码R-tree实现中使用的好和简单? (实际上,任何实现 - R*, R+PR-tree将是巨大的)C++ R树实现想要

,如果它是一个模板或库实现没关系,但一些实现,谷歌发现看起来非常令人失望,

回答

13
+0

我仍然认为这些版本缺少versatibility,但是,嗯,貌似确定使用 – 2010-04-25 18:47:55

+0

打扰版本需要编译时选择的数据维度这使得它们无用(对我来说)。 – 2012-12-24 12:50:38

+5

@MichaelNett:所以你是低调的,因为我提到的开源实现对你来说毫无用处? – 2012-12-24 13:56:32

7

我更新发现实施210来支持更广泛的数据类型。

你可以找到我的版本在GitHub上:https://github.com/nushoin/RTree

原来的版本是公共领域,因为是我的。

+0

再次,数据维度的选择必须在编译时修复... – 2012-12-24 12:51:30

21

一个漂亮的界面,以不同类型的空间(和时空)索引结构,包括R,R *,TPR树木也可以检查出的变体的rtree由Boost.Geometry提供库:

http://www.boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html

Boost.Geometry RTREE实现允许存储任意类型的值在空间索引和执行复杂的查询。像最大节点元素这样的参数可以作为编译或运行时参数传递。它支持C++ 11移动语义,在Boost.Move中也可以在Pre-C++ 11编译器上模拟。它还支持有状态的分配器,它允许例如使用Boost.Interprocess将rtree存储在共享内存中。而且速度很快。

不利的是,当前持久性存储尚未支持,因此如果您需要的不仅仅是内存空间索引,您应该检查其他提到的库之一。

快速例如:

可能是最常见的情况是,当你存储在一个容器中的一些几何对象及其边界框与空间索引一些IDS。在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; 
} 
+2

+ +1为Boost库提供示例 – djondal 2013-11-01 16:42:00

+0

您是否还需要持久存储?我的硕士论文将在R-Trees上,我也计划在实现方面进行研究。我可以得到任何帮助吗? – 2015-07-02 10:30:40

+0

@NikosAthanasiou是的,它仍然在计划中,但我没有足够的空闲时间来处理它。除了我计划提供的持久存储支持外,还有一些其他内容。当然,任何帮助表示赞赏。请通过Boost.Geometry邮件列表与我们联系。 – 2015-07-02 13:28:53