R-tree
R-tree organizes data into hierarchical structure and ensures that:
- minimal bounding rectangles (MBRs) of the nodes (rectangles that encompass all data elements in the subtree) stay compact,
- MBRs of the nodes from the same R-tree level have minimal overlap with each other.
The key benefit of R-tree is its ability to rebalance itself and maintain efficient structure while handling dynamic data (massive insertions and deletions).
SpatialIndexing provides RTree type that supports:
- different R-tree variants (classic R-tree, R*-tree, linear and quadratic node splits)
insert!(tree, item),delete!(tree, item)for element-wise insertion and deletion- bulk-loading of data using Overlap-minimizing Top-down (OMT) approach (
load!(tree, data)) subtract!(tree, reg)for removing data within specified regionregfindfirst(tree, reg, [id]),contained_in(tree, reg)andintersects_with(tree, reg)spatial queries
SpatialIndexing.RTree — TypeR-Tree: N-dimensional spatial data index [guttman84].
R-tree groups data elements (V) into leaves (Leaf) and leaves into branches (Branch). It uses various heuristics to ensure that the minimal bounding rectangles (MBRs) of the nodes (Rect{T,N} rectangles that encompass the data elements attached to these nodes) stay compact and that the MBRs of the nodes that are on the same level of R-tree hierarchy have minimal overlap with each other. This property makes R-trees efficient for spatial queries.
To facilitate spatial indexing, the V data elements need to support HasMBR trait (i.e. define mbrtype(V) and mbr(v::V) methods) and, optionally, HasID trait (via idtype(V) and id(v::V) methods). mbr(v::V) should return minimal bounding rectangle (MBR) of type Rect{T,N} that contains v. SpatialElem{T,N,D} type provides generic implementation of spatial data element that explicitly stores id, mbr and data object of type D and implements HasMBR and HasID traits.
Parameters
The behaviour of RTree is defined by the parameters supplied at its creation:
T: the numeric type for the spatial coordinateN: the number of spatial dimensionsvariant: one ofRTreeLinear,RTreeQuadratic, orRTreeStar(default)tight_mbrs: recalculate node MBR when the child is removed (default istrue)branch_capacity: capacity of branch nodes (default is100)leaf_capacity: capacity of leaf nodes (default is100)leafpool_capacity: How many detached 1st level nodes (leaves) should be kept for reuse (default is100)twigpool_capacity: How many detached 2nd level nodes should be kept for reuse (default is100)branchpool_capacity: How many other (level > 2) detached branch nodes should be kept for reuse (default is100)nearmin_overlap: How many candidates to consider when identifying the node with minimal overlap (default is32)fill_factor: How much should the node be filled (fraction of its capacity) after splitting (default is0.7)split_factor: How much can the sizes of the two nodes differ after splitting (default is0.4)reinsert_factor: How much should the node be underfilled (fraction of its capacity) to consider removing it and redistributing its children to other nodes (default is0.3)
Performance
The nodes in R-tree have limited capacity (maximual number of children) specified at RTree creation (leaf_capacity and branch_capacity). Larger capacities results in shorter trees, but they time required to locate the specific spatial region grows linearly with the capacity.
References
[guttman84] “R-Trees: A Dynamic Index Structure for Spatial Searching” A. Guttman, Proc. 1984 ACM-SIGMOD Conference on Management of Data (1985), 47-57. [beckmann90] "The R*-tree: an efficient and robust access method for points and rectangles" N. Beckmann, H.P. Kriegel, R. Schneider, B. Seeger, Proc. 1990 ACM SIGMOD international conference on Management of data (1990), p.322
SpatialIndexing.RTreeVariant — TypeR-Tree variants.
Base.insert! — Functioninsert!(tree::RTree, pt::Point, [id], val)
insert!(tree::RTree, br::Rect, [id], val)
insert!(tree::RTree, elem::SpatialElem)Inserts val value identified by br bounding box (or point pt) and id (if tree elememnts support HasID trait) into the tree.
Base.delete! — Functiondelete!(tree::RTree, pt::Point, [id])
delete!(tree::RTree, br::Rect, [id])Deletes the value identified by br bounding box (or point pt) and the id (if tree elements support HasID trait) from the tree.