The RIOS Library (http://rioshome.org) provides two methods of manipulating columns within a Raster Attribute Table (RAT):
- The ‘rat’ module can read an entire column to memory.
from osgeo import gdal from rios import rat # Open RAT dataset rat_dataset = gdal.Open("clumps.kea", gdal.GA_Update) # Get columns with average red and NIR for each object red = rat.readColumn(rat_dataset, "RedAvg") nir = rat.readColumn(rat_dataset, "NIR1Avg") ndvi = (nir - red) / (nir + red) # Write out column rat.writeColumn(rat_dataset, "NDVI", ndvi) # Close RAT dataset rat_dataset = None
- The newer ‘ratapplier’ module is modelled after the ‘applier’ module for images and allows a function to be applied to chunks of rows, making it particularly useful for a RAT which is too large to load to memory.
from rios import ratapplier def _ratapplier_calc_ndvi(info, inputs, outputs): """ Calculate NDVI from RAT. Called by ratapplier """ # Get columns with average red and NIR for each object # within block red = getattr(inputs.inrat, "RedAvg") nir = getattr(inputs.inrat, "NIR1Avg") # Calculate NDVI ndvi = (nir - red) / (nir + red) # Save to 'NDVI' column (will create if doesn't exist) setattr(outputs.outrat,"NDVI", ndvi) if __name__ == "__main__": # Set up rat applier for input / output in_rats = ratapplier.RatAssociations() out_rats = ratapplier.RatAssociations() # Pass in clumps file # Same file is used for input and output to write # to existing RAT in_rats.inrat = ratapplier.RatHandle("clumps.kea") out_rats.outrat = ratapplier.RatHandle("clumps.kea") # Apply function to all rows in chunks ratapplier.apply(_ratapplier_calc_ndvi, in_rats, out_rats)
Although using ratapplier looks slightly more complicated at first writing scripts to use it rather than the ‘rat’ interface means they will scale much better to larger datasets.
Both these examples are available to download from https://bitbucket.org/snippets/danclewley/7E666