187
197
bNoDataSet = FALSE;
188
198
dfNoDataValue = -9999.0;
190
bHaveScaleAndOffset = FALSE;
200
bHaveScale = bHaveOffset = FALSE;
194
204
nBlockXSize = poDS->GetRasterXSize();
196
// Aim for a block of about 100000 pixels. Chunking up substantially
206
// Aim for a block of about 1000000 pixels. Chunking up substantially
197
207
// improves performance in some situations. For now we only chunk up for
198
// SDS based datasets since other variations haven't been tested. #2208
199
if( poDS->iDatasetType == HDF4_SDS )
208
// SDS and EOS based datasets since other variations haven't been tested. #2208
209
if( poDS->iDatasetType == HDF4_SDS ||
210
poDS->iDatasetType == HDF4_EOS)
202
atoi( CPLGetConfigOption("HDF4_BLOCK_PIXELS", "100000") );
213
atoi( CPLGetConfigOption("HDF4_BLOCK_PIXELS", "1000000") );
204
215
nBlockYSize = nChunkSize / poDS->GetRasterXSize();
205
216
nBlockYSize = MAX(1,MIN(nBlockYSize,poDS->GetRasterYSize()));
223
/* HDF4_EOS:EOS_GRID case. We ensure that the block size matches */
224
/* the raster width, as the IReadBlock() code can only handle multiple */
226
if ( poDS->nBlockPreferredXSize == nBlockXSize &&
227
poDS->nBlockPreferredYSize > 0 )
229
if (poDS->nBlockPreferredYSize == 1)
231
/* Avoid defaulting to tile reading when the preferred height is 1 */
232
/* as it leads to very poor performance with : */
233
/* ftp://e4ftl01u.ecs.nasa.gov/MODIS_Composites/MOLT/MOD13Q1.005/2006.06.10/MOD13Q1.A2006161.h21v13.005.2008234103220.hd */
234
poDS->bReadTile = FALSE;
238
nBlockYSize = poDS->nBlockPreferredYSize;
211
243
/************************************************************************/
372
409
% poGDS->aiDimSizes[poGDS->iBandDim];
373
410
aiEdges[poGDS->iBandDim] = 1;
375
412
aiStart[poGDS->iYDim] = nYOff;
376
413
aiEdges[poGDS->iYDim] = nYSize;
378
415
aiStart[poGDS->iXDim] = nBlockXOff;
379
416
aiEdges[poGDS->iXDim] = nBlockXSize;
381
418
case 3: // 3Dim: volume
382
419
aiStart[poGDS->iBandDim] = nBand - 1;
383
420
aiEdges[poGDS->iBandDim] = 1;
385
422
aiStart[poGDS->iYDim] = nYOff;
386
423
aiEdges[poGDS->iYDim] = nYSize;
388
425
aiStart[poGDS->iXDim] = nBlockXOff;
389
426
aiEdges[poGDS->iXDim] = nBlockXSize;
391
428
case 2: // 2Dim: rows/cols
392
429
aiStart[poGDS->iYDim] = nYOff;
393
430
aiEdges[poGDS->iYDim] = nYSize;
395
432
aiStart[poGDS->iXDim] = nBlockXOff;
396
433
aiEdges[poGDS->iXDim] = nBlockXSize;
399
if( GDreadfield( hGD, poGDS->pszFieldName,
400
aiStart, NULL, aiEdges, pImage ) < 0 )
402
CPLError( CE_Failure, CPLE_AppDefined,
437
/* Ensure that we don't overlap the bottom or right edges */
438
/* of the dataset in order to use the GDreadtile() API */
439
if ( poGDS->bReadTile &&
440
(nBlockXOff + 1) * nBlockXSize <= nRasterXSize &&
441
(nBlockYOff + 1) * nBlockYSize <= nRasterYSize )
443
int32 tilecoords[] = { nBlockYOff , nBlockXOff };
444
if( GDreadtile( hGD, poGDS->pszFieldName , tilecoords , pImage ) != 0 )
446
CPLError( CE_Failure, CPLE_AppDefined, "GDreadtile() failed for block." );
450
else if( GDreadfield( hGD, poGDS->pszFieldName,
451
aiStart, NULL, aiEdges, pImage ) < 0 )
453
CPLError( CE_Failure, CPLE_AppDefined,
403
454
"GDreadfield() failed for block." );
404
455
eErr = CE_Failure;
410
461
case H4ST_EOS_SWATH:
411
462
case H4ST_EOS_SWATH_GEOL:
1021
1079
/************************************************************************/
1080
/* CaptureL1GMTLInfo() */
1081
/************************************************************************/
1083
/* FILE L71002025_02520010722_M_MTL.L1G
1085
GROUP = L1_METADATA_FILE
1087
GROUP = PRODUCT_METADATA
1088
PRODUCT_TYPE = "L1G"
1089
PROCESSING_SOFTWARE = "IAS_5.1"
1090
EPHEMERIS_TYPE = "DEFINITIVE"
1091
SPACECRAFT_ID = "Landsat7"
1093
ACQUISITION_DATE = 2001-07-22
1097
BAND_COMBINATION = "12345--7-"
1098
PRODUCT_UL_CORNER_LAT = 51.2704805
1099
PRODUCT_UL_CORNER_LON = -53.8914311
1100
PRODUCT_UR_CORNER_LAT = 50.8458100
1101
PRODUCT_UR_CORNER_LON = -50.9869091
1102
PRODUCT_LL_CORNER_LAT = 49.6960897
1103
PRODUCT_LL_CORNER_LON = -54.4047933
1104
PRODUCT_LR_CORNER_LAT = 49.2841436
1105
PRODUCT_LR_CORNER_LON = -51.5900428
1106
PRODUCT_UL_CORNER_MAPX = 298309.894
1107
PRODUCT_UL_CORNER_MAPY = 5683875.631
1108
PRODUCT_UR_CORNER_MAPX = 500921.624
1109
PRODUCT_UR_CORNER_MAPY = 5632678.683
1110
PRODUCT_LL_CORNER_MAPX = 254477.193
1111
PRODUCT_LL_CORNER_MAPY = 5510407.880
1112
PRODUCT_LR_CORNER_MAPX = 457088.923
1113
PRODUCT_LR_CORNER_MAPY = 5459210.932
1114
PRODUCT_SAMPLES_REF = 6967
1115
PRODUCT_LINES_REF = 5965
1116
BAND1_FILE_NAME = "L71002025_02520010722_B10.L1G"
1117
BAND2_FILE_NAME = "L71002025_02520010722_B20.L1G"
1118
BAND3_FILE_NAME = "L71002025_02520010722_B30.L1G"
1119
BAND4_FILE_NAME = "L71002025_02520010722_B40.L1G"
1120
BAND5_FILE_NAME = "L71002025_02520010722_B50.L1G"
1121
BAND7_FILE_NAME = "L72002025_02520010722_B70.L1G"
1122
METADATA_L1_FILE_NAME = "L71002025_02520010722_MTL.L1G"
1123
CPF_FILE_NAME = "L7CPF20010701_20010930_06"
1124
HDF_DIR_FILE_NAME = "L71002025_02520010722_HDF.L1G"
1125
END_GROUP = PRODUCT_METADATA
1127
GROUP = PROJECTION_PARAMETERS
1128
REFERENCE_DATUM = "NAD83"
1129
REFERENCE_ELLIPSOID = "GRS80"
1130
GRID_CELL_SIZE_PAN = 15.000000
1131
GRID_CELL_SIZE_THM = 60.000000
1132
GRID_CELL_SIZE_REF = 30.000000
1134
RESAMPLING_OPTION = "CC"
1135
MAP_PROJECTION = "UTM"
1136
END_GROUP = PROJECTION_PARAMETERS
1137
GROUP = UTM_PARAMETERS
1139
END_GROUP = UTM_PARAMETERS
1140
END_GROUP = L1_METADATA_FILE
1144
void HDF4ImageDataset::CaptureL1GMTLInfo()
1147
/* -------------------------------------------------------------------- */
1148
/* Does the physical file look like it matches our expected */
1150
/* -------------------------------------------------------------------- */
1151
if( strlen(pszFilename) < 8
1152
|| !EQUAL(pszFilename+strlen(pszFilename)-8,"_HDF.L1G") )
1155
/* -------------------------------------------------------------------- */
1156
/* Construct the name of the corresponding MTL file. We should */
1157
/* likely be able to extract that from the HDF itself but I'm */
1158
/* not sure where to find it. */
1159
/* -------------------------------------------------------------------- */
1160
CPLString osMTLFilename = pszFilename;
1161
osMTLFilename.resize(osMTLFilename.length() - 8);
1162
osMTLFilename += "_MTL.L1G";
1164
/* -------------------------------------------------------------------- */
1165
/* Ingest the MTL using the NASAKeywordHandler written for the */
1167
/* -------------------------------------------------------------------- */
1168
NASAKeywordHandler oMTL;
1170
VSILFILE *fp = VSIFOpenL( osMTLFilename, "r" );
1174
if( !oMTL.Ingest( fp, 0 ) )
1182
/* -------------------------------------------------------------------- */
1183
/* Note: Different variation of MTL files use different group names. */
1184
/* Check for LPGS_METADATA_FILE and L1_METADATA_FILE. */
1185
/* -------------------------------------------------------------------- */
1186
double dfULX, dfULY, dfLRX, dfLRY;
1187
double dfLLX, dfLLY, dfURX, dfURY;
1190
if( oMTL.GetKeyword( "LPGS_METADATA_FILE.PRODUCT_METADATA"
1191
".PRODUCT_UL_CORNER_LON", NULL ) )
1192
osPrefix = "LPGS_METADATA_FILE.PRODUCT_METADATA.PRODUCT_";
1193
else if( oMTL.GetKeyword( "L1_METADATA_FILE.PRODUCT_METADATA"
1194
".PRODUCT_UL_CORNER_LON", NULL ) )
1195
osPrefix = "L1_METADATA_FILE.PRODUCT_METADATA.PRODUCT_";
1199
dfULX = atof(oMTL.GetKeyword((osPrefix+"UL_CORNER_LON").c_str(), "0" ));
1200
dfULY = atof(oMTL.GetKeyword((osPrefix+"UL_CORNER_LAT").c_str(), "0" ));
1201
dfLRX = atof(oMTL.GetKeyword((osPrefix+"LR_CORNER_LON").c_str(), "0" ));
1202
dfLRY = atof(oMTL.GetKeyword((osPrefix+"LR_CORNER_LAT").c_str(), "0" ));
1203
dfLLX = atof(oMTL.GetKeyword((osPrefix+"LL_CORNER_LON").c_str(), "0" ));
1204
dfLLY = atof(oMTL.GetKeyword((osPrefix+"LL_CORNER_LAT").c_str(), "0" ));
1205
dfURX = atof(oMTL.GetKeyword((osPrefix+"UR_CORNER_LON").c_str(), "0" ));
1206
dfURY = atof(oMTL.GetKeyword((osPrefix+"UR_CORNER_LAT").c_str(), "0" ));
1208
CPLFree( pszGCPProjection );
1209
pszGCPProjection = CPLStrdup( "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AXIS[\"Lat\",NORTH],AXIS[\"Long\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" );
1212
pasGCPList = (GDAL_GCP *) CPLCalloc( nGCPCount, sizeof( GDAL_GCP ) );
1213
GDALInitGCPs( nGCPCount, pasGCPList );
1215
pasGCPList[0].dfGCPX = dfULX;
1216
pasGCPList[0].dfGCPY = dfULY;
1217
pasGCPList[0].dfGCPPixel = 0.0;
1218
pasGCPList[0].dfGCPLine = 0.0;
1220
pasGCPList[1].dfGCPX = dfURX;
1221
pasGCPList[1].dfGCPY = dfURY;
1222
pasGCPList[1].dfGCPPixel = GetRasterXSize();
1223
pasGCPList[1].dfGCPLine = 0.0;
1225
pasGCPList[2].dfGCPX = dfLLX;
1226
pasGCPList[2].dfGCPY = dfLLY;
1227
pasGCPList[2].dfGCPPixel = 0.0;
1228
pasGCPList[2].dfGCPLine = GetRasterYSize();
1230
pasGCPList[3].dfGCPX = dfLRX;
1231
pasGCPList[3].dfGCPY = dfLRY;
1232
pasGCPList[3].dfGCPPixel = GetRasterXSize();
1233
pasGCPList[3].dfGCPLine = GetRasterYSize();
1236
/************************************************************************/
1022
1237
/* CaptureNRLGeoTransform() */
1024
1239
/* Capture geotransform and coordinate system from NRL (Naval */
1156
1371
aiStart[0] = 0;
1157
1372
aiEdges[0] = 29;
1159
if( SDgetinfo( iSDS, szName, &iRank, aiDimSizes, &iNumType,
1161
&& iNumType == DFNT_FLOAT64
1374
if( SDgetinfo( iSDS, szName, &iRank, aiDimSizes, &iNumType,
1376
&& iNumType == DFNT_FLOAT64
1163
&& aiDimSizes[0] >= 29
1164
&& SDreaddata( iSDS, aiStart, NULL, aiEdges, adfGCTP ) == 0
1165
&& oSRS.importFromUSGS( (long) adfGCTP[1], (long) adfGCTP[2],
1378
&& aiDimSizes[0] >= 29
1379
&& SDreaddata( iSDS, aiStart, NULL, aiEdges, adfGCTP ) == 0
1380
&& oSRS.importFromUSGS( (long) adfGCTP[1], (long) adfGCTP[2],
1167
1382
(long) adfGCTP[3] ) == OGRERR_NONE )
1169
1384
CPLDebug( "HDF4Image", "GCTP Parms = %g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g",
1200
1415
CPLFree( pszProjection );
1201
1416
oSRS.exportToWkt( &pszProjection );
1202
1417
bGotGCTPProjection = TRUE;
1206
1423
/* -------------------------------------------------------------------- */
1783
1994
else if ( EQUALN(pszProduct, "MOD02", 5)
1784
1995
|| EQUALN(pszProduct, "MYD02", 5) )
1785
1996
eProduct = PROD_MODIS_L1B;
1997
else if ( EQUALN(pszProduct, "MOD07_L2", 8) )
1998
eProduct = PROD_MODIS_L2;
1788
/* -------------------------------------------------------------------- */
1790
/* -------------------------------------------------------------------- */
1791
nDataFields = SWnentries( hSW, HDFE_NENTGFLD, &nStrBufSize );
1792
pszGeoList = (char *)CPLMalloc( nStrBufSize + 1 );
2001
/* -------------------------------------------------------------------- */
2002
/* Read names of geolocation fields and corresponding */
2003
/* geolocation maps. */
2004
/* -------------------------------------------------------------------- */
2005
int32 nDataFields = SWnentries( hSW, HDFE_NENTGFLD, &nStrBufSize );
2006
char *pszGeoList = (char *)CPLMalloc( nStrBufSize + 1 );
1793
2007
paiRank = (int32 *)CPLMalloc( nDataFields * sizeof(int32) );
1794
2008
paiNumType = (int32 *)CPLMalloc( nDataFields * sizeof(int32) );
1795
2010
if ( nDataFields !=
1796
2011
SWinqgeofields(hSW, pszGeoList, paiRank, paiNumType) )
1798
2013
CPLDebug( "HDF4Image",
1799
"Can't get the list of geolocation fields in swath %s",
2014
"Can't get the list of geolocation fields in swath \"%s\"",
1800
2015
pszSubdatasetName );
1821
papszGeolocations = CSLTokenizeString2( pszGeoList, ",",
1822
CSLT_HONOURSTRINGS );
1823
2036
// Read geolocation data
1824
nDimMaps = SWnentries( hSW, HDFE_NENTMAP, &nStrBufSize );
2037
int32 nDimMaps = SWnentries( hSW, HDFE_NENTMAP, &nStrBufSize );
1825
2038
if ( nDimMaps <= 0 )
1827
CPLDebug( "HDF4Image", "No geolocation maps in swath %s",
2042
CPLDebug( "HDF4Image", "No geolocation maps in swath \"%s\"",
1828
2043
pszSubdatasetName );
2044
CPLDebug( "HDF4Image",
2045
"Suppose one-to-one mapping. X field is \"%s\", Y field is \"%s\"",
2046
papszDimList[iXDim], papszDimList[iYDim] );
2049
strncpy( szPixel, papszDimList[iXDim], 8192 );
2050
strncpy( szLine, papszDimList[iYDim], 8192 );
2051
strncpy( szXGeo, papszDimList[iXDim], 8192 );
2052
strncpy( szYGeo, papszDimList[iYDim], 8192 );
2053
paiOffset = (int32 *)CPLCalloc( 2, sizeof(int32) );
2054
paiIncrement = (int32 *)CPLCalloc( 2, sizeof(int32) );
2055
paiOffset[0] = paiOffset[1] = 0;
2056
paiIncrement[0] = paiIncrement[1] = 1;
1832
pszDimMaps = (char *)CPLMalloc( nStrBufSize + 1 );
1833
paiOffset = (int32 *)CPLMalloc( nDimMaps * sizeof(int32) );
1834
memset( paiOffset, 0, nDimMaps * sizeof(int32) );
1835
paiIncrement = (int32 *)CPLMalloc( nDimMaps * sizeof(int32) );
1836
memset( paiIncrement, 0, nDimMaps * sizeof(int32) );
2060
char *pszDimMaps = (char *)CPLMalloc( nStrBufSize + 1 );
2061
paiOffset = (int32 *)CPLCalloc( nDimMaps, sizeof(int32) );
2062
paiIncrement = (int32 *)CPLCalloc( nDimMaps, sizeof(int32) );
1839
2064
*pszDimMaps = '\0';
1840
2065
if ( nDimMaps != SWinqmaps(hSW, pszDimMaps, paiOffset, paiIncrement) )
1842
2067
CPLDebug( "HDF4Image",
1843
"Can't get the list of geolocation maps in swath %s",
2068
"Can't get the list of geolocation maps in swath \"%s\"",
1844
2069
pszSubdatasetName );
1891
2113
*pszTemp = '\0';
1894
2117
CSLDestroy( papszDimMap );
2118
CPLFree( pszDimMaps );
1898
for ( i = 0; i < CSLCount(papszGeolocations); i++ )
2121
if ( *szXGeo == 0 || *szYGeo == 0 )
2124
/* -------------------------------------------------------------------- */
2125
/* Read geolocation fields. */
2126
/* -------------------------------------------------------------------- */
2127
char szGeoDimList[8192] = "";
2128
char **papszGeolocations = CSLTokenizeString2( pszGeoList, ",",
2129
CSLT_HONOURSTRINGS );
2130
int nGeolocationsCount = CSLCount( papszGeolocations );
2131
int32 aiDimSizes[H4_MAX_VAR_DIMS];
2133
for ( i = 0; i < nGeolocationsCount; i++ )
1900
2135
char **papszGeoDimList = NULL;
1902
SWfieldinfo( hSW, papszGeolocations[i], &iRank,
1903
aiDimSizes, &iWrkNumType, szGeoDimList );
2137
if ( SWfieldinfo( hSW, papszGeolocations[i], &iRank,
2138
aiDimSizes, &iWrkNumType, szGeoDimList ) < 0 )
2142
CPLDebug( "HDF4Image",
2143
"Can't read attributes of geolocation field \"%s\"",
2144
papszGeolocations[i] );
1904
2150
papszGeoDimList = CSLTokenizeString2( szGeoDimList,
1905
2151
",", CSLT_HONOURSTRINGS );
2153
if ( CSLCount(papszGeoDimList) > H4_MAX_VAR_DIMS )
2155
CSLDestroy( papszGeoDimList );
1908
2160
CPLDebug( "HDF4Image",
1909
"List of dimensions in geolocation field %s: %s",
2161
"List of dimensions in geolocation field \"%s\": %s",
1910
2162
papszGeolocations[i], szGeoDimList );
1913
if (szXGeo[0] == 0 || szYGeo[0] == 0)
1916
2165
nXPoints = aiDimSizes[CSLFindString( papszGeoDimList, szXGeo )];
1917
2166
nYPoints = aiDimSizes[CSLFindString( papszGeoDimList, szYGeo )];
2243
2492
/* Establish geolocation metadata, but only if there is no */
2244
2493
/* lattice. The lattice destroys the regularity of the grid. */
2245
2494
/* -------------------------------------------------------------------- */
2246
if( pLatticeX == NULL
2247
&& iLatDim != -1 && iLongDim != -1
2495
if( pLatticeX == NULL
2496
&& iLatDim != -1 && iLongDim != -1
2248
2497
&& iPixelDim != -1 && iLineDim != -1 )
2250
2499
CPLString osWrk;
2252
2501
SetMetadataItem( "SRS", pszGCPProjection, "GEOLOCATION" );
2254
osWrk.Printf( "HDF4_EOS:EOS_SWATH_GEOL:\"%s\":%s:%s",
2503
osWrk.Printf( "HDF4_EOS:EOS_SWATH_GEOL:\"%s\":%s:%s",
2255
2504
pszFilename, pszSubdatasetName,
2256
2505
papszGeolocations[iLongDim] );
2257
2506
SetMetadataItem( "X_DATASET", osWrk, "GEOLOCATION" );
2258
2507
SetMetadataItem( "X_BAND", "1" , "GEOLOCATION" );
2260
osWrk.Printf( "HDF4_EOS:EOS_SWATH_GEOL:\"%s\":%s:%s",
2509
osWrk.Printf( "HDF4_EOS:EOS_SWATH_GEOL:\"%s\":%s:%s",
2261
2510
pszFilename, pszSubdatasetName,
2262
2511
papszGeolocations[iLatDim] );
2263
2512
SetMetadataItem( "Y_DATASET", osWrk, "GEOLOCATION" );
2472
2721
/* -------------------------------------------------------------------- */
2473
2722
/* Decode the dimension map. */
2474
2723
/* -------------------------------------------------------------------- */
2475
SWnentries( hSW, HDFE_NENTDIM, &nStrBufSize );
2724
int32 nStrBufSize = 0;
2726
if ( SWnentries( hSW, HDFE_NENTDIM, &nStrBufSize ) < 0
2727
|| nStrBufSize <= 0 )
2729
CPLDebug( "HDF4Image",
2730
"Can't read a number of dimension maps." );
2476
2735
pszDimList = (char *)CPLMalloc( nStrBufSize + 1 );
2477
SWfieldinfo( hSW, poDS->pszFieldName, &poDS->iRank,
2478
poDS->aiDimSizes, &poDS->iNumType, pszDimList );
2736
if ( SWfieldinfo( hSW, poDS->pszFieldName, &poDS->iRank,
2737
poDS->aiDimSizes, &poDS->iNumType,
2740
CPLDebug( "HDF4Image", "Can't read dimension maps." );
2741
CPLFree( pszDimList );
2745
pszDimList[nStrBufSize] = '\0';
2480
2747
CPLDebug( "HDF4Image",
2481
"List of dimensions in swath %s: %s",
2748
"List of dimensions in swath \"%s\": %s",
2482
2749
poDS->pszFieldName, pszDimList );
2484
2751
poDS->GetImageDimensions( pszDimList );
2580
2847
poDS->GetImageDimensions( szDimList );
2849
int32 tilecode, tilerank;
2850
if( GDtileinfo( hGD , poDS->pszFieldName , &tilecode, &tilerank, NULL ) == 0 )
2852
if ( tilecode == HDFE_TILE )
2854
int32 *tiledims = NULL;
2855
tiledims = (int32 *) CPLCalloc( tilerank , sizeof( int32 ) );
2856
GDtileinfo( hGD , poDS->pszFieldName , &tilecode, &tilerank, tiledims );
2857
if ( ( tilerank == 2 ) && ( poDS->iRank == tilerank ) )
2859
poDS->nBlockPreferredXSize = tiledims[1];
2860
poDS->nBlockPreferredYSize = tiledims[0];
2861
poDS->bReadTile = true;
2863
CPLDebug( "HDF4_EOS:EOS_GRID:","tilerank in grid %s: %d",
2864
poDS->pszFieldName , (int)tilerank );
2865
CPLDebug( "HDF4_EOS:EOS_GRID:","tiledimens in grid %s: %d,%d",
2866
poDS->pszFieldName , (int)tiledims[0] , (int)tiledims[1] );
2872
CPLDebug( "HDF4_EOS:EOS_GRID:","tilerank in grid %s: %d not supported",
2873
poDS->pszFieldName , (int)tilerank );
2881
CPLDebug( "HDF4_EOS:EOS_GRID:","tilecode == HDFE_NOTILE in grid %s: %d",
2882
poDS->pszFieldName ,
2890
CPLDebug( "HDF4_EOS:EOS_GRID:","ERROR GDtileinfo %s", poDS->pszFieldName );
2582
2894
/* -------------------------------------------------------------------- */
2583
2895
/* Fetch projection information */
2584
2896
/* -------------------------------------------------------------------- */
3080
3438
for( i = 1; i <= poDS->nBands; i++ )
3082
3440
poDS->GetRasterBand(i)->SetNoDataValue(
3083
CPLAtof( CSLFetchNameValue(poDS->papszLocalMetadata,
3441
CPLAtof( CSLFetchNameValue(poDS->papszLocalMetadata,
3084
3442
"missing_value") ) );
3088
3446
// Coastwatch offset and scale.
3089
if( CSLFetchNameValue( poDS->papszLocalMetadata, "scale_factor" )
3447
if( CSLFetchNameValue( poDS->papszLocalMetadata, "scale_factor" )
3090
3448
&& CSLFetchNameValue( poDS->papszLocalMetadata, "add_offset" ) )
3092
3450
for( i = 1; i <= poDS->nBands; i++ )
3094
HDF4ImageRasterBand *poBand =
3452
HDF4ImageRasterBand *poBand =
3095
3453
(HDF4ImageRasterBand *) poDS->GetRasterBand(i);
3097
poBand->bHaveScaleAndOffset = TRUE;
3099
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3455
poBand->bHaveScale = poBand->bHaveOffset = TRUE;
3457
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3100
3458
"scale_factor" ) );
3101
poBand->dfOffset = -1 * poBand->dfScale *
3102
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3459
poBand->dfOffset = -1 * poBand->dfScale *
3460
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3103
3461
"add_offset" ) );
3107
3465
// this is a modis level3 convention (data from ACT)
3108
3466
// Eg data/hdf/act/modis/MODAM2004280160000.L3_NOAA_GMX
3110
if( CSLFetchNameValue( poDS->papszLocalMetadata,
3112
&& CSLFetchNameValue( poDS->papszLocalMetadata,
3468
if( CSLFetchNameValue( poDS->papszLocalMetadata,
3470
&& CSLFetchNameValue( poDS->papszLocalMetadata,
3113
3471
"scalingIntercept" ) )
3116
3474
CPLString osUnits;
3118
if( CSLFetchNameValue( poDS->papszLocalMetadata,
3476
if( CSLFetchNameValue( poDS->papszLocalMetadata,
3119
3477
"productUnits" ) )
3121
osUnits = CSLFetchNameValue( poDS->papszLocalMetadata,
3479
osUnits = CSLFetchNameValue( poDS->papszLocalMetadata,
3122
3480
"productUnits" );
3125
3483
for( i = 1; i <= poDS->nBands; i++ )
3127
HDF4ImageRasterBand *poBand =
3485
HDF4ImageRasterBand *poBand =
3128
3486
(HDF4ImageRasterBand *) poDS->GetRasterBand(i);
3130
poBand->bHaveScaleAndOffset = TRUE;
3132
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3488
poBand->bHaveScale = poBand->bHaveOffset = TRUE;
3490
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3133
3491
"scalingSlope" ) );
3135
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3493
CPLAtof( CSLFetchNameValue( poDS->papszLocalMetadata,
3136
3494
"scalingIntercept" ) );
3138
3496
poBand->osUnitType = osUnits;