📄 gridlib.cpp
字号:
if( nMagic == 0x08 ) { AIGProcessRawBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else if( nMagic == 0x04 ) { AIGProcessRaw4BitBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else if( nMagic == 0x01 ) { AIGProcessRaw1BitBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else if( nMagic == 0x00 ) { AIGProcessIntConstBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else if( nMagic == 0x10 ) { AIGProcessRaw16BitBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else if( nMagic == 0xFF ) { AIGProcessFFBlock( pabyCur, nDataSize, nMin, nBlockXSize, nBlockYSize, panData ); } else { eErr = AIGProcessBlock( pabyCur, nDataSize, nMin, nMagic, nBlockXSize, nBlockYSize, panData ); if( eErr == CE_Failure ) { static int bHasWarned = FALSE; for( i = 0; i < nBlockXSize * nBlockYSize; i++ ) panData[i] = ESRI_GRID_NO_DATA; if( !bHasWarned ) { CPLError( CE_Warning, CPLE_AppDefined, "Unsupported Arc/Info Binary Grid tile of type 0x%X" " encountered.\n" "This and subsequent unsupported tile types set to" " no data value.\n", nMagic ); bHasWarned = TRUE; } } } CPLFree( pabyRaw ); return CE_None;}/************************************************************************//* AIGReadHeader() *//* *//* Read the hdr.adf file, and populate the given info structure *//* appropriately. *//************************************************************************/CPLErr AIGReadHeader( const char * pszCoverName, AIGInfo_t * psInfo ){ char *pszHDRFilename; FILE *fp; GByte abyData[308];/* -------------------------------------------------------------------- *//* Open the file hdr.adf file. *//* -------------------------------------------------------------------- */ pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+30); sprintf( pszHDRFilename, "%s/hdr.adf", pszCoverName ); fp = AIGLLOpen( pszHDRFilename, "rb" ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open grid header file:\n%s\n", pszHDRFilename ); CPLFree( pszHDRFilename ); return( CE_Failure ); } CPLFree( pszHDRFilename );/* -------------------------------------------------------------------- *//* Read the whole file (we expect it to always be 308 bytes *//* long. *//* -------------------------------------------------------------------- */ VSIFRead( abyData, 1, 308, fp ); VSIFClose( fp ); /* -------------------------------------------------------------------- *//* Read the block size information. *//* -------------------------------------------------------------------- */ memcpy( &(psInfo->nCellType), abyData+16, 4 ); memcpy( &(psInfo->nBlocksPerRow), abyData+288, 4 ); memcpy( &(psInfo->nBlocksPerColumn), abyData+292, 4 ); memcpy( &(psInfo->nBlockXSize), abyData+296, 4 ); memcpy( &(psInfo->nBlockYSize), abyData+304, 4 ); memcpy( &(psInfo->dfCellSizeX), abyData+256, 8 ); memcpy( &(psInfo->dfCellSizeY), abyData+264, 8 ); #ifdef CPL_LSB psInfo->nCellType = CPL_SWAP32( psInfo->nCellType ); psInfo->nBlocksPerRow = CPL_SWAP32( psInfo->nBlocksPerRow ); psInfo->nBlocksPerColumn = CPL_SWAP32( psInfo->nBlocksPerColumn ); psInfo->nBlockXSize = CPL_SWAP32( psInfo->nBlockXSize ); psInfo->nBlockYSize = CPL_SWAP32( psInfo->nBlockYSize ); CPL_SWAPDOUBLE( &(psInfo->dfCellSizeX) ); CPL_SWAPDOUBLE( &(psInfo->dfCellSizeY) );#endif return( CE_None );}/************************************************************************//* AIGReadBlockIndex() *//* *//* Read the w001001x.adf file, and populate the given info *//* structure with the block offsets, and sizes. *//************************************************************************/CPLErr AIGReadBlockIndex( const char * pszCoverName, AIGInfo_t * psInfo ){ char *pszHDRFilename; FILE *fp; int nLength, i; GInt32 nValue; GUInt32 *panIndex;/* -------------------------------------------------------------------- *//* Open the file hdr.adf file. *//* -------------------------------------------------------------------- */ pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+40); sprintf( pszHDRFilename, "%s/w001001x.adf", pszCoverName ); fp = AIGLLOpen( pszHDRFilename, "rb" ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open grid block index file:\n%s\n", pszHDRFilename ); CPLFree( pszHDRFilename ); return( CE_Failure ); } CPLFree( pszHDRFilename );/* -------------------------------------------------------------------- *//* Get the file length (in 2 byte shorts) *//* -------------------------------------------------------------------- */ VSIFSeek( fp, 24, SEEK_SET ); VSIFRead( &nValue, 1, 4, fp ); nLength = CPL_MSBWORD32(nValue) * 2;/* -------------------------------------------------------------------- *//* Allocate buffer, and read the file (from beyond the header) *//* into the buffer. *//* -------------------------------------------------------------------- */ psInfo->nBlocks = (nLength-100) / 8; panIndex = (GUInt32 *) CPLMalloc(psInfo->nBlocks * 8); VSIFSeek( fp, 100, SEEK_SET ); VSIFRead( panIndex, 8, psInfo->nBlocks, fp ); VSIFClose( fp );/* -------------------------------------------------------------------- *//* Allocate AIGInfo block info arrays. *//* -------------------------------------------------------------------- */ psInfo->panBlockOffset = (int *) CPLMalloc(4 * psInfo->nBlocks); psInfo->panBlockSize = (int *) CPLMalloc(4 * psInfo->nBlocks);/* -------------------------------------------------------------------- *//* Populate the block information. *//* -------------------------------------------------------------------- */ for( i = 0; i < psInfo->nBlocks; i++ ) { psInfo->panBlockOffset[i] = CPL_MSBWORD32(panIndex[i*2]) * 2; psInfo->panBlockSize[i] = CPL_MSBWORD32(panIndex[i*2+1]) * 2; } CPLFree( panIndex ); return( CE_None );}/************************************************************************//* AIGReadBounds() *//* *//* Read the dblbnd.adf file for the georeferenced bounds. *//************************************************************************/CPLErr AIGReadBounds( const char * pszCoverName, AIGInfo_t * psInfo ){ char *pszHDRFilename; FILE *fp; double adfBound[4];/* -------------------------------------------------------------------- *//* Open the file dblbnd.adf file. *//* -------------------------------------------------------------------- */ pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+40); sprintf( pszHDRFilename, "%s/dblbnd.adf", pszCoverName ); fp = AIGLLOpen( pszHDRFilename, "rb" ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open grid bounds file:\n%s\n", pszHDRFilename ); CPLFree( pszHDRFilename ); return( CE_Failure ); } CPLFree( pszHDRFilename );/* -------------------------------------------------------------------- *//* Get the contents - four doubles. *//* -------------------------------------------------------------------- */ VSIFRead( adfBound, 1, 32, fp ); VSIFClose( fp );#ifdef CPL_LSB CPL_SWAPDOUBLE(adfBound+0); CPL_SWAPDOUBLE(adfBound+1); CPL_SWAPDOUBLE(adfBound+2); CPL_SWAPDOUBLE(adfBound+3);#endif psInfo->dfLLX = adfBound[0]; psInfo->dfLLY = adfBound[1]; psInfo->dfURX = adfBound[2]; psInfo->dfURY = adfBound[3]; return( CE_None );}/************************************************************************//* AIGReadStatistics() *//* *//* Read the sta.adf file for the layer statistics. *//************************************************************************/CPLErr AIGReadStatistics( const char * pszCoverName, AIGInfo_t * psInfo ){ char *pszHDRFilename; FILE *fp; double adfStats[4]; psInfo->dfMin = 0.0; psInfo->dfMax = 0.0; psInfo->dfMean = 0.0; psInfo->dfStdDev = 0.0;/* -------------------------------------------------------------------- *//* Open the file sta.adf file. *//* -------------------------------------------------------------------- */ pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+40); sprintf( pszHDRFilename, "%s/sta.adf", pszCoverName ); fp = AIGLLOpen( pszHDRFilename, "rb" ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open grid statistics file:\n%s\n", pszHDRFilename ); CPLFree( pszHDRFilename ); return( CE_Failure ); } CPLFree( pszHDRFilename );/* -------------------------------------------------------------------- *//* Get the contents - four doubles. *//* -------------------------------------------------------------------- */ VSIFRead( adfStats, 1, 32, fp ); VSIFClose( fp );#ifdef CPL_LSB CPL_SWAPDOUBLE(adfStats+0); CPL_SWAPDOUBLE(adfStats+1); CPL_SWAPDOUBLE(adfStats+2); CPL_SWAPDOUBLE(adfStats+3);#endif psInfo->dfMin = adfStats[0]; psInfo->dfMax = adfStats[1]; psInfo->dfMean = adfStats[2]; psInfo->dfStdDev = adfStats[3]; return( CE_None );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -