const Eprj_ProParameters *HFAGetProParameters( HFAHandle hHFA ) { HFAEntry *poMIEntry; Eprj_ProParameters *psProParms; int i; if( hHFA->nBands < 1 ) return NULL; /* -------------------------------------------------------------------- */ /* Do we already have it? */ /* -------------------------------------------------------------------- */ if( hHFA->pProParameters != NULL ) return( (Eprj_ProParameters *) hHFA->pProParameters ); /* -------------------------------------------------------------------- */ /* Get the HFA node. */ /* -------------------------------------------------------------------- */ poMIEntry = hHFA->papoBand[0]->poNode->GetNamedChild( "Projection" ); if( poMIEntry == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Allocate the structure. */ /* -------------------------------------------------------------------- */ psProParms = (Eprj_ProParameters *)CPLCalloc(sizeof(Eprj_ProParameters),1); /* -------------------------------------------------------------------- */ /* Fetch the fields. */ /* -------------------------------------------------------------------- */ psProParms->proType = (Eprj_ProType) poMIEntry->GetIntField("proType"); psProParms->proNumber = poMIEntry->GetIntField("proNumber"); psProParms->proExeName =CPLStrdup(poMIEntry->GetStringField("proExeName")); psProParms->proName = CPLStrdup(poMIEntry->GetStringField("proName")); psProParms->proZone = poMIEntry->GetIntField("proZone"); for( i = 0; i < 15; i++ ) { char szFieldName[30]; sprintf( szFieldName, "proParams[%d]", i ); psProParms->proParams[i] = poMIEntry->GetDoubleField(szFieldName); } psProParms->proSpheroid.sphereName = CPLStrdup(poMIEntry->GetStringField("proSpheroid.sphereName")); psProParms->proSpheroid.a = poMIEntry->GetDoubleField("proSpheroid.a"); psProParms->proSpheroid.b = poMIEntry->GetDoubleField("proSpheroid.b"); psProParms->proSpheroid.eSquared = poMIEntry->GetDoubleField("proSpheroid.eSquared"); psProParms->proSpheroid.radius = poMIEntry->GetDoubleField("proSpheroid.radius"); hHFA->pProParameters = (void *) psProParms; return psProParms; }
const Eprj_Datum *HFAGetDatum( HFAHandle hHFA ) { HFAEntry *poMIEntry; Eprj_Datum *psDatum; int i; if( hHFA->nBands < 1 ) return NULL; /* -------------------------------------------------------------------- */ /* Do we already have it? */ /* -------------------------------------------------------------------- */ if( hHFA->pDatum != NULL ) return( (Eprj_Datum *) hHFA->pDatum ); /* -------------------------------------------------------------------- */ /* Get the HFA node. */ /* -------------------------------------------------------------------- */ poMIEntry = hHFA->papoBand[0]->poNode->GetNamedChild( "Projection.Datum" ); if( poMIEntry == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Allocate the structure. */ /* -------------------------------------------------------------------- */ psDatum = (Eprj_Datum *) CPLCalloc(sizeof(Eprj_Datum),1); /* -------------------------------------------------------------------- */ /* Fetch the fields. */ /* -------------------------------------------------------------------- */ psDatum->datumname = CPLStrdup(poMIEntry->GetStringField("datumname")); psDatum->type = (Eprj_DatumType) poMIEntry->GetIntField("type"); for( i = 0; i < 7; i++ ) { char szFieldName[30]; sprintf( szFieldName, "params[%d]", i ); psDatum->params[i] = poMIEntry->GetDoubleField(szFieldName); } psDatum->gridname = CPLStrdup(poMIEntry->GetStringField("gridname")); hHFA->pDatum = (void *) psDatum; return psDatum; }
const Eprj_MapInfo *HFAGetMapInfo( HFAHandle hHFA ) { HFAEntry *poMIEntry; Eprj_MapInfo *psMapInfo; if( hHFA->nBands < 1 ) return NULL; /* -------------------------------------------------------------------- */ /* Do we already have it? */ /* -------------------------------------------------------------------- */ if( hHFA->pMapInfo != NULL ) return( (Eprj_MapInfo *) hHFA->pMapInfo ); /* -------------------------------------------------------------------- */ /* Get the HFA node. */ /* -------------------------------------------------------------------- */ poMIEntry = hHFA->papoBand[0]->poNode->GetNamedChild( "Map_Info" ); if( poMIEntry == NULL ) return NULL; /* -------------------------------------------------------------------- */ /* Allocate the structure. */ /* -------------------------------------------------------------------- */ psMapInfo = (Eprj_MapInfo *) CPLCalloc(sizeof(Eprj_MapInfo),1); /* -------------------------------------------------------------------- */ /* Fetch the fields. */ /* -------------------------------------------------------------------- */ psMapInfo->proName = CPLStrdup(poMIEntry->GetStringField("proName")); psMapInfo->upperLeftCenter.x = poMIEntry->GetDoubleField("upperLeftCenter.x"); psMapInfo->upperLeftCenter.y = poMIEntry->GetDoubleField("upperLeftCenter.y"); psMapInfo->lowerRightCenter.x = poMIEntry->GetDoubleField("lowerRightCenter.x"); psMapInfo->lowerRightCenter.y = poMIEntry->GetDoubleField("lowerRightCenter.y"); psMapInfo->pixelSize.width = poMIEntry->GetDoubleField("pixelSize.width"); psMapInfo->pixelSize.height = poMIEntry->GetDoubleField("pixelSize.height"); psMapInfo->units = CPLStrdup(poMIEntry->GetStringField("units")); hHFA->pMapInfo = (void *) psMapInfo; return psMapInfo; }
CPLErr HFAGetDataRange( HFAHandle hHFA, int nBand, double * pdfMin, double *pdfMax ) { HFAEntry *poBinInfo; if( nBand < 1 || nBand > hHFA->nBands ) return CE_Failure; poBinInfo = hHFA->papoBand[nBand-1]->poNode->GetNamedChild("Statistics" ); if( poBinInfo == NULL ) return( CE_Failure ); *pdfMin = poBinInfo->GetDoubleField( "minimum" ); *pdfMax = poBinInfo->GetDoubleField( "maximum" ); if( *pdfMax > *pdfMin ) return CE_None; else return CE_Failure; }
int main( int argc, char ** argv ) { const char *pszFilename = NULL; int nDumpTree = FALSE; int nDumpDict = FALSE; int nRastReport = FALSE; int i, nXSize, nYSize, nBands; HFAHandle hHFA; const Eprj_MapInfo *psMapInfo; const Eprj_ProParameters *psProParameters; const Eprj_Datum *psDatum; /* -------------------------------------------------------------------- */ /* Handle arguments. */ /* -------------------------------------------------------------------- */ for( i = 1; i < argc; i++ ) { if( EQUAL(argv[i],"-dd") ) nDumpDict = TRUE; else if( EQUAL(argv[i],"-dt") ) nDumpTree = TRUE; else if( EQUAL(argv[i],"-dr") ) nRastReport = TRUE; else if( pszFilename == NULL ) pszFilename = argv[i]; else { Usage(); exit( 1 ); } } if( pszFilename == NULL ) { Usage(); exit( 1 ); } /* -------------------------------------------------------------------- */ /* Open the file. */ /* -------------------------------------------------------------------- */ hHFA = HFAOpen( pszFilename, "r" ); if( hHFA == NULL ) { printf( "HFAOpen() failed.\n" ); exit( 100 ); } /* -------------------------------------------------------------------- */ /* Do we want to walk the tree dumping out general information? */ /* -------------------------------------------------------------------- */ if( nDumpDict ) { HFADumpDictionary( hHFA, stdout ); } /* -------------------------------------------------------------------- */ /* Do we want to walk the tree dumping out general information? */ /* -------------------------------------------------------------------- */ if( nDumpTree ) { HFADumpTree( hHFA, stdout ); } /* -------------------------------------------------------------------- */ /* Dump indirectly collected data about bands. */ /* -------------------------------------------------------------------- */ HFAGetRasterInfo( hHFA, &nXSize, &nYSize, &nBands ); if( nRastReport ) { printf( "Raster Size = %d x %d\n", nXSize, nYSize ); for( i = 1; i <= nBands; i++ ) { int nDataType, nColors, nOverviews, iOverview; double *padfRed, *padfGreen, *padfBlue, *padfAlpha, *padfBins; int nBlockXSize, nBlockYSize, nCompressionType; HFAGetBandInfo( hHFA, i, &nDataType, &nBlockXSize, &nBlockYSize, &nCompressionType ); nOverviews = HFAGetOverviewCount( hHFA, i ); printf( "Band %d: %dx%d tiles, type = %d\n", i, nBlockXSize, nBlockYSize, nDataType ); for( iOverview=0; iOverview < nOverviews; iOverview++ ) { HFAGetOverviewInfo( hHFA, i, iOverview, &nXSize, &nYSize, &nBlockXSize, &nBlockYSize, NULL ); printf( " Overview: %dx%d (blocksize %dx%d)\n", nXSize, nYSize, nBlockXSize, nBlockYSize ); } if( HFAGetPCT( hHFA, i, &nColors, &padfRed, &padfGreen, &padfBlue, &padfAlpha, &padfBins ) == CE_None ) { int j; for( j = 0; j < nColors; j++ ) { printf( "PCT[%d] = %f,%f,%f %f\n", (padfBins != NULL) ? (int) padfBins[j] : j, padfRed[j], padfGreen[j], padfBlue[j], padfAlpha[j]); } } /* -------------------------------------------------------------------- */ /* Report statistics. We need to dig directly into the C++ API. */ /* -------------------------------------------------------------------- */ HFABand *poBand = hHFA->papoBand[i-1]; HFAEntry *poStats = poBand->poNode->GetNamedChild( "Statistics" ); if( poStats != NULL ) { printf( " Min: %g Max: %g Mean: %g\n", poStats->GetDoubleField( "minimum" ), poStats->GetDoubleField( "maximum" ), poStats->GetDoubleField( "mean" ) ); printf( " Median: %g Mode: %g Stddev: %g\n", poStats->GetDoubleField( "median" ), poStats->GetDoubleField( "mode" ), poStats->GetDoubleField( "stddev" ) ); } else printf( " No Statistics found.\n" ); } /* -------------------------------------------------------------------- */ /* Dump the map info structure. */ /* -------------------------------------------------------------------- */ psMapInfo = HFAGetMapInfo( hHFA ); if( psMapInfo != NULL ) { printf( "MapInfo.proName = %s\n", psMapInfo->proName ); printf( "MapInfo.upperLeftCenter.x = %.2f\n", psMapInfo->upperLeftCenter.x ); printf( "MapInfo.upperLeftCenter.y = %.2f\n", psMapInfo->upperLeftCenter.y ); } else { printf( "No Map Info found\n" ); } } psProParameters = HFAGetProParameters( hHFA ); psDatum = HFAGetDatum( hHFA ); HFAClose( hHFA ); #ifdef DBMALLOC malloc_dump(1); #endif exit( 0 ); }