ms_bitarray msSearchDiskTree(char *filename, rectObj aoi, int debug) { SHPTreeHandle disktree; ms_bitarray status=NULL; disktree = msSHPDiskTreeOpen (filename, debug); if(!disktree) { /* only set this error IF debugging is turned on, gets annoying otherwise */ if(debug) msSetError(MS_NOTFOUND, "Unable to open spatial index for %s. In most cases you can safely ignore this message, otherwise check file names and permissions.", "msSearchDiskTree()", filename); return(NULL); } status = msAllocBitArray(disktree->nShapes); if(!status) { msSetError(MS_MEMERR, NULL, "msSearchDiskTree()"); msSHPDiskTreeClose( disktree ); return(NULL); } searchDiskTreeNode(disktree, aoi, status); msSHPDiskTreeClose( disktree ); return(status); }
char *msSearchDiskTree(const TCHAR *filename, rectObj aoi, int debug) { SHPTreeHandle disktree; char *status=NULL; disktree = msSHPDiskTreeOpen (filename, debug); if(!disktree) { #if MAPSHAPEERROR // only set this error IF debugging is turned on, gets annoying otherwise if(debug) msSetError(MS_IOERR, "Unable to open spatial index for %ls. In most cases you can safely ignore this message, otherwise check file names and permissions.", "msSearchDiskTree()", filename); #endif return(NULL); } status = msAllocBitArray(disktree->nShapes); if(!status) { #if MAPSHAPEERROR msSetError(MS_MEMERR, NULL, "msSearchDiskTree()"); #endif msSHPDiskTreeClose( disktree ); return(NULL); } searchDiskTreeNode(disktree, aoi, status); msSHPDiskTreeClose( disktree ); return(status); }
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; }