Hi All,
I could use a little help, and it would be greatly appreciated. Goal: Write a c++ program in MS Visual Studio 2010 (on win7 x64 machine) that reads in a netCDF file. Compile/build program in Visual Studio 2010 Release or Debug x64. Execute the program. The netCDF file I am trying to read in, has one variable in it. That variable is a 3d raster 76x40x93 of float32 type. Steps I have taken: 1. Download binaries from http://www.gisinternals.com/sdk/PackageList.aspx?file=release-1600-x64-gdal- 1-8-mapserver-6-0.zip 2. Create .lib files from .dll(s) 3. Follow instruction from download binary site, paths/linkers to library and gdalplugins etc.. 4. Use code from API tutorial for c++ http://www.gdal.org/gdal_tutorial.html, also pasted below 5. Compile the program (everything compiles fine). 6. Run the program, does not bomb, but offers bad results. 7. If you look at the c++ code tutorial in step 4 it has various print statements. Here are the results from those print statements Driver: netCDF/Network Common Data Format Size is 76x40x93 Projection is ' ' Block=76x1 Type=Float32, ColorInterp=Undefinded Min=72.905d Max 115.625d Data=100.216d Problem: When I get a "band" and get the block size, the block size is reported as 76x1 (as in the snips below). I expected the block size to be 76x40 poBand = poDataset->GetRasterBand( 1 ); poBand->GetBlockSize( &nBlockXSize, &nBlockYSize ); When I read the block (putting the snip below in a nested loop for column and row) I get the proper data in that 76x1 (76 values) block, but I can't move onto the next row (ie row > 0). Which makes sense because the block is only 76x1. Also, if I get band "2" the same thing, good data, but only one column to work with. What am I missing? How do I retrieve the full band of 76x40? I even tried a JPEG file and got similar results? poBand->RasterIO( GF_Read, column, row, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0 ); Thanks in advance for any help or advice, James My program typedef __int64 _OFF_T; #include "gdal.h" #include "gdal_priv.h" #include "netcdf.h" #include "gdal_frmts.h" #include "netcdfdataset.h" #include "cpl_config.h" #include "cpl_conv.h" #include "cpl_error.h" #include "cpl_hash_set.h" #include "cpl_port.h" #include "cpl_string.h" #include "cpl_vsi.h" #include "cpl_minixml.h" #include "gdal_pam.h" #include "gdal_version.h" #include "gdal_vrt.h" #include "ogr_core.h" #include "ogr_spatialref.h" #include "ogr_srs_api.h" #include <iostream> using namespace std; //const char *pszFilename = "\\IMG_3527.jpg"; //const char *pszFilename = "\\hada2eugsi.nc"; const char *pszFilename = "\\james_test.nc"; //const char *pszFilename = "\\CRUTEM3.nc"; const char *netcdfmeta (""); char ** ppinfo; int * pncid; int main() { GDALAllRegister(); GDALDriver *poDriver = (GDALDriver *) GDALGetDriverByName( "VRT" ); poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly ); GDALGetMetadata(poDataset,netcdfmeta); //poDataset->GetPamInfo(); poDataset->GetMetadata(netcdfmeta); GDALOpenInfo(pszFilename, GA_ReadOnly ,ppinfo); //GDALGetGeoTransform( GDALDatasetH, double * ); if( poDataset == NULL ) { printf( "did not open file"); } double adfGeoTransform[6]; printf( "Driver: %s/%s\n", poDataset->GetDriver()->GetDescription(), poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) ); printf( "Size is %dx%dx%d\n", poDataset->GetRasterXSize(), poDataset->GetRasterYSize(), poDataset->GetRasterCount() ); if( poDataset->GetProjectionRef() != NULL ) printf( "Projection is `%s'\n", poDataset->GetProjectionRef() ); if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None ) { printf( "Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3] ); printf( "Pixel Size = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5] ); } GDALRasterBand *poBand; int nBlockXSize, nBlockYSize; int bGotMin, bGotMax; double adfMinMax[2]; poBand = poDataset->GetRasterBand( 1 ); poBand->GetBlockSize( &nBlockXSize, &nBlockYSize ); printf( "Block=%dx%d Type=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName( poBand->GetColorInterpretation()) ); adfMinMax[0] = poBand->GetMinimum( &bGotMin ); adfMinMax[1] = poBand->GetMaximum( &bGotMax ); if( ! (bGotMin && bGotMax) ) GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax); printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] ); if( poBand->GetOverviewCount() > 0 ) printf( "Band has %d overviews.\n", poBand->GetOverviewCount() ); if( poBand->GetColorTable() != NULL ) printf( "Band has a color table with %d entries.\n", poBand->GetColorTable()->GetColorEntryCount() ); float *pafScanline; int nXSize = poBand->GetXSize(); pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize); poBand->RasterIO( GF_Read, 0, 0, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0 ); printf( "data=%.3fd", *pafScanline ); GDALClose(poDataset); }
_______________________________________________ gdal-dev mailing list gdal-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/gdal-dev