[gdal-dev] GDALRasterBand::RasterIO returning block containing 0 for area that does not overlap the data.

Even Rouault even.rouault at spatialys.com
Fri Sep 25 06:16:30 PDT 2015


Le vendredi 25 septembre 2015 14:34:16, Damian Dixon a écrit :
> Even,
> 
> Is there away to get the bounding polygon of the data?

Not through the GDAL API, at least not in the fast way you want (you could 
potentially call GDALPolygonize but this is very very heavy processing)

If your interest is VRT, then parsing the VRT would probably the best 
solution.

> 
> Thanks
> Damian
> 
> On 25 September 2015 at 09:04, Even Rouault <even.rouault at spatialys.com>
> 
> wrote:
> > Damian,
> > 
> > There's no dedicated function in the GDAL API to know if a window is only
> > no
> > data without querying the pixel values. It would make only sense for
> > drivers
> > that support sparse coverages, like VRT, some formulations of TIFF with
> > missing blocks, ERDAS Imagine, GeoPackage, ...
> > 
> > Even
> > 
> > > Hi,
> > > 
> > > GDALRasterBand::RasterIO returning block containing 0 for area that
> > > does not overlap the data.
> > > 
> > > This is slightly different from requesting data for an area that
> > > overlaps the data, but there is no data.
> > > 
> > > Is there away of checking for this condition before I call RasterIO?
> > > 
> > > 
> > > I’m using the following to read a block of data at a time:
> > > 
> > > GDALRasterBand *poBand;
> > > …
> > 
> > poBand->RasterIO(GF_Read,startX+xoffset,startY+yoffset,blockWidth,blockHe
> > ig
> > 
> > > ht,buffer[band],blockWidth,blockHeight,GDT_Int32,0,0);
> > > 
> > > 
> > > This works fine, but I would like to be told if the block I am reading
> > 
> > does
> > 
> > > not overlap the data.
> > > 
> > > There are two reasons for this;
> > > 
> > > (1) It’s an early exit, before the block is set to 0 or the no-data
> > 
> > value.
> > 
> > > (2) It means I don’t have to check the block to see if it is filled
> > > with just 0 or no-data.
> > > 
> > > The stack trace for the calls is as follows:
> > > 
> > > tplgdal11164d.dll!VRTSimpleSource::GetSrcDstWindow(int nXOff, int
> > > nYOff, int nXSize, int nYSize, int nBufXSize, int nBufYSize, int *
> > > pnReqXOff,
> > 
> > int
> > 
> > > * pnReqYOff, int * pnReqXSize, int * pnReqYSize, int * pnOutXOff, int *
> > > pnOutYOff, int * pnOutXSize, int * pnOutYSize)  Line 685 C++
> > > 
> > >   tplgdal11164d.dll!VRTSimpleSource::RasterIO(int nXOff, int nYOff, int
> > > 
> > > nXSize, int nYSize, void * pData, int nBufXSize, int nBufYSize,
> > > GDALDataType eBufType, int nPixelSpace, int nLineSpace)  Line 889 +
> > > 0xad bytes C++
> > > 
> > >   tplgdal11164d.dll!VRTSourcedRasterBand::IRasterIO(GDALRWFlag eRWFlag,
> > 
> > int
> > 
> > > nXOff, int nYOff, int nXSize, int nYSize, void * pData, int nBufXSize,
> > 
> > int
> > 
> > > nBufYSize, GDALDataType eBufType, int nPixelSpace, int nLineSpace) 
> > > Line 206 + 0x9c bytes C++
> > > 
> > >   tplgdal11164d.dll!GDALRasterBand::RasterIO(GDALRWFlag eRWFlag, int
> > 
> > nXOff,
> > 
> > > int nYOff, int nXSize, int nYSize, void * pData, int nBufXSize, int
> > > nBufYSize, GDALDataType eBufType, int nPixelSpace, int nLineSpace) 
> > > Line 261 C++
> > > 
> > > In VRTSimpleSource::RasterIO the first thing that happens is a call to
> > > GetSrcDstWindow. If this call fails the function returns with a
> > > CE_None. This is after the block has been set to 0.
> > > 
> > > The simplest change would be to extend the return enum to have a
> > 
> > CE_NoData.
> > 
> > > But that does not really fit with the name of the enum and does to deal
> > > with (1).
> > > 
> > > The other option is to provide access to GetSrcDstWindow. This would
> > 
> > allow
> > 
> > > the application to check to see if there is data in the block
> > > requested.
> > > 
> > > 
> > > I may of course be missing a more sensible way of doing this without
> > > any code changes to GDAL. If I am missing something could someone let
> > > me know what I should be doing.
> > > 
> > > Thanks
> > > Damian
> > > 
> > > 
> > > Using: GDAL version 11.2
> > 
> > --
> > Spatialys - Geospatial professional services
> > http://www.spatialys.com

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com


More information about the gdal-dev mailing list