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

📄 aigopen.cpp

📁 读写ArcInfo Binary Grid的c代码
💻 CPP
字号:
/****************************************************************************** * $Id: aigopen.c,v 1.15 2002/11/11 18:29:03 warmerda Exp $ * * Project:  Arc/Info Binary Grid Translator * Purpose:  Grid file access cover API for non-GDAL use. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: aigopen.c,v $ * Revision 1.15  2002/11/11 18:29:03  warmerda * added AIGLLOpen() to support upper case names too * * Revision 1.14  2002/11/05 03:19:08  warmerda * avoid nodata remapping in gridlib, use GInt32 not GUInt for image data * * Revision 1.13  2002/10/31 03:08:47  warmerda * fixed email * * Revision 1.12  2002/05/14 21:38:57  warmerda * fixed up nPixel and nLines calculation to avoid roundoff error * * Revision 1.11  2001/07/18 04:51:56  warmerda * added CPL_CVSID * * Revision 1.10  2000/11/09 06:22:40  warmerda * save cover name * * Revision 1.9  2000/09/13 14:42:38  warmerda * Improved casting thanks for Ian Macleod (Geosoft). * * Revision 1.8  2000/02/18 14:47:12  warmerda * Avoid warnings. * * Revision 1.7  2000/02/18 04:55:02  warmerda * Set bHasWarned flag. * * Revision 1.6  1999/07/23 14:04:34  warmerda * Removed extra printf. * * Revision 1.5  1999/06/28 01:21:39  warmerda * added support for selecting .adf files as well as coverage dir * * Revision 1.4  1999/05/17 01:52:35  warmerda * Fixed argument type problem. * * Revision 1.3  1999/04/21 16:51:30  warmerda * fixed up floating point support * * Revision 1.2  1999/02/04 22:15:33  warmerda * fleshed out implementation * * Revision 1.1  1999/02/03 14:12:56  warmerda * New */
#include "stdafx.h"#include "aigrid.h"
CPL_CVSID("$Id: aigopen.c,v 1.15 2002/11/11 18:29:03 warmerda Exp $");/************************************************************************//*                              AIGOpen()                               *//************************************************************************/AIGInfo_t *AIGOpen( const char * pszInputName, const char * pszAccess ){    AIGInfo_t	*psInfo;    char	*pszHDRFilename;    char        *pszCoverName;    (void) pszAccess;/* -------------------------------------------------------------------- *//*      If the pass name ends in .adf assume a file within the          *//*      coverage has been selected, and strip that off the coverage     *//*      name.                                                           *//* -------------------------------------------------------------------- */    pszCoverName = CPLStrdup( pszInputName );    if( EQUAL(pszCoverName+strlen(pszCoverName)-4, ".adf") )    {        int      i;        for( i = strlen(pszCoverName)-1; i > 0; i-- )        {            if( pszCoverName[i] == '\\' || pszCoverName[i] == '/' )            {                pszCoverName[i] = '\0';                break;            }        }    }/* -------------------------------------------------------------------- *//*      Allocate info structure.                                        *//* -------------------------------------------------------------------- */    psInfo = (AIGInfo_t *) CPLCalloc(sizeof(AIGInfo_t),1);    psInfo->bHasWarned = FALSE;    psInfo->pszCoverName = pszCoverName;/* -------------------------------------------------------------------- *//*      Read the header file.                                           *//* -------------------------------------------------------------------- */    if( AIGReadHeader( pszCoverName, psInfo ) != CE_None )    {        CPLFree( pszCoverName );        CPLFree( psInfo );        return NULL;    }/* -------------------------------------------------------------------- *//*      Open the file w001001.adf file itself.                          *//* -------------------------------------------------------------------- */    pszHDRFilename = (char *) CPLMalloc(strlen(pszCoverName)+40);    sprintf( pszHDRFilename, "%s/w001001.adf", pszCoverName );    psInfo->fpGrid = AIGLLOpen( pszHDRFilename, "rb" );        if( psInfo->fpGrid == NULL )    {        CPLError( CE_Failure, CPLE_OpenFailed,                  "Failed to open grid file:\n%s\n",                  pszHDRFilename );        CPLFree( psInfo );        CPLFree( pszHDRFilename );        CPLFree( pszCoverName );        return( NULL );    }    CPLFree( pszHDRFilename );    pszHDRFilename = NULL;    /* -------------------------------------------------------------------- *//*      Read the block index file.                                      *//* -------------------------------------------------------------------- */    if( AIGReadBlockIndex( pszCoverName, psInfo ) != CE_None )    {        VSIFClose( psInfo->fpGrid );                CPLFree( psInfo );        return NULL;    }/* -------------------------------------------------------------------- *//*      Read the extents.                                               *//* -------------------------------------------------------------------- */    if( AIGReadBounds( pszCoverName, psInfo ) != CE_None )    {        VSIFClose( psInfo->fpGrid );                CPLFree( psInfo );        return NULL;    }/* -------------------------------------------------------------------- *//*      Read the statistics.                                            *//* -------------------------------------------------------------------- */    if( AIGReadStatistics( pszCoverName, psInfo ) != CE_None )    {        VSIFClose( psInfo->fpGrid );                CPLFree( psInfo );        return NULL;    }/* -------------------------------------------------------------------- *//*      Compute the number of pixels and lines.                         *//* -------------------------------------------------------------------- */    psInfo->nPixels = (int)        ((psInfo->dfURX - psInfo->dfLLX + 0.5 * psInfo->dfCellSizeX) 		/ psInfo->dfCellSizeX);    psInfo->nLines = (int)        ((psInfo->dfURY - psInfo->dfLLY + 0.5 * psInfo->dfCellSizeY) 		/ psInfo->dfCellSizeY);        return( psInfo );}/************************************************************************//*                            AIGReadTile()                             *//************************************************************************/CPLErr AIGReadTile( AIGInfo_t * psInfo, int nBlockXOff, int nBlockYOff,                    GInt32 *panData ){    int		nBlockID;    CPLErr	eErr;    nBlockID = nBlockXOff + nBlockYOff * psInfo->nBlocksPerRow;    if( nBlockID < 0 || nBlockID >= psInfo->nBlocks )    {        CPLAssert( FALSE );        return CE_Failure;    }        eErr = AIGReadBlock( psInfo->fpGrid,                         psInfo->panBlockOffset[nBlockID],                         psInfo->panBlockSize[nBlockID],                         psInfo->nBlockXSize, psInfo->nBlockYSize,                         panData, psInfo->nCellType );    if( eErr == CE_None && psInfo->nCellType == AIG_CELLTYPE_FLOAT )    {        float	*pafData = (float *) panData;        int	i, nPixels = psInfo->nBlockXSize * psInfo->nBlockYSize;        for( i = 0; i < nPixels; i++ )        {            panData[i] = (int) pafData[i];        }    }    return( eErr );}/************************************************************************//*                          AIGReadFloatTile()                          *//************************************************************************/CPLErr AIGReadFloatTile( AIGInfo_t * psInfo, int nBlockXOff, int nBlockYOff,                         float *pafData ){    int		nBlockID;    CPLErr	eErr;    nBlockID = nBlockXOff + nBlockYOff * psInfo->nBlocksPerRow;    if( nBlockID < 0 || nBlockID >= psInfo->nBlocks )    {        CPLAssert( FALSE );        return CE_Failure;    }        eErr = AIGReadBlock( psInfo->fpGrid,                         psInfo->panBlockOffset[nBlockID],                         psInfo->panBlockSize[nBlockID],                         psInfo->nBlockXSize, psInfo->nBlockYSize,                         (GInt32 *) pafData, psInfo->nCellType );    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 );}/************************************************************************//*                              AIGClose()                              *//************************************************************************/void AIGClose( AIGInfo_t * psInfo ){    VSIFClose( psInfo->fpGrid );    CPLFree( psInfo->panBlockOffset );    CPLFree( psInfo->panBlockSize );    CPLFree( psInfo->pszCoverName );    CPLFree( psInfo );}/************************************************************************//*                             AIGLLOpen()                              *//*                                                                      *//*      Low level fopen() replacement that will try provided, and       *//*      upper cased versions of file names.                             *//************************************************************************/FILE *AIGLLOpen( const char *pszFilename, const char *pszAccess ){    FILE	*fp;    fp = VSIFOpen( pszFilename, pszAccess );    if( fp == NULL )    {        char *pszUCFilename = CPLStrdup(pszFilename);        int  i;        for( i = strlen(pszUCFilename)-1;              pszUCFilename[i] != '/' && pszUCFilename[i] != '\\';             i-- )        {            pszUCFilename[i] = toupper(pszUCFilename[i]);        }                fp = VSIFOpen( pszUCFilename, pszAccess );        CPLFree( pszUCFilename );    }    return fp;}

⌨️ 快捷键说明

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