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

Kyle Shannon ksshannon at gmail.com
Mon Aug 15 15:40:17 EDT 2011


James,

I don't have a lot of time, but I can address some things quickly.
Blocksize and raster size are not necessarily the same thing.  In some
datasets, a block is represented as a tile, in scanline oriented data, it is
represented as one scanline, or a row.  To obtain the x and y size of the
data set, use poDataset->GetRaster[XY]Size().  This should report the values
you are looking for.  To access all of the data, loop over the scanlines and
read in one at a time, or read in the entire raster into one buffer.  Hope
that helps.

kss

/**
 *
 * Kyle Shannon
 * ksshannon at gmail.com
 *
 */




On Mon, Aug 15, 2011 at 13:09, James Sulzman <sulzman at casco.net> wrote:

> 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 at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20110815/972a2549/attachment-0001.html


More information about the gdal-dev mailing list