Dave, > >>> band.SetNoDataValue(0) # Set the NODATA value to > >>> zero print "Nodata:", band.GetNoDataValue(), > >>> type(band.GetNoDataValue()) > > Nodata: 0.0 <type 'float’> > > >>> mb = band.GetMaskBand() > >>> ma = mb.ReadAsArray() > >>> > >>> > >>> print "Origin:", ma[0, 0], type(ma[0, 0]) # *** SHOULD BE ZERO!!! ***
--> (Implicit) mask bands (such as the one generated for mask flag = GMF_ALL_VALID or GMF_NODATA), once fetched a first time, are no longer influenced by later actions. Re-opening the file should expose an updated mask band. > > Origin: 255 <type 'numpy.uint8'> > > >>> print "(5, 5):", ma[5, 5], type(ma[5, 5]) # Correct > > (5, 5): 255 <type 'numpy.uint8'> > > >>> print np.any(ma==0) # Mask band is entirely 255 > > False > > As you can see, the mask covers the entire image and not the zeros on the > edge. > > The band.GetNoDataValue() is returning a Python float() The C++ method always return a double, whatever the raster data type, hence the same for the Python bindings. > which leads me to > suspect that there is incorrect type handling within GDAL’s Python > wrapping such that the mask generation is trying to compare the band’s > raster values (GDAL_UInt16) to whatever the NoDataValue type is stored > internally. See my first explanation Even -- Spatialys - Geospatial professional services http://www.spatialys.com _______________________________________________ gdal-dev mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/gdal-dev
