...
The following example explains how a band "output_bandmagnitude" is computed from two input bands "real" and "imag" using the following helper classes:
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
private static Product createTestProduct(int width, int height, int tileSize, int numResolutionsMax) { Product product = new Product("test", "test", width, height); product.setPreferredTileSize(tileSize, tileSize); product.setNumResolutionsMax(5numResolutionsMax); Band inputBand1realBand = product.addBand("input_band_1real", "X * X - Y * Y", ProductData.TYPE_FLOAT64); Band inputBand2imagBand = product.addBand("input_band_2imag", "2 * X * Y", ProductData.TYPE_FLOAT64); Band outputBandmagnitudeBand = product.addBand("output_bandmagnitude", ProductData.TYPE_FLOAT64); final MultiLevelModel multiLevelModel = ImageManager.getMultiLevelModel(inputBand1realBand); final MultiLevelSource multiLevelSource = new AbstractMultiLevelSource(multiLevelModel) { @Override public@Override void reset() { public void super.reset(); { // Tell the parent product that it's band data has changed super.reset(); outputBandmagnitudeBand.fireProductNodeDataChanged(); } } // Get the image for a given resolution level@Override @Override public RenderedImage createImage(int level) { return new RasterDataNodeOpImageMagnitudeOpImage(outputBandmagnitudeBand, ResolutionLevel.create(getModel(), level)), { // Compute the tile data @Override realBand, imagBand); protected void computeProductData(ProductData outputData, Rectangle region) throws IOException} { }; magnitudeBand.setSourceImage(new DefaultMultiLevelImage(multiLevelSource)); return intproduct; numElems} = region.widthprivate * region.height; static class MagnitudeOpImage extends RasterDataNodeOpImage { private final Band realBand; ProductData inputData1private = ProductData.createInstance(ProductData.TYPE_FLOAT64, numElems)final Band imagBand; public MagnitudeOpImage(Band outputBand, ResolutionLevel level, Band realBand, Band imagBand) { ProductData inputData2 = ProductData.createInstance(ProductData.TYPE_FLOAT64super(outputBand, numElemslevel); this.realBand = realBand; inputBand1.readRasterData(region.x, region.y, regionthis.width, region.height, inputData1);imagBand = imagBand; } @Override protected void inputBand2.readRasterData(region.x, region.y, region.width, region.height, inputData2);computeProductData(ProductData outputData, Rectangle region) throws IOException { ProductData realData = getRawProductData(realBand, region); for (int i = 0;ProductData iimagData < numElems; i++) {= getRawProductData(imagBand, region); int numElems = region.width * region.height; double value1for = inputData1.getElemDoubleAt(i); (int i = 0; i < numElems; i++) { double value2real = inputData2realData.getElemDoubleAt(i); double imag = imagData.getElemDoubleAt(i); outputData.setElemDoubleAt(i, value1 - value2); double result = Math.sqrt(real * real + imag * imag); } }outputData.setElemDoubleAt(i, result); }; } }; outputBand.setSourceImage(new DefaultMultiLevelImage(multiLevelSource)); |