[gdal-dev] ReadAsArray misbehaving...

Riaan van den Dool riaanvddool at gmail.com
Mon Sep 6 03:33:35 EDT 2010


Even

Thanks for pointing that out. I have now been able to solve that problem by
keeping the dataset in scope...

Riaan

On Fri, Sep 3, 2010 at 7:52 PM, Even Rouault
<even.rouault at mines-paris.org>wrote:

> Riann,
>
> hum, I think you've hit a classical problem with the use of the GDAL python
> bindings. The root of your problem is likely the following line:
>
>  reader = RasterReaderWriter(gdal.Open(iFilename).GetRasterBand(1))
>
> Currently the GDAL python bindings do a poor job with life cycle management
> of
> native underlying objects. When chaining the calls, some objects can go
> out-
> of-scope and are then destroyed. Specifically, the band object doesn't keep
> the
> dataset object alive, so the RasterReaderWriter() constructor will get a
> band
> object with a ghost dataset. This can typically result in application
> crashes,
> or as you've observed various corruptions.
>
> All in all, I'd advise you rewriting the above as :
>
> ds = gdal.Open(iFilename)
> band = ds.GetRasterBand(1)
> reader =  RasterReaderWriter(band)
> ....
> .....
> ds = None # we can drop the reference on the dataset when we don't need to
> use
> the reader.
>
> An alternative if you don't want to keep the reference on the dataset in
> the
> calling code, is to pass both the dataset and the band to
> RasterReaderWrite()
> so that it can stores them in member variables of the class.
>
> Best regards,
>
> Even
>
> Le vendredi 03 septembre 2010 12:39:09, Riaan van den Dool a écrit :
> > I have recently started a new open-source project that will use gdal
> > extensively, named scikits.eartho.
> >
> > The vision is to implement some advanced algorithms and ideas that we
> > develop and work with at the South African Satellite Applications Centre
> > (SAC) for use in Python (SciPy).
> >
> > I am experiencing some trouble with RasterBand.ReadAsArray.
> >
> > My python code:
> >
> > import osgeo.gdal as gdal
> >
> > class RasterReaderWriter:
> >     def __init__(self,  raster):
> >         self.raster = raster
> >         self.tileWidth =1024
> >         self.tileHeight = 1024
> >         self.tileNum = 0
> >
> >     def setTileSize(self,  width,  height):
> >         self.tileWidth =width
> >         self.tileHeight = height
> >
> >     def resetIterator(self):
> >         self.tileNum = 0
> >
> >     def readNextTile(self):
> >         tileRaster,  offsetX,  offsetY,  width,  height  =
> > self.readTile(self.tileNum)
> >         self.tileNum = self.tileNum + 1
> >         return tileRaster,  offsetX,  offsetY,  width,  height
> >
> >     def readTile(self,  tileNum):
> >         tilesInWidth = self.raster.XSize / self.tileWidth + 1
> >         offsetX = tileNum % tilesInWidth * self.tileWidth
> >         offsetY = tileNum / tilesInWidth * self.tileHeight
> >         width = min(self.tileWidth,  self.raster.XSize - offsetX)
> >         height = min(self.tileHeight,  self.raster.YSize - offsetY)
> >         print offsetX,  offsetY,  width,  height
> >         tileRaster = self.raster.ReadAsArray(offsetX,  offsetY, width,
> > height)
> >         return tileRaster,  offsetX,  offsetY,  width,  height
> >
> >
> >
> >
> > reader = RasterReaderWriter(gdal.Open(iFilename).GetRasterBand(1))
> > print reader.raster.XSize
> > print reader.raster.YSize
> > tile, offsetX, offsetY, width, height = reader.readNextTile()
> >
> > Before the call to readNextTile() the raster XSize and YSize is correct.
> > After the call the raster seems to have been corrupted as the XSize and
> > YSize have invalid values.
> >
> > Any help would be appreciated!
> >
> > Riaan
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20100906/50ea8951/attachment.html


More information about the gdal-dev mailing list