gdal/frmts/aigrid/aitest.c

237 строки
8.5 KiB
C

/******************************************************************************
* $Id$
*
* Project: Arc/Info Binary Grid Translator
* Purpose: Test mainline for examining AIGrid files.
* 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.
*****************************************************************************/
#include "aigrid.h"
/************************************************************************/
/* DumpMagic() */
/* */
/* Dump the magic ``block type byte'' for each existing block. */
/************************************************************************/
static void DumpMagic(AIGInfo_t *psInfo, int bVerbose)
{
int i;
AIGTileInfo *psTInfo = psInfo->pasTileInfo + 0;
for (i = 0; i < psTInfo->nBlocks; i++)
{
GByte byMagic;
int bReport = bVerbose;
unsigned char abyBlockSize[2];
const char *pszMessage = "";
if (psTInfo->panBlockSize[i] == 0)
continue;
VSIFSeekL(psTInfo->fpGrid, psTInfo->panBlockOffset[i], SEEK_SET);
VSIFReadL(abyBlockSize, 2, 1, psTInfo->fpGrid);
if (psInfo->nCellType == AIG_CELLTYPE_INT && psInfo->bCompressed)
{
VSIFReadL(&byMagic, 1, 1, psTInfo->fpGrid);
if (byMagic != 0 && byMagic != 0x43 && byMagic != 0x04 &&
byMagic != 0x08 && byMagic != 0x10 && byMagic != 0xd7 &&
byMagic != 0xdf && byMagic != 0xe0 && byMagic != 0xfc &&
byMagic != 0xf8 && byMagic != 0xff && byMagic != 0x41 &&
byMagic != 0x40 && byMagic != 0x42 && byMagic != 0xf0 &&
byMagic != 0xcf && byMagic != 0x01)
{
pszMessage = "(unhandled magic number)";
bReport = TRUE;
}
if (byMagic == 0 && psTInfo->panBlockSize[i] > 8)
{
pszMessage = "(wrong size for 0x00 block, should be 8 bytes)";
bReport = TRUE;
}
if ((abyBlockSize[0] * 256 + abyBlockSize[1]) * 2 !=
psTInfo->panBlockSize[i])
{
pszMessage = "(block size in data doesn't match index)";
bReport = TRUE;
}
}
else
{
if (psTInfo->panBlockSize[i] !=
psInfo->nBlockXSize * psInfo->nBlockYSize * sizeof(float))
{
pszMessage = "(floating point block size is wrong)";
bReport = TRUE;
}
}
if (bReport)
{
printf(" %02x %5d %5d @ %u %s\n", byMagic, i,
psTInfo->panBlockSize[i], psTInfo->panBlockOffset[i],
pszMessage);
}
}
}
/************************************************************************/
/* main() */
/************************************************************************/
int main(int argc, char **argv)
{
AIGInfo_t *psInfo;
GInt32 *panRaster;
int i, j;
int bMagic = FALSE, bSuppressMagic = FALSE;
int iTestTileX = 0, iTestTileY = 0;
/* -------------------------------------------------------------------- */
/* Process arguments. */
/* -------------------------------------------------------------------- */
while (argc > 1 && argv[1][0] == '-')
{
if (EQUAL(argv[1], "-magic"))
bMagic = TRUE;
else if (EQUAL(argv[1], "-nomagic"))
bSuppressMagic = TRUE;
else if (EQUAL(argv[1], "-t") && argc > 2)
{
iTestTileX = atoi(argv[2]);
iTestTileY = atoi(argv[3]);
argc -= 2;
argv += 2;
}
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, iTestTileX, iTestTileY);
/* -------------------------------------------------------------------- */
/* 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("%s Integer coverage, %dx%d blocks.\n",
psInfo->bCompressed ? "Compressed" : "Uncompressed",
psInfo->nBlockXSize, psInfo->nBlockYSize);
else
printf("%s Floating point coverage, %dx%d blocks.\n",
psInfo->bCompressed ? "Compressed" : "Uncompressed",
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 */
/* instantiated blocks? */
/* -------------------------------------------------------------------- */
if (!bSuppressMagic)
DumpMagic(psInfo, bMagic);
/* -------------------------------------------------------------------- */
/* Read a block, and report its contents. */
/* -------------------------------------------------------------------- */
panRaster =
(GInt32 *)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,
psInfo->bCompressed);
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);
}