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

📄 gridlib.cpp

📁 读写ArcInfo Binary Grid的c代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }    CPLFree( pabyIntermediate );    return( CE_None );}/************************************************************************//*                          AIGProcessBlock()                           *//*                                                                      *//*      Process a block using ``D7'', ``E0'' or ``DF'' compression.     *//************************************************************************/static CPLErr AIGProcessBlock( GByte *pabyCur, int nDataSize, int nMin, int nMagic,                         int nBlockXSize, int nBlockYSize, GInt32 * panData ){    int		nTotPixels, nPixels;    int		i;/* ==================================================================== *//*     Process runs till we are done.                                  *//* ==================================================================== */    nTotPixels = nBlockXSize * nBlockYSize;    nPixels = 0;    while( nPixels < nTotPixels && nDataSize > 0 )    {        int	nMarker = *(pabyCur++);        nDataSize--;        /* -------------------------------------------------------------------- *//*      Repeat data - four byte data block (0xE0)                       *//* -------------------------------------------------------------------- */        if( nMagic == 0xE0 )        {            GInt32	nValue;                        if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    nValue = 0;            memcpy( &nValue, pabyCur, 4 );            pabyCur += 4;            nDataSize -= 4;            nValue = CPL_MSBWORD32( nValue );            nValue += nMin;            for( i = 0; i < nMarker; i++ )                panData[nPixels++] = nValue;        }        /* -------------------------------------------------------------------- *//*      Repeat data - two byte data block (0xF0)                        *//* -------------------------------------------------------------------- */        else if( nMagic == 0xF0 )        {            GInt32	nValue;                        if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    nValue = (pabyCur[0] * 256 + pabyCur[1]) + nMin;            pabyCur += 2;            for( i = 0; i < nMarker; i++ )                panData[nPixels++] = nValue;        }        /* -------------------------------------------------------------------- *//*      Repeat data - one byte data block (0xFC)                        *//* -------------------------------------------------------------------- */        else if( nMagic == 0xFC || nMagic == 0xF8 )        {            GInt32	nValue;            if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    nValue = *(pabyCur++) + nMin;            nDataSize--;                        for( i = 0; i < nMarker; i++ )                panData[nPixels++] = nValue;        }        /* -------------------------------------------------------------------- *//*      Repeat data - no actual data, just assign minimum (0xDF)        *//* -------------------------------------------------------------------- */        else if( nMagic == 0xDF && nMarker < 128 )        {            if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    for( i = 0; i < nMarker; i++ )                panData[nPixels++] = nMin;        }        /* -------------------------------------------------------------------- *//*      Literal data (0xD7): 8bit values.                               *//* -------------------------------------------------------------------- */        else if( nMagic == 0xD7 && nMarker < 128 )        {            if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    while( nMarker > 0 && nDataSize > 0 )            {                panData[nPixels++] = *(pabyCur++) + nMin;                nMarker--;                nDataSize--;            }        }/* -------------------------------------------------------------------- *//*      Literal data (0xCF): 16 bit values.                             *//* -------------------------------------------------------------------- */        else if( nMagic == 0xCF && nMarker < 128 )        {            GInt32	nValue;                        if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    while( nMarker > 0 && nDataSize > 0 )            {                nValue = pabyCur[0] * 256 + pabyCur[1] + nMin;                panData[nPixels++] = nValue;                pabyCur += 2;                nMarker--;                nDataSize -= 2;            }        }/* -------------------------------------------------------------------- *//*      Nodata repeat                                                   *//* -------------------------------------------------------------------- */        else if( nMarker > 128 )        {            nMarker = 256 - nMarker;            if( nMarker + nPixels > nTotPixels )            {                CPLError( CE_Failure, CPLE_AppDefined,                           "Run too long in AIGProcessBlock, needed %d values, got %d.",                           nTotPixels - nPixels, nMarker );                return CE_Failure;            }                    while( nMarker > 0 )            {                panData[nPixels++] = ESRI_GRID_NO_DATA;                nMarker--;            }        }        else        {            return CE_Failure;        }    }    if( nPixels < nTotPixels || nDataSize < 0 )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Ran out of data processing block with nMagic=%d.",                   nMagic );        return CE_Failure;    }        return CE_None;}/************************************************************************//*                            AIGReadBlock()                            *//*                                                                      *//*      Read a single block of integer grid data.                       *//************************************************************************/CPLErr AIGReadBlock( FILE * fp, int nBlockOffset, int nBlockSize,                     int nBlockXSize, int nBlockYSize,                     GInt32 *panData, int nCellType ){    GByte	*pabyRaw, *pabyCur;    CPLErr	eErr;    int		i, nMagic, nMinSize=0, nDataSize;    GInt32 	nMin = 0;/* -------------------------------------------------------------------- *//*      If the block has zero size it is all dummies.                   *//* -------------------------------------------------------------------- */    if( nBlockSize == 0 )    {        for( i = 0; i < nBlockXSize * nBlockYSize; i++ )            panData[i] = ESRI_GRID_NO_DATA;        return( CE_None );    }    /* -------------------------------------------------------------------- *//*      Read the block into memory.                                     *//* -------------------------------------------------------------------- */    pabyRaw = (GByte *) CPLMalloc(nBlockSize+2);    if( VSIFSeek( fp, nBlockOffset, SEEK_SET ) != 0         || VSIFRead( pabyRaw, nBlockSize+2, 1, fp ) != 1 )    {        memset( panData, 0, nBlockXSize*nBlockYSize*4 );        CPLError( CE_Failure, CPLE_AppDefined,                   "Read of %d bytes from offset %d for grid block failed.",                   nBlockSize+2, nBlockOffset );                          return CE_Failure;    }/* -------------------------------------------------------------------- *//*      Verify the block size.                                          *//* -------------------------------------------------------------------- */    if( nBlockSize != (pabyRaw[0]*256 + pabyRaw[1])*2 )    {        memset( panData, 0, nBlockXSize*nBlockYSize*4 );        CPLError( CE_Failure, CPLE_AppDefined,                   "Block is corrupt, block size was %d, but expected to be %d.",                   (pabyRaw[0]*256 + pabyRaw[1])*2, nBlockSize );                          return CE_Failure;    }    nDataSize = nBlockSize;    /* -------------------------------------------------------------------- *//*      Handle float files directly.                                    *//* -------------------------------------------------------------------- */    if( nCellType == AIG_CELLTYPE_FLOAT )    {        AIGProcessRaw32BitFloatBlock( pabyRaw + 2, nDataSize, 0,                                       nBlockXSize, nBlockYSize,                                       (float *) panData );        CPLFree( pabyRaw );        return CE_None;    }/* -------------------------------------------------------------------- *//*      Collect minimum value.                                          *//* -------------------------------------------------------------------- */    pabyCur = pabyRaw + 2;    nMinSize = pabyCur[1];    pabyCur += 2;    if( nMinSize > 4 )    {        memset( panData, 0, nBlockXSize*nBlockYSize*4 );        CPLError( CE_Failure, CPLE_AppDefined,                   "Corrupt 'minsize' of %d in block header.  Read aborted.",                   nMinSize );        return CE_Failure;    }        if( nMinSize == 4 )    {        memcpy( &nMin, pabyCur, 4 );        nMin = CPL_MSBWORD32( nMin );        pabyCur += 4;    }    else    {        nMin = 0;        for( i = 0; i < nMinSize; i++ )        {            nMin = nMin * 256 + *pabyCur;            pabyCur++;        }        if( pabyRaw[4] > 127 )        {            if( nMinSize == 2 )                nMin = nMin - 65536;            else if( nMinSize == 1 )                nMin = nMin - 256;            else if( nMinSize == 3 )                nMin = nMin - 256*256*256;        }    }        nDataSize -= 2+nMinSize;    /* -------------------------------------------------------------------- *//*	Call an apppropriate handler depending on magic code.		*//* -------------------------------------------------------------------- */    nMagic = pabyRaw[2];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -