GRASS 8 Programmer's Manual 8.6.0dev(2026)-1878fdfec5
Loading...
Searching...
No Matches
rtree.h
Go to the documentation of this file.
1/****************************************************************************
2 * MODULE: R-Tree library
3 *
4 * AUTHOR(S): Antonin Guttman - original code
5 * Daniel Green (green@superliminal.com) - major clean-up
6 * and implementation of bounding spheres
7 * Markus Metz - file-based and memory-based R*-tree
8 *
9 * PURPOSE: Multidimensional index
10 *
11 * SPDX-FileCopyrightText: 2010-2012 GRASS Development Team
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *****************************************************************************/
14#ifndef _R_TREE_H_
15#define _R_TREE_H_
16
17#include <stdlib.h>
18#include <stdio.h>
19#include <string.h>
20#include <sys/types.h>
21#include <grass/config.h> /* needed for LFS */
22
23typedef double RectReal;
24
25/*-----------------------------------------------------------------------------
26| Global definitions.
27-----------------------------------------------------------------------------*/
28
29#ifndef TRUE
30#define TRUE 1
31#endif
32#ifndef FALSE
33#define FALSE 0
34#endif
35
36/* max branching factor of a node */
37/* was (PGSIZE-(2 * sizeof(int))) / sizeof(struct Branch)
38 * this is LFS dependent, not good
39 * on 32 bit without LFS this is 9.69
40 * on 32 bit with LFS and on 64 bit this is 9 */
41#define MAXCARD 9
42#define NODECARD MAXCARD
43#define LEAFCARD MAXCARD
44
45/* maximum no of levels = tree depth */
46#define MAXLEVEL 20 /* 8^MAXLEVEL items are guaranteed to fit into the tree */
47
48/* number of nodes buffered per level */
49#define NODE_BUFFER_SIZE 32
50
51struct RTree_Rect {
52 RectReal *boundary; /* xmin,ymin,...,xmax,ymax,... */
53};
54
55struct RTree_Node; /* node for spatial index */
56
58 int id; /* child id */
59 struct RTree_Node *ptr; /* pointer to child node */
60 off_t pos; /* position of child node in file */
61};
62
63struct RTree_Branch /* branch for spatial index */
64{
67};
68
69struct RTree_Node /* node for spatial index */
70{
71 int count; /* number of branches */
72 int level; /* 0 is leaf, others positive */
74};
75
76/*
77 * If passed to a tree search, this callback function will be called
78 * with the ID of each data rect that overlaps the search rect
79 * plus whatever user specific pointer was passed to the search.
80 * It can terminate the search early by returning 0 in which case
81 * the search will return the number of hits found up to that point.
82 */
83typedef int SearchHitCallback(int id, const struct RTree_Rect *rect, void *arg);
84
85struct RTree;
86
87typedef int rt_search_fn(struct RTree *, struct RTree_Rect *,
88 SearchHitCallback *, void *);
89typedef int rt_insert_fn(struct RTree_Rect *, union RTree_Child, int,
90 struct RTree *);
91typedef int rt_delete_fn(struct RTree_Rect *, union RTree_Child,
92 struct RTree *);
93typedef int rt_valid_child_fn(union RTree_Child *);
94
95/* temp vars for each tree */
96/* node stack used for non-recursive insertion/deletion */
97struct nstack {
98 struct RTree_Node *sn; /* stack node */
99 int branch_id; /* branch number to follow down */
100 off_t pos; /* file position of stack node */
101};
102
103/* node buffer for file-based index */
105 struct RTree_Node n; /* buffered node */
106 off_t pos; /* file position of buffered node */
107 char dirty; /* node in buffer was modified */
108};
109
110/* temp vars for node splitting */
119
120struct RTree {
121 /* RTree setup info */
122 int fd; /* file descriptor */
123 unsigned char ndims; /* number of dimensions */
124 unsigned char nsides; /* number of sides = 2 * ndims */
125 unsigned char ndims_alloc; /* number of dimensions allocated */
126 unsigned char
127 nsides_alloc; /* number of sides allocated = 2 * ndims allocated */
128 int nodesize; /* node size in bytes */
129 int branchsize; /* branch size in bytes */
130 int rectsize; /* rectangle size in bytes */
131
132 /* RTree info, useful to calculate space requirements */
133 int n_nodes; /* number of nodes */
134 int n_leafs; /* number of data items (level 0 leafs) */
135 int rootlevel; /* root level = tree depth */
136
137 /* settings for RTree building */
138 int nodecard; /* max number of children in node */
139 int leafcard; /* max number of children in leaf */
140 int min_node_fill; /* balance criteria for node removal */
141 int min_leaf_fill; /* balance criteria for leaf removal */
142 int minfill_node_split; /* balance criteria for splitting */
143 int minfill_leaf_split; /* balance criteria for splitting */
144 char overflow; /* enable/disable overflow */
145
146 /* free node positions for recycling */
147 struct _recycle {
148 int avail; /* number of available positions */
149 int alloc; /* number of allocated positions in *pos */
150 off_t *pos; /* array of available positions */
152
153 /* node buffer for file-based index */
154 struct NodeBuffer **nb;
155
156 /* usage order of buffered nodes per level
157 * used[level][0] = most recently used
158 * used[level][NODE_BUFFER_SIZE - 1] = least recently used */
159 int **used;
160
161 /* insert, delete, search */
166
167 struct RTree_Node *root; /* pointer to root node */
168
169 /* internal variables, specific for each tree,
170 * allocated with tree initialization */
171 /* node stack for tree traversal */
172 struct nstack *ns;
173
174 /* variables for splitting / forced reinsertion */
177
180
183
184 off_t rootpos; /* root node position in file */
185};
186
187/* RTree main functions */
188int RTreeSearch(struct RTree *, struct RTree_Rect *, SearchHitCallback *,
189 void *);
190int RTreeInsertRect(struct RTree_Rect *, int, struct RTree *);
191void RTreeSetRect1D(struct RTree_Rect *r, struct RTree *t, double x_min,
192 double x_max);
193void RTreeSetRect2D(struct RTree_Rect *r, struct RTree *t, double x_min,
194 double x_max, double y_min, double y_max);
195void RTreeSetRect3D(struct RTree_Rect *r, struct RTree *t, double x_min,
196 double x_max, double y_min, double y_max, double z_min,
197 double z_max);
198void RTreeSetRect4D(struct RTree_Rect *r, struct RTree *t, double x_min,
199 double x_max, double y_min, double y_max, double z_min,
200 double z_max, double t_min, double t_max);
201int RTreeDeleteRect(struct RTree_Rect *, int, struct RTree *);
202void RTreePrintRect(struct RTree_Rect *, int, struct RTree *);
203struct RTree *RTreeCreateTree(int, off_t, int);
204void RTreeSetOverflow(struct RTree *, char);
205void RTreeDestroyTree(struct RTree *);
206int RTreeOverlap(struct RTree_Rect *, struct RTree_Rect *, struct RTree *);
207int RTreeContained(struct RTree_Rect *, struct RTree_Rect *, struct RTree *);
208int RTreeContains(struct RTree_Rect *, struct RTree_Rect *, struct RTree *);
209
210/* RTree node management */
211struct RTree_Node *RTreeAllocNode(struct RTree *, int);
212void RTreeInitNode(struct RTree *, struct RTree_Node *, int);
213void RTreeCopyNode(struct RTree_Node *, struct RTree_Node *, struct RTree *);
214void RTreeFreeNode(struct RTree_Node *);
215void RTreeDestroyNode(struct RTree_Node *, int);
216
217/* RTree rectangle allocation and deletion */
218struct RTree_Rect *RTreeAllocRect(struct RTree *t);
219void RTreeFreeRect(struct RTree_Rect *r);
221void RTreeFreeBoundary(struct RTree_Rect *r);
222
223/* RTree IO */
224size_t RTreeReadNode(struct RTree_Node *, off_t, struct RTree *);
225size_t RTreeWriteNode(struct RTree_Node *, struct RTree *);
226off_t RTreeGetNodePos(struct RTree *);
227void RTreeFlushBuffer(struct RTree *);
228
229#endif
double t
Definition r_raster.c:37
double r
Definition r_raster.c:37
void RTreeFreeNode(struct RTree_Node *)
Definition node.c:92
struct RTree_Rect * RTreeAllocRect(struct RTree *t)
Create a new rectangle for a given tree.
Definition rect.c:39
#define MAXCARD
Definition rtree.h:41
void RTreeFreeRect(struct RTree_Rect *r)
Delete a rectangle.
Definition rect.c:60
size_t RTreeWriteNode(struct RTree_Node *, struct RTree *)
Definition io.c:174
void RTreeDestroyNode(struct RTree_Node *, int)
Definition node.c:287
struct RTree * RTreeCreateTree(int, off_t, int)
Create new empty R*-Tree.
int RTreeContains(struct RTree_Rect *, struct RTree_Rect *, struct RTree *)
Definition rect.c:631
int SearchHitCallback(int id, const struct RTree_Rect *rect, void *arg)
Definition rtree.h:83
void RTreeInitNode(struct RTree *, struct RTree_Node *, int)
Definition node.c:59
int rt_delete_fn(struct RTree_Rect *, union RTree_Child, struct RTree *)
Definition rtree.h:91
int RTreeDeleteRect(struct RTree_Rect *, int, struct RTree *)
Delete an item from a R*-Tree.
void RTreeFlushBuffer(struct RTree *)
Definition io.c:241
int rt_insert_fn(struct RTree_Rect *, union RTree_Child, int, struct RTree *)
Definition rtree.h:89
int RTreeContained(struct RTree_Rect *, struct RTree_Rect *, struct RTree *)
Definition rect.c:606
int RTreeSearch(struct RTree *, struct RTree_Rect *, SearchHitCallback *, void *)
Search an R*-Tree.
int rt_search_fn(struct RTree *, struct RTree_Rect *, SearchHitCallback *, void *)
Definition rtree.h:87
size_t RTreeReadNode(struct RTree_Node *, off_t, struct RTree *)
Definition io.c:94
void RTreeFreeBoundary(struct RTree_Rect *r)
Delete the boundary of a rectangle.
Definition rect.c:95
void RTreeSetRect1D(struct RTree_Rect *r, struct RTree *t, double x_min, double x_max)
Set one dimensional coordinates of a rectangle for a given tree.
Definition rect.c:125
int RTreeOverlap(struct RTree_Rect *, struct RTree_Rect *, struct RTree *)
Definition rect.c:587
void RTreeSetRect2D(struct RTree_Rect *r, struct RTree *t, double x_min, double x_max, double y_min, double y_max)
Set two dimensional coordinates of a rectangle for a given tree.
Definition rect.c:146
void RTreeSetRect4D(struct RTree_Rect *r, struct RTree *t, double x_min, double x_max, double y_min, double y_max, double z_min, double z_max, double t_min, double t_max)
Set 4 dimensional coordinates of a rectangle for a given tree.
Definition rect.c:201
RectReal * RTreeAllocBoundary(struct RTree *t)
Allocate the boundary array of a rectangle for a given tree.
Definition rect.c:78
int rt_valid_child_fn(union RTree_Child *)
Definition rtree.h:93
int RTreeInsertRect(struct RTree_Rect *, int, struct RTree *)
Insert an item into a R*-Tree.
off_t RTreeGetNodePos(struct RTree *)
Definition io.c:71
void RTreePrintRect(struct RTree_Rect *, int, struct RTree *)
Definition rect.c:301
void RTreeDestroyTree(struct RTree *)
Destroy an R*-Tree.
double RectReal
Definition rtree.h:23
void RTreeSetOverflow(struct RTree *, char)
Enable/disable R*-tree forced reinsertion (overflow)
void RTreeSetRect3D(struct RTree_Rect *r, struct RTree *t, double x_min, double x_max, double y_min, double y_max, double z_min, double z_max)
Set three dimensional coordinates of a rectangle for a given tree.
Definition rect.c:171
struct RTree_Node * RTreeAllocNode(struct RTree *, int)
Definition node.c:71
void RTreeCopyNode(struct RTree_Node *, struct RTree_Node *, struct RTree *)
Definition node.c:106
struct RTree_Node n
Definition rtree.h:105
char dirty
Definition rtree.h:107
off_t pos
Definition rtree.h:106
off_t * pos
Definition rtree.h:150
struct RTree_Rect rect
Definition rtree.h:65
union RTree_Child child
Definition rtree.h:66
int count
Definition rtree.h:71
int level
Definition rtree.h:72
struct RTree_Branch * branch
Definition rtree.h:73
int taken[9+1]
Definition rtree.h:114
RectReal area[2]
Definition rtree.h:117
struct RTree_Rect cover[2]
Definition rtree.h:116
int partition[9+1]
Definition rtree.h:112
RectReal * boundary
Definition rtree.h:52
Definition rtree.h:120
unsigned char ndims_alloc
Definition rtree.h:125
unsigned char nsides
Definition rtree.h:124
int branchsize
Definition rtree.h:129
int min_leaf_fill
Definition rtree.h:141
int minfill_node_split
Definition rtree.h:142
int n_nodes
Definition rtree.h:133
int rootlevel
Definition rtree.h:135
off_t rootpos
Definition rtree.h:184
RectReal * center_n
Definition rtree.h:182
struct RTree::_recycle free_nodes
int n_leafs
Definition rtree.h:134
struct RTree_Rect rect_0 rect_1 upperrect orect
Definition rtree.h:181
int ** used
Definition rtree.h:159
struct RTree_Branch tmpb1 tmpb2 c
Definition rtree.h:178
int minfill_leaf_split
Definition rtree.h:143
int min_node_fill
Definition rtree.h:140
struct RTree_Branch * BranchBuf
Definition rtree.h:176
rt_delete_fn * delete_rect
Definition rtree.h:163
int nodesize
Definition rtree.h:128
int fd
Definition rtree.h:122
rt_search_fn * search_rect
Definition rtree.h:164
unsigned char nsides_alloc
Definition rtree.h:127
rt_valid_child_fn * valid_child
Definition rtree.h:165
int leafcard
Definition rtree.h:139
int BranchCount
Definition rtree.h:179
int rectsize
Definition rtree.h:130
unsigned char ndims
Definition rtree.h:123
rt_insert_fn * insert_rect
Definition rtree.h:162
struct RTree_Node * root
Definition rtree.h:167
int nodecard
Definition rtree.h:138
char overflow
Definition rtree.h:144
struct RTree_PartitionVars p
Definition rtree.h:175
struct NodeBuffer ** nb
Definition rtree.h:154
struct nstack * ns
Definition rtree.h:172
Definition rtree.h:97
off_t pos
Definition rtree.h:100
struct RTree_Node * sn
Definition rtree.h:98
int branch_id
Definition rtree.h:99
off_t pos
Definition rtree.h:60
struct RTree_Node * ptr
Definition rtree.h:59
int id
Definition rtree.h:58