[gdal-dev] Help with GDAL & Visual Studio 2010 & netCDF

James Sulzman sulzman at casco.net
Mon Aug 15 15:09:19 EDT 2011

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

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





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,





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()








       GDALDriver *poDriver = (GDALDriver *) GDALGetDriverByName( "VRT" );


       poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );








       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()->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,



                    poBand->GetColorInterpretation()) );


        adfMinMax[0] = poBand->GetMinimum( &bGotMin );

        adfMinMax[1] = poBand->GetMaximum( &bGotMax );

        if( ! (bGotMin && bGotMax) )

            GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE,


        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 );







-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20110815/b4fe8225/attachment-0001.html

More information about the gdal-dev mailing list