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