Browse Source

rtree: add option to fine-tune rtree creation

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@53769 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 12 years ago
parent
commit
b38d9fb811
4 changed files with 25 additions and 2 deletions
  1. 21 0
      lib/vector/rtree/index.c
  2. 1 1
      lib/vector/rtree/indexf.c
  3. 1 1
      lib/vector/rtree/indexm.c
  4. 2 0
      lib/vector/rtree/rtree.h

+ 21 - 0
lib/vector/rtree/index.c

@@ -95,6 +95,9 @@ struct RTree *RTreeCreateTree(int fd, off_t rootpos, int ndims)
     n = RTreeAllocNode(new_rtree, 0);
     new_rtree->rootlevel = n->level = 0;       /* leaf */
     new_rtree->root = NULL;
+    
+    /* use overflow by default */
+    new_rtree->overflow = 1;
 
     if (fd > -1) {  /* file based */
 	/* nodecard and leafcard can be adjusted, must NOT be larger than MAXCARD */
@@ -182,6 +185,24 @@ struct RTree *RTreeCreateTree(int fd, off_t rootpos, int ndims)
 }
 
 /*!
+  \brief Enable/disable R*-tree forced reinsertion (overflow)
+
+  For dynamic R*-trees with runtime insertion and deletion, 
+  forced reinsertion results in a more compact tree, searches are a bit
+  faster. For static R*-trees (no insertion/deletion after creation)
+  forced reinsertion can be disabled at the cost of slower searches.
+
+  \param t pointer to RTree structure
+  \param overflow binary flag
+
+  \return nothing
+*/
+void RTreeSetOverflow(struct RTree *t, char overflow)
+{
+    t->overflow = overflow != 0;
+}
+
+/*!
   \brief Destroy an R*-Tree
 
   This method releases all memory allocated to a RTree. It deletes all 

+ 1 - 1
lib/vector/rtree/indexf.c

@@ -248,7 +248,7 @@ int RTreeInsertRectF(struct RTree_Rect *r, union RTree_Child child, int level,
     }
 
     /* R*-tree forced reinsertion: for each level only once */
-    memset(overflow, 1, MAXLEVEL);
+    memset(overflow, t->overflow, MAXLEVEL);
 
     result =
 	RTreeInsertRect2F(r, child, level, &newnode, &newnode_pos, t,

+ 1 - 1
lib/vector/rtree/indexm.c

@@ -195,7 +195,7 @@ int RTreeInsertRectM(struct RTree_Rect *r, union RTree_Child child, int level,
     struct RTree_Branch *b = &(t->tmpb1);
 
     /* R*-tree forced reinsertion: for each level only once */
-    memset(overflow, 1, MAXLEVEL);
+    memset(overflow, t->overflow, MAXLEVEL);
 
     result =
 	RTreeInsertRect2M(r, child, level, &newnode, t, &reInsertList,

+ 2 - 0
lib/vector/rtree/rtree.h

@@ -145,6 +145,7 @@ struct RTree
     int min_leaf_fill;      /* balance criteria for leaf removal */
     int minfill_node_split; /* balance criteria for splitting */
     int minfill_leaf_split; /* balance criteria for splitting */
+    char overflow;	    /* enable/disable overflow */
     
     /* free node positions for recycling */
     struct _recycle {
@@ -211,6 +212,7 @@ void RTreeSetRect4D(struct RTree_Rect *r, struct RTree *t, double x_min,
 int RTreeDeleteRect(struct RTree_Rect *, int, struct RTree *);
 void RTreePrintRect(struct RTree_Rect *, int, struct RTree *);
 struct RTree *RTreeCreateTree(int, off_t, int);
+void RTreeSetOverflow(struct RTree *, char);
 void RTreeDestroyTree(struct RTree *);
 int RTreeOverlap(struct RTree_Rect *, struct RTree_Rect *, struct RTree *);
 int RTreeContained(struct RTree_Rect *, struct RTree_Rect *, struct RTree *);