C++ R - 需要树实现

标签 c++ r-tree

有谁知道在生产代码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;
}

关于C++ R - 需要树实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2709339/

相关文章:

c++ - 内存中 Boost r-tree 与映射文件中的性能差异

c++ - Rapidjson 文档

c++ - 如何为 qmlRegisterSingletonType 实现单例提供程序?

c++ - 为什么编译器不选择 `forward`的右值引用版本?

c++ - Qt 自动化测试

c++ - 如何在 C++ 中使用 Boost 库的 Rtree?

indexing - R-Tree 和 Quadtree 比较

python - 如何使用 R-Tree 在谷歌地图上绘制大量 map 标记

cluster-analysis - 带有 R*-Tree 的 DBSCAN - 它是如何工作的

c++ - 需要一个使用 dht_put_item 和 libtorrent 的例子