浏览代码

fixed loading index, some cleanup

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@38623 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 15 年之前
父节点
当前提交
254720c0a3
共有 1 个文件被更改,包括 11 次插入8 次删除
  1. 11 8
      lib/vector/diglib/spindex_rw.c

+ 11 - 8
lib/vector/diglib/spindex_rw.c

@@ -609,7 +609,7 @@ static off_t rtree_write_to_sidx(struct gvfile * fp, off_t startpos,
     s[top].branch_id = i = 0;
     s[top].sn = t->root;
 
-    /* some sort of inorder traversal */
+    /* some sort of postorder traversal */
     /* root node is written out last */
 
     while (top >= 0) {
@@ -618,15 +618,13 @@ static off_t rtree_write_to_sidx(struct gvfile * fp, off_t startpos,
 	if (s[top].sn->level > 0) {	/* this is an internal node in the tree */
 	    for (i = s[top].branch_id; i < t->nodecard; i++) {
 		s[top].pos[i] = 0;
-		if (n->branch[i].child > 0) {
+		if (n->branch[i].child != NULL) {
 		    s[top++].branch_id = i + 1;
 		    s[top].sn = n->branch[i].child;
 		    s[top].branch_id = 0;
 		    writeout = 0;
 		    break;
 		}
-		else if (n->branch[i].child < 0)
-		    G_fatal_error("corrupt spatial index");
 	    }
 	    if (writeout) {
 		/* nothing else found, ready to write out */
@@ -682,7 +680,6 @@ struct Node *rtree_load_from_sidx(struct gvfile * fp, off_t rootpos,
     int i, j, writeout;
     struct spidxstack
     {
-	struct Node *node[MAXCARD];	/* pointer to already loaded child node */
 	off_t childpos[MAXCARD];
 	off_t pos;		/* file position of child node */
 	struct Node sn;		/* stack node */
@@ -702,11 +699,18 @@ struct Node *rtree_load_from_sidx(struct gvfile * fp, off_t rootpos,
     for (j = 0; j < MAXCARD; j++) {
 	dig__fread_port_D(s[top].sn.branch[j].rect.boundary, NUMSIDES, fp);
 	dig__fread_port_O(&(s[top].childpos[j]), 1, fp, off_t_size);
+	if (s[top].sn.level == 0 && s[top].childpos[j]) {	/* leaf node */
+	    s[top].sn.branch[j].child =
+		(struct Node *)s[top].childpos[j];
+	}
+	else {
+	    s[top].sn.branch[j].child = NULL;
+	}
     }
 
     s[top].branch_id = i = 0;
 
-    /* some sort of inorder traversal */
+    /* some sort of postorder traversal */
     /* root node is written out last */
 
     while (top >= 0) {
@@ -714,7 +718,6 @@ struct Node *rtree_load_from_sidx(struct gvfile * fp, off_t rootpos,
 	writeout = 1;
 	if (s[top].sn.level > 0) {	/* this is an internal node in the tree */
 	    for (i = s[top].branch_id; i < t->nodecard; i++) {
-		s[top].sn.branch[i].child = NULL;
 		if (s[top].childpos[i] > 0) {
 		    s[top++].branch_id = i + 1;
 		    s[top].pos = last->childpos[i];
@@ -762,7 +765,7 @@ struct Node *rtree_load_from_sidx(struct gvfile * fp, off_t rootpos,
 	    top--;
 	    /* update child of parent node */
 	    if (top >= 0) {
-		s[top].node[s[top].branch_id - 1] = newnode;
+		s[top].sn.branch[s[top].branch_id - 1].child = newnode;
 	    }
 	}
     }