r-tree
how to construct a RTree using given data points
I need to construct a R tree using given data points.I have searched for implementation of R tree.All the implementation i found construct r tree when given coordinates of rectangle as input.I need to construct r tree when given data points itself(it can be 1 dimensional).The code should take care of creating rectangles which encloses these data points and construct r tree.
Use MBRs (Minimum bounding rectangle) with min = max = coordinate. They all do it this way. Good implementations will however store point data with approximately twice the capacity in the leaves than in directory nodes.
If you're looking for a C++ implementation, the one contained in Boost.Geometry currently (Boost. 1.57) is able to store Points, Boxes and Segments. The obvious advantage is that the data in leafs of the tree is not duplicated which means that less memory is used, caching is better, etc. The usage looks like this: #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 }
I guess that using an Rtree to store points seems like a misuse. Although this kind of structure is indicated to store spatial data, after some research I just found out it is best suited for storing non-zero area regions (as the R from the name is for Region or Rectangle). Creating a simple table with a nice index should offer better performance either for updating and searching data. Consider my example below: CREATE TABLE locations (id, latitude, longitude); CREATE INDEX idx_locations ON locations (latitude, longitude); is preferable over CREATE VIRTUAL TABLE locations USING rtree( id, minLatitude, maxLatitude, minLongitude, maxLongitude); if you are just planning to repeat minLatitude over maxLatitude and minLongitude over maxLongitude for every row as to represent points and not rectangles. Although the latter approach will work as expected, Rtrees are suited to index rectangle areas and using them to store points is a misuse with worst performance. Prefer a compound index as above. Further reading: http://www.deepdyve.com/lp/acm/r-trees-a-dynamic-index-structure-for-spatial-searching-ZH0iLI4kb0?key=acm
Related Links
How does R+-Tree manages intersecting objects?
Why does the unique R-Tree node appear to be in two enclosing rectangles?
ELKI DBSCAN R* tree index
R-Tree vs R+-Tree vs R*-Tree
How to bulk-load an r-tree in C#?
how to construct a RTree using given data points