int SHPWriteTree(SHPTree *tree, const char *filename ) { char signature[4] = "SQT"; int i; char abyBuf[32]; FILE *fp; errno_t err; /* -------------------------------------------------------------------- */ /* Open the output file. */ /* -------------------------------------------------------------------- */ err = fopen_s(&fp, filename, "wb"); if( fp == NULL || err != 0) { return FALSE; } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((unsigned char *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Write the header. */ /* -------------------------------------------------------------------- */ memcpy( abyBuf+0, signature, 3 ); if( bBigEndian ) abyBuf[3] = 2; /* New MSB */ else abyBuf[3] = 1; /* New LSB */ abyBuf[4] = 1; /* version */ abyBuf[5] = 0; /* next 3 reserved */ abyBuf[6] = 0; abyBuf[7] = 0; fwrite( abyBuf, 8, 1, fp ); fwrite( &(tree->nTotalCount), 4, 1, fp ); /* write maxdepth */ fwrite( &(tree->nMaxDepth), 4, 1, fp ); /* -------------------------------------------------------------------- */ /* Write all the nodes "in order". */ /* -------------------------------------------------------------------- */ SHPWriteTreeNode( fp, tree->psRoot ); fclose( fp ); return TRUE; }
static void SHPWriteTreeNode( SAFile fp, SHPTreeNode *node, SAHooks* psHooks) { int i,j; int offset; unsigned char *pabyRec = NULL; assert( NULL != node ); offset = SHPGetSubNodeOffset(node); pabyRec = (unsigned char *) malloc(sizeof(double) * 4 + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); if( NULL == pabyRec ) { #ifdef USE_CPL CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); #endif assert( 0 ); return; } memcpy( pabyRec, &offset, 4); /* minx, miny, maxx, maxy */ memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); memcpy( pabyRec+36, &node->nShapeCount, 4); j = node->nShapeCount * sizeof(int); if( j ) memcpy( pabyRec+40, node->panShapeIds, j); memcpy( pabyRec+j+40, &node->nSubNodes, 4); psHooks->FWrite( pabyRec, 44+j, 1, fp ); free (pabyRec); for(i=0; i<node->nSubNodes; i++ ) { if(node->apsSubNode[i]) SHPWriteTreeNode( fp, node->apsSubNode[i], psHooks); } }
static void SHPWriteTreeNode( FILE *fp, SHPTreeNode *node) { int i,j; int offset; unsigned char *pabyRec = NULL; assert( NULL != node ); offset = SHPGetSubNodeOffset(node); pabyRec = (unsigned char *) malloc(sizeof(double) * 4 + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); if( NULL == pabyRec ) { assert( 0 ); return; } memcpy( pabyRec, &offset, 4); /* minx, miny, maxx, maxy */ memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); memcpy( pabyRec+36, &node->nShapeCount, 4); j = node->nShapeCount * sizeof(int); memcpy( pabyRec+40, node->panShapeIds, j); memcpy( pabyRec+j+40, &node->nSubNodes, 4); fwrite( pabyRec, 44+j, 1, fp ); free (pabyRec); for(i=0; i<node->nSubNodes; i++ ) { if(node->apsSubNode[i]) SHPWriteTreeNode( fp, node->apsSubNode[i]); } }
int SHPWriteTreeLL(SHPTree *tree, const char *filename, SAHooks* psHooks ) { char signature[4] = "SQT"; int i; char abyBuf[32]; SAFile fp; SAHooks sHooks; if (psHooks == NULL) { SASetupDefaultHooks( &sHooks ); psHooks = &sHooks; } /* -------------------------------------------------------------------- */ /* Open the output file. */ /* -------------------------------------------------------------------- */ fp = psHooks->FOpen(filename, "wb"); if( fp == NULL ) { return FALSE; } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((unsigned char *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Write the header. */ /* -------------------------------------------------------------------- */ memcpy( abyBuf+0, signature, 3 ); if( bBigEndian ) abyBuf[3] = 2; /* New MSB */ else abyBuf[3] = 1; /* New LSB */ abyBuf[4] = 1; /* version */ abyBuf[5] = 0; /* next 3 reserved */ abyBuf[6] = 0; abyBuf[7] = 0; psHooks->FWrite( abyBuf, 8, 1, fp ); psHooks->FWrite( &(tree->nTotalCount), 4, 1, fp ); /* write maxdepth */ psHooks->FWrite( &(tree->nMaxDepth), 4, 1, fp ); /* -------------------------------------------------------------------- */ /* Write all the nodes "in order". */ /* -------------------------------------------------------------------- */ SHPWriteTreeNode( fp, tree->psRoot, psHooks ); psHooks->FClose( fp ); return TRUE; }