package mil.nga.giat.geowave.format.landsat8.qa; import java.awt.image.DataBuffer; import java.awt.image.MultiPixelPackedSampleModel; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.WritableRaster; import mil.nga.giat.geowave.format.landsat8.BandFeatureIterator; import mil.nga.giat.geowave.format.landsat8.Landsat8BandConverterSpi; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverageFactory; import org.opengis.feature.simple.SimpleFeature; public class QABandToIceMaskConverter implements Landsat8BandConverterSpi { private static final int doubleBitMask = 0x0003; private static final int tripleBitMask = 0x0007; @Override public GridCoverage2D convert( final String coverageName, final GridCoverage2D originalBandData, final SimpleFeature bandMetadata ) { final Object attrValue = bandMetadata.getAttribute(BandFeatureIterator.BAND_ATTRIBUTE_NAME); if ("BQA".equalsIgnoreCase(attrValue.toString())) { final MultiPixelPackedSampleModel newSampleModel = new MultiPixelPackedSampleModel( DataBuffer.TYPE_BYTE, originalBandData.getRenderedImage().getWidth(), originalBandData.getRenderedImage().getHeight(), 2); final WritableRaster nextRaster = Raster.createWritableRaster( newSampleModel, null); final RenderedImage image = originalBandData.getRenderedImage(); final Raster data = image.getData(); for (int x = 0; x < data.getWidth(); x++) { for (int y = 0; y < data.getHeight(); y++) { final int sample = getIceSample( x, y, data); nextRaster.setSample( x, y, 0, sample); } } final GridCoverage2D nextCov = new GridCoverageFactory().create( coverageName, nextRaster, originalBandData.getEnvelope()); return nextCov; } return originalBandData; } /** * returns -1 if the sample is not valid, returns 0 if the sample is no ice, * and return 1 if the sample is ice * * @return */ private int getIceSample( final int x, final int y, final Raster data ) { // if (x < 0 || y < 0 || x >= data.getWidth() || y >= data.getHeight()) // { // return -1; // } final int sample = data.getSample( x, y, 0); if ((sample & tripleBitMask) > 0) { return 0x00; } else if ((((sample >> 14) & doubleBitMask) == 3) || (((sample >> 12) & doubleBitMask) == 3)) { return 0x01; } return (((sample >> 10) & doubleBitMask) > 1) ? 0x03 : 0x02; } @Override public String getName() { return "icemask"; } }