<div dir="ltr"><div class="gmail_default" style="font-family:'comic sans ms',sans-serif">Hi,<br></div><div class="gmail_default" style=""><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">GDALRasterBand::RasterIO returning block containing 0 for area that does not overlap the data.<br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">This is slightly different from requesting data for an area that overlaps the data, but there is no data.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">Is there away of checking for this condition before I call RasterIO?</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">I’m using the following to read a block of data at a time:</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">GDALRasterBand *poBand;</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">…</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">poBand->RasterIO(GF_Read,startX+xoffset,startY+yoffset,blockWidth,blockHeight,buffer[band],blockWidth,blockHeight,GDT_Int32,0,0);</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">This works fine, but I would like to be told if the block I am reading does not overlap the data.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">There are two reasons for this;</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">(1)<span class="" style="white-space:pre">        </span>It’s an early exit, before the block is set to 0 or the no-data value.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">(2)<span class="" style="white-space:pre"> </span>It means I don’t have to check the block to see if it is filled with just 0 or no-data.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">The stack trace for the calls is as follows:</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><span class="" style="white-space:pre"> </span>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<span class="" style="white-space:pre">     </span>C++</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"> <span class="" style="white-space:pre">       </span>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<span class="" style="white-space:pre">     </span>C++</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"> <span class="" style="white-space:pre">       </span>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<span class="" style="white-space:pre">   </span>C++</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"> <span class="" style="white-space:pre">       </span>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<span class="" style="white-space:pre">       </span>C++</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">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.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">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).</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">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.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">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.</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">Thanks</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">Damian</font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="comic sans ms, sans-serif">Using: GDAL version 11.2</font></div></div></div>