Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
languagejava
titleMulti-level Source Image
linenumberstrue
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));