public static VirtualBandOpImage createMask(String expression, Product product, ResolutionLevel level) { return create(expression, ProductData.TYPE_UINT8, null, true, product, level); }
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(expression, product, ResolutionLevel.create(getModel(), level)); } };
@Override public Raster computeTile(int tileX, int tileY) { final Term term = parseExpression(); if (addDataToReferredRasterDataSymbols(getTileRect(tileX, tileY), term)) { termMap.put(new Point(tileX, tileY), term); return super.computeTile(tileX, tileY); } else { if (noDataRaster == null) { synchronized (this) { if (noDataRaster == null) { noDataRaster = createNoDataRaster(fillValue == null ? 0.0 : fillValue.doubleValue()); } } } return noDataRaster.createTranslatedChild(tileXToX(tileX), tileYToY(tileY)); } }
private Term parseExpression() { final Term term; try { term = BandArithmetic.parseExpression(expression, products, defaultProductIndex); } catch (ParseException e) { throw new RuntimeException(MessageFormat.format( "Could not parse expression: ''{0}''. {1}", expression, e.getMessage()), e); } final ImageManager imageManager = ImageManager.getInstance(); for (final RasterDataSymbol symbol : BandArithmetic.getRefRasterDataSymbols(term)) { if (imageManager.getSourceImage(symbol.getRaster(), getLevel()) == this) { throw new RuntimeException(MessageFormat.format( "Invalid reference ''{0}''.", symbol.getName())); } } return term; }
private String getImageComment(RenderedImage image) { if (image instanceof RasterDataNodeOpImage) { RasterDataNodeOpImage rdnoi = (RasterDataNodeOpImage) image; return rdnoi.getRasterDataNode().getName(); } else if (image instanceof VirtualBandOpImage) { VirtualBandOpImage vboi = (VirtualBandOpImage) image; return vboi.getExpression(); } else { final String s = image.toString(); final int p1 = s.indexOf('['); final int p2 = s.indexOf(']', p1 + 1); if (p1 > 0 && p2 > p1) { return s.substring(p1 + 1, p2 - 1); } return s; } }
private static VirtualBandOpImage create(String expression, int dataType, Number fillValue, boolean mask, Product[] products, int defaultProductIndex, ResolutionLevel level) { Assert.notNull(expression, "expression"); Assert.notNull(products, "products"); Assert.argument(products.length > 0, "products"); Assert.argument(defaultProductIndex >= 0, "defaultProductIndex"); Assert.argument(defaultProductIndex < products.length, "defaultProductIndex"); Assert.notNull(level, "level"); return new VirtualBandOpImage(expression, dataType, fillValue, mask, products, defaultProductIndex, level); }
private boolean addDataToReferredRasterDataSymbols(Rectangle destRect, Term term) { for (final RasterDataSymbol symbol : BandArithmetic.getRefRasterDataSymbols(term)) { final RenderedImage sourceImage; final int dataType; final RasterDataNode rasterDataNode = symbol.getRaster(); if (symbol.getSource() == RasterDataSymbol.GEOPHYSICAL) { sourceImage = ImageManager.getInstance().getGeophysicalImage(rasterDataNode, getLevel()); dataType = rasterDataNode.getGeophysicalDataType(); } else { sourceImage = ImageManager.getInstance().getSourceImage(rasterDataNode, getLevel()); dataType = rasterDataNode.getDataType(); } final Raster sourceRaster = sourceImage.getData(destRect); if (sourceRaster instanceof NoDataRaster) { return false; } DataBuffer dataBuffer = sourceRaster.getDataBuffer(); if (dataBuffer.getSize() != destRect.width * destRect.height) { final WritableRaster writableRaster = sourceRaster.createCompatibleWritableRaster(destRect); sourceImage.copyData(writableRaster); dataBuffer = writableRaster.getDataBuffer(); } symbol.setData(ProductData.createInstance(dataType, ImageUtils.getPrimitiveArray(dataBuffer))); } return true; }
public static VirtualBandOpImage create(String expression, int dataType, Number fillValue, Product product, ResolutionLevel level) { return create(expression, dataType, fillValue, false, product, level); }
@Override protected void prepareInputs() throws OperatorException { super.prepareInputs(); final File auxdataDir = installAuxiliaryData(); if (nadir) { initNadirCoefficients(auxdataDir); if (nadirMaskExpression != null && !nadirMaskExpression.isEmpty()) { nadirMaskOpImage = VirtualBandOpImage.createMask(nadirMaskExpression, sourceProduct, ResolutionLevel.MAXRES); } } if (dual) { initDualCoefficients(auxdataDir); if (dualMaskExpression != null && !dualMaskExpression.isEmpty()) { dualMaskOpImage = VirtualBandOpImage.createMask(dualMaskExpression, sourceProduct, ResolutionLevel.MAXRES); } } }
public static VirtualBandOpImage create(String expression, int dataType, Number fillValue, Product[] products, int defaultProductIndex, ResolutionLevel level) { return create(expression, dataType, fillValue, false, products, defaultProductIndex, level); }
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(getExpression(mask), mask.getProduct(), ResolutionLevel.create(getModel(), level)); } };
PlanarImage createValidMaskImage(Product product) { if (expression != null && product.isCompatibleBandArithmeticExpression(expression)) { return VirtualBandOpImage.create(expression, ProductData.TYPE_UINT8, 0, product, ResolutionLevel.MAXRES); } else { return ConstantDescriptor.create((float) product.getSceneRasterWidth(), (float) product.getSceneRasterHeight(), new Byte[]{-1}, null); } }
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(getExpression(mask), mask.getProduct(), ResolutionLevel.create(getModel(), level)); } };
private PlanarImage createExpressionImage(final String expression, Product product) { final MultiLevelImage sourceImage = product.getBandAt(0).getSourceImage(); final ResolutionLevel resolutionLevel = ResolutionLevel.create(sourceImage.getModel(), 0); final float fillValue = 0.0f; return VirtualBandOpImage.create(expression, ProductData.TYPE_FLOAT32, fillValue, product, resolutionLevel); }
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.createMask(expression, p, ResolutionLevel.create(getModel(), level)); } }, expression, p);
@Override public RenderedImage createImage(int level) { return VirtualBandOpImage.create(expression, associatedNode.getDataType(), associatedNode.isNoDataValueUsed() ? associatedNode.getGeophysicalNoDataValue() : null, associatedNode.getProduct(), ResolutionLevel.create(getModel(), level)); } };
@Override protected void prepareInputs() throws OperatorException { super.prepareInputs(); validateParameters(); final float lambda1 = getWavelength(lowerBaselineBandName); final float lambda2 = getWavelength(signalBandName); final float lambda3 = getWavelength(upperBaselineBandName); algorithm = new BaselineAlgorithm(); algorithm.setWavelengths(lambda1, lambda3, lambda2); algorithm.setCloudCorrectionFactor(cloudCorrectionFactor); if (maskExpression != null && !maskExpression.isEmpty()) { maskOpImage = VirtualBandOpImage.createMask(maskExpression, sourceProduct, ResolutionLevel.MAXRES); } }
private static VirtualBandOpImage create(String expression, int dataType, Number fillValue, boolean mask, Product product, ResolutionLevel level) { Assert.notNull(product, "product"); Assert.notNull(level, "level"); final Product[] products; final int defaultProductIndex; if (product.getProductManager() != null) { products = product.getProductManager().getProducts(); defaultProductIndex = product.getProductManager().getProductIndex(product); } else { products = new Product[]{product}; defaultProductIndex = 0; } Assert.state(defaultProductIndex >= 0 && defaultProductIndex < products.length); Assert.state(products[defaultProductIndex] == product); return create(expression, dataType, fillValue, mask, products, defaultProductIndex, level); }
@Test public void testGetSamplesFloatWithNoDataAndBorderExtender() { Product product = new Product("n", "t", 1000, 1000); product.setPreferredTileSize(100, 100); Band band = product.addBand("x", ProductData.TYPE_FLOAT32); band.setScalingFactor(10.0); band.setGeophysicalNoDataValue(5025); band.setNoDataValueUsed(true); band.setSourceImage(VirtualBandOpImage.create("Y * 1000 + X", band.getDataType(), Float.NaN, product, ResolutionLevel.MAXRES)); MultiLevelImage sourceImage = band.getSourceImage(); Rectangle tileBounds = sourceImage.getTile(0,0).getBounds(); tileBounds.grow(10,0); BorderExtenderConstant nanExtender = new BorderExtenderConstant(new double[]{Float.NaN}); TileImpl tile = new TileImpl(band, sourceImage.getExtendedData(tileBounds, nanExtender)); try { float[] samplesFloat = tile.getSamplesFloat(); assertEquals(120*100, samplesFloat.length); assertEquals(Float.NaN, samplesFloat[2], 1.0e-6f); // NaN because of BorderExtender assertEquals(5005, samplesFloat[10], 1.0e-6f); assertEquals(Float.NaN, samplesFloat[12], 1.0e-6f); // NaN because of GeophysicalNoDataValue } catch (OperatorException e) { Assert.fail("OperatorException should not been thrown."); } }