static void searchDiskTreeNode(SHPTreeHandle disktree, rectObj aoi, ms_bitarray status) { int i; ms_int32 offset; ms_int32 numshapes, numsubnodes; rectObj rect; int *ids=NULL; fread( &offset, 4, 1, disktree->fp ); if ( disktree->needswap ) SwapWord ( 4, &offset ); fread( &rect, sizeof(rectObj), 1, disktree->fp ); if ( disktree->needswap ) SwapWord ( 8, &rect.minx ); if ( disktree->needswap ) SwapWord ( 8, &rect.miny ); if ( disktree->needswap ) SwapWord ( 8, &rect.maxx ); if ( disktree->needswap ) SwapWord ( 8, &rect.maxy ); fread( &numshapes, 4, 1, disktree->fp ); if ( disktree->needswap ) SwapWord ( 4, &numshapes ); if(!msRectOverlap(&rect, &aoi)) { /* skip rest of this node and sub-nodes */ offset += numshapes*sizeof(ms_int32) + sizeof(ms_int32); fseek(disktree->fp, offset, SEEK_CUR); return; } if(numshapes > 0) { ids = (int *)msSmallMalloc(numshapes*sizeof(ms_int32)); fread( ids, numshapes*sizeof(ms_int32), 1, disktree->fp ); if (disktree->needswap ) { for( i=0; i<numshapes; i++ ) { SwapWord( 4, &ids[i] ); msSetBit(status, ids[i], 1); } } else { for(i=0; i<numshapes; i++) msSetBit(status, ids[i], 1); } free(ids); } fread( &numsubnodes, 4, 1, disktree->fp ); if ( disktree->needswap ) SwapWord ( 4, &numsubnodes ); for(i=0; i<numsubnodes; i++) searchDiskTreeNode(disktree, aoi, status); return; }
static void treeCollectShapeIds(treeNodeObj *node, rectObj aoi, ms_bitarray status) { int i; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if(!msRectOverlap(&node->rect, &aoi)) return; /* -------------------------------------------------------------------- */ /* Add the local nodes shapeids to the list. */ /* -------------------------------------------------------------------- */ for(i=0; i<node->numshapes; i++) msSetBit(status, node->ids[i], 1); /* -------------------------------------------------------------------- */ /* Recurse to subnodes if they exist. */ /* -------------------------------------------------------------------- */ for(i=0; i<node->numsubnodes; i++) { if(node->subnode[i]) treeCollectShapeIds(node->subnode[i], aoi, status); } }
// Function to filter search results further against feature bboxes void msFilterTreeSearch(shapefileObj *shp, char *status, rectObj search_rect) { int i; rectObj shape_rect; for(i=0; i<shp->numshapes; i++) { /* for each shape */ if(msGetBit(status, i)) { if(!msSHPReadBounds(shp->hSHP, i, &shape_rect)) if(msRectOverlap(&shape_rect, &search_rect) != MS_TRUE) msSetBit(status, i, 0); } } }
/* Function to filter search results further against feature bboxes */ void msFilterTreeSearch(shapefileObj *shp, ms_bitarray status, rectObj search_rect) { int i; rectObj shape_rect; i = msGetNextBit(status, 0, shp->numshapes); while(i >= 0) { if(msSHPReadBounds(shp->hSHP, i, &shape_rect) == MS_SUCCESS) { if(msRectOverlap(&shape_rect, &search_rect) != MS_TRUE) { msSetBit(status, i, 0); } } i = msGetNextBit(status, i+1, shp->numshapes); } }