int main( int argc, char ** argv ) { AIGInfo_t *psInfo; GUInt32 *panRaster; int i, j; int bMagic = FALSE, bSupressMagic = FALSE; /* -------------------------------------------------------------------- */ /* Process arguments. */ /* -------------------------------------------------------------------- */ while( argc > 1 && argv[1][0] == '-' ) { if( EQUAL(argv[1],"-magic") ) bMagic = TRUE; else if( EQUAL(argv[1],"-nomagic") ) bSupressMagic = TRUE; argc--; argv++; } if( argc < 2 ) { printf( "Usage: aitest [-magic] coverage [block numbers...]\n" ); exit( 1 ); } /* -------------------------------------------------------------------- */ /* Open dataset. */ /* -------------------------------------------------------------------- */ psInfo = AIGOpen( argv[1], "r" ); if( psInfo == NULL ) exit( 1 ); AIGAccessTile( psInfo, 0, 0 ); /* -------------------------------------------------------------------- */ /* Dump general information */ /* -------------------------------------------------------------------- */ printf( "%d pixels x %d lines.\n", psInfo->nPixels, psInfo->nLines ); printf( "Lower Left = (%f,%f) Upper Right = (%f,%f)\n", psInfo->dfLLX, psInfo->dfLLY, psInfo->dfURX, psInfo->dfURY ); if( psInfo->nCellType == AIG_CELLTYPE_INT ) printf( "Integer coverage, %dx%d blocks.\n", psInfo->nBlockXSize, psInfo->nBlockYSize ); else printf( "Floating point coverage, %dx%d blocks.\n", psInfo->nBlockXSize, psInfo->nBlockYSize ); printf( "Stats - Min=%f, Max=%f, Mean=%f, StdDev=%f\n", psInfo->dfMin, psInfo->dfMax, psInfo->dfMean, psInfo->dfStdDev ); /* -------------------------------------------------------------------- */ /* Do we want a dump of all the ``magic'' numbers for */ /* instantated blocks? */ /* -------------------------------------------------------------------- */ if( !bSupressMagic ) DumpMagic( psInfo, bMagic ); /* -------------------------------------------------------------------- */ /* Read a block, and report it's contents. */ /* -------------------------------------------------------------------- */ panRaster = (GUInt32 *) CPLMalloc(psInfo->nBlockXSize * psInfo->nBlockYSize * 4); while( argc > 2 && (atoi(argv[2]) > 0 || argv[2][0] == '0') ) { int nBlock = atoi(argv[2]); CPLErr eErr; AIGTileInfo *psTInfo = psInfo->pasTileInfo + 0; argv++; argc--; eErr = AIGReadBlock( psTInfo->fpGrid, psTInfo->panBlockOffset[nBlock], psTInfo->panBlockSize[nBlock], psInfo->nBlockXSize, psInfo->nBlockYSize, panRaster, psInfo->nCellType ); printf( "\nBlock %d:\n", nBlock ); if( eErr != CE_None ) { printf( " Error! Skipping block.\n" ); continue; } for( j = 0; j < psInfo->nBlockYSize; j++ ) { for( i = 0; i < psInfo->nBlockXSize; i++ ) { if( i > 18 ) { printf( "..." ); break; } if( panRaster[i+j*psInfo->nBlockXSize] == ESRI_GRID_NO_DATA ) printf( "-*- " ); else if( psInfo->nCellType == AIG_CELLTYPE_FLOAT ) printf( "%f ", ((float *) panRaster)[i+j*psInfo->nBlockXSize] ); else printf( "%3d ", panRaster[i+j*psInfo->nBlockXSize] ); } printf( "\n" ); } } CPLFree( panRaster ); AIGClose( psInfo ); exit( 0 ); }
CPLErr AIGReadFloatTile( AIGInfo_t * psInfo, int nBlockXOff, int nBlockYOff, float *pafData ) { int nBlockID; CPLErr eErr; int iTileX, iTileY; AIGTileInfo *psTInfo; /* -------------------------------------------------------------------- */ /* Compute our tile, and ensure it is accessable (open). Then */ /* reduce block x/y values to be the block within that tile. */ /* -------------------------------------------------------------------- */ iTileX = nBlockXOff / psInfo->nBlocksPerRow; iTileY = nBlockYOff / psInfo->nBlocksPerColumn; eErr = AIGAccessTile( psInfo, iTileX, iTileY ); if( eErr == CE_Failure ) return eErr; psTInfo = psInfo->pasTileInfo + iTileX + iTileY * psInfo->nTilesPerRow; nBlockXOff -= iTileX * psInfo->nBlocksPerRow; nBlockYOff -= iTileY * psInfo->nBlocksPerColumn; /* -------------------------------------------------------------------- */ /* Request for tile from a file which does not exist - treat as */ /* all nodata. */ /* -------------------------------------------------------------------- */ if( psTInfo->fpGrid == NULL ) { int i; for( i = psInfo->nBlockXSize * psInfo->nBlockYSize - 1; i >= 0; i-- ) pafData[i] = ESRI_GRID_FLOAT_NO_DATA; return CE_None; } /* -------------------------------------------------------------------- */ /* validate block id. */ /* -------------------------------------------------------------------- */ nBlockID = nBlockXOff + nBlockYOff * psInfo->nBlocksPerRow; if( nBlockID < 0 || nBlockID >= psInfo->nBlocksPerRow * psInfo->nBlocksPerColumn ) { CPLError( CE_Failure, CPLE_AppDefined, "Illegal block requested." ); return CE_Failure; } if( nBlockID >= psTInfo->nBlocks ) { int i; CPLDebug( "AIG", "Request legal block, but from beyond end of block map.\n" "Assuming all nodata." ); for( i = psInfo->nBlockXSize * psInfo->nBlockYSize - 1; i >= 0; i-- ) pafData[i] = ESRI_GRID_FLOAT_NO_DATA; return CE_None; } /* -------------------------------------------------------------------- */ /* Read block. */ /* -------------------------------------------------------------------- */ eErr = AIGReadBlock( psTInfo->fpGrid, psTInfo->panBlockOffset[nBlockID], psTInfo->panBlockSize[nBlockID], psInfo->nBlockXSize, psInfo->nBlockYSize, (GInt32 *) pafData, psInfo->nCellType, psInfo->bCompressed ); /* -------------------------------------------------------------------- */ /* Perform integer post processing. */ /* -------------------------------------------------------------------- */ if( eErr == CE_None && psInfo->nCellType == AIG_CELLTYPE_INT ) { GUInt32 *panData = (GUInt32 *) pafData; int i, nPixels = psInfo->nBlockXSize * psInfo->nBlockYSize; for( i = 0; i < nPixels; i++ ) { pafData[i] = (float) panData[i]; } } return( eErr ); }