如何使用给定的数据点构造树

时间:2011-04-30 22:08:55

标签: r-tree

我需要使用给定的数据点构造一个 R树。我已经搜索了R树的实现。当给定矩形的坐标作为输入时,我发现构造r树的所有实现。我需要当给定数据点本身时(它可以是1维)构造r树。代码应该处理创建包围这些数据点并构造r树的矩形。

3 个答案:

答案 0 :(得分:5)

使用min = max = coordinate的MBR(Minimum bounding rectangle)。他们都是这样做的。然而,良好的实现将存储点数据的大小是叶子容量的两倍,而不是目录节点。

答案 1 :(得分:2)

如果您正在寻找C ++实现,那么Boost.Geometry当前包含的内容(Boost.1.57)可以存储点,框和段。显而易见的优点是树的叶子中的数据不重复,这意味着使用更少的内存,缓存更好,等等。用法如下:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/index/rtree.hpp>

#include <vector>

namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;

int main()
{
    typedef bg::model::point<float, 2, bg::cs::cartesian> point;
    typedef bg::model::box<point> box;

    // a container of points
    std::vector<point> points;

    // create the rtree
    bgi::rtree< point, bgi::linear<16> > rtree(points.begin(), points.end());

    // insert some additional points
    rtree.insert(point(/*...*/));
    rtree.insert(point(/*...*/));

    // find points intersecting a box
    std::vector<point> query_result;
    rtree.query(bgi::intersects(box(/*...*/)), std::back_inserter(query_result));

    // do something with the result
}

答案 2 :(得分:-1)

我想使用Rtree存储点似乎是误用。虽然这种结构用于存储空间数据,但经过一些研究后我发现它最适合存储非零区域(因为名称中的R是Region或Rectangle)。创建一个具有良好索引的简单表应该为更新和搜索数据提供更好的性能。考虑下面的例子:

CREATE TABLE locations (id, latitude, longitude);
CREATE INDEX idx_locations ON locations (latitude, longitude);

优于

CREATE VIRTUAL TABLE locations USING rtree( id, minLatitude, maxLatitude, minLongitude, maxLongitude);

如果你只是计划在maxLatitude上重复minLatitude,在maxLongitude上为每一行重复minLongitude,以表示点而不是矩形。虽然后一种方法可以按预期工作,但Rtree适合索引矩形区域,并使用它们来存储点是一种误用,性能最差。喜欢上面的复合指数。

进一步阅读:http://www.deepdyve.com/lp/acm/r-trees-a-dynamic-index-structure-for-spatial-searching-ZH0iLI4kb0?key=acm