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); } }
ms_bitarray msSearchTree(treeObj *tree, rectObj aoi) { ms_bitarray status=NULL; status = msAllocBitArray(tree->numshapes); if(!status) { msSetError(MS_MEMERR, NULL, "msSearchTree()"); return(NULL); } treeCollectShapeIds(tree->root, aoi, status); return(status); }
char *msSearchTree(treeObj *tree, rectObj aoi) { char *status=NULL; status = msAllocBitArray(tree->numshapes); if(!status) { #if MAPSHAPEERROR msSetError(MS_MEMERR, NULL, "msSearchTree()"); #endif return(NULL); } treeCollectShapeIds(tree->root, aoi, status); return(status); }