⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gridlib.cpp

📁 读写ArcInfo Binary Grid的c代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -