Le mercredi 20 janvier 2016 08:26:51, trewdbal a écrit :
> Hi Folks,
> 
> I'm trying to read an image using ReadBlock, but the array is not filled
> with raster values.
> It works with RasterIO.
> 
> The code below is copied from the GDAL doc ( page
> <http://www.gdal.org/classGDALRasterBand.html#ad80cecc562fd48f5783677de6253
> 60ac> ), I just change the type of the pabyData array (I need float32).
> I tested with several raster formats, without result.

You can only use a destination array of Float32 if the natural data type 
reported by GetDataType() is GDT_Float32. IReadBlock() has no way to know the 
data type you expect.
If you need to read in a particular data type, which is not necessarily the 
natural data type of the band, you must use RasterIO(GF_Read, ... , 
GDT_Float32, ....) instead

> 
> Another point, maybe linked with the previous, in the doc at the line :
> GByte *pabyData = (GByte *) CPLMalloc(nXBlockSize * nYBlockSize);
> I'm confused not reading
> GByte *pabyData = (GByte *) CPLMalloc(nXBlockSize * nYBlockSize *
> sizeof(GByte));

sizeof(GByte) == sizeof(unsigned char) == 1 per the C standard

> 
> Thanks for any help.
> Trewdbal
> 
> int main()
> {
>       std::cout.precision(12);
> 
>       GDALAllRegister();
>       const char* PANFile = "/home/ficus/Code/Covariance/rasters/pan2048.tif";
> 
>       GDALDataset  *poDataset;
>       poDataset = (GDALDataset *) GDALOpen( PANFile, GA_ReadOnly );
> 
>       GDALRasterBand  *poBand;
>       int nXBlockSize, nYBlockSize;
> 
>       poBand = poDataset->GetRasterBand( 1 );
>       poBand->GetBlockSize( &nXBlockSize, &nYBlockSize );
> 
>       unsigned int SIZEX = poBand->GetXSize();
>       unsigned int SIZEY = poBand->GetYSize();
> 
>       int nXBlocks = (SIZEX + nXBlockSize - 1) / nXBlockSize;
>       int nYBlocks = (SIZEY + nYBlockSize - 1) / nYBlockSize;
> 
>       std::cout << " NBlocks = " << nXBlocks << " " << nYBlocks << std::endl;
>       std::cout << " Block Size = " << nXBlockSize << " " << nYBlockSize <<
> std::endl;
> 
>       float* pabyData = (float*)malloc(nXBlockSize * nYBlockSize *
> sizeof(float));
> 
>       int nXValid = 0;
>       int nYValid = 0;
> 
>       for( int iYBlock = 0; iYBlock < nYBlocks; iYBlock++ )
>       {
>               for( int iXBlock = 0; iXBlock < nXBlocks; iXBlock++ )
>               {
>               poBand->ReadBlock( iXBlock, iYBlock, pabyData );
> 
>                       std::cout << "test " << pabyData[25] << std::endl; // 
> Where we 
see that
> the array is full of 0 values...
> 
>                       // Compute the portion of the block that is valid
>                       // for partial edge blocks.
>                       if( (iXBlock+1) * nXBlockSize > poBand->GetXSize() )
>                               nXValid = poBand->GetXSize() - iXBlock * 
> nXBlockSize;
>                       else
>                               nXValid = nXBlockSize;
> 
>                       if( (iYBlock+1) * nYBlockSize > poBand->GetYSize() )
>                               nYValid = poBand->GetYSize() - iYBlock * 
> nYBlockSize;
>                       else
>                               nYValid = nYBlockSize;
>               }
>       }
> 
>       free(pabyData);
> 
>       GDALClose( poDataset );
> 
>       GDALDestroyDriverManager();
>       return 0;
> }
> 
> 
> 
> 
> --
> View this message in context:
> http://osgeo-org.1560.x6.nabble.com/Issue-with-ReadBlock-tp5246218.html
> Sent from the GDAL - Dev mailing list archive at Nabble.com.
> _______________________________________________
> gdal-dev mailing list
> [email protected]
> http://lists.osgeo.org/mailman/listinfo/gdal-dev

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com
_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to