private void addVirtualBand(final String operation, final String name_prefix, final String expression, final String unit, final double nodatavalue) { final VirtualBand virtBand = new VirtualBand(name_prefix, ProductData.TYPE_FLOAT32, sourceProduct.getSceneRasterWidth(), sourceProduct.getSceneRasterHeight(), expression); virtBand.setUnit(unit); virtBand.setDescription(name_prefix + ' ' + operation + ' ' + unit); virtBand.setNoDataValueUsed(true); virtBand.setNoDataValue(nodatavalue); final Band srcBand = sourceProduct.getBand(virtBand.getName()); if (srcBand != null) { sourceProduct.removeBand(srcBand); } sourceProduct.addBand(virtBand); ProductUtils.copyBand(name_prefix, sourceProduct, targetProduct, true); }
virtBand.setUnit(srcBand.getUnit()); virtBand.setDescription(srcBand.getDescription()); virtBand.setNoDataValue(srcBand.getNoDataValue()); virtBand.setNoDataValueUsed(srcBand.isNoDataValueUsed()); targetProduct.addBand(virtBand);
public static Product createProduct6() { try { Product product = new Product("Test_Product_6_SceneRasterTransforms", "Test_Type_6_SceneRasterTransforms", 512, 512); product.getMetadataRoot().addElement(new MetadataElement("Global_Attributes")); product.getMetadataRoot().addElement(new MetadataElement("Local_Attributes")); product.setModified(false); final String a_expression = "sin(4 * PI * sqrt( sq(X/1000.0 - 1) + sq(Y/500.0 - 1) ))"; final Band band_a = new VirtualBand("Band_A", ProductData.TYPE_FLOAT32, 2048, 1024, a_expression); final AffineTransform a_forward = new AffineTransform(); a_forward.scale(0.25, 0.5); final AffineTransform a_inverse = a_forward.createInverse(); band_a.setModelToSceneTransform(new AffineTransform2D(a_forward)); band_a.setSceneToModelTransform(new AffineTransform2D(a_inverse)); product.addBand(band_a); final String b_expression = "sin(4 * PI * sqrt( 2.0 * abs(X/1000.0 * Y/500.0) ))"; final VirtualBand band_b = new VirtualBand("Band_B", ProductData.TYPE_FLOAT32, 128, 256, b_expression); final AffineTransform b_forward = new AffineTransform(); b_forward.scale(2.0, 2.0); b_forward.translate(128, 0); final AffineTransform b_inverse = b_forward.createInverse(); band_b.setModelToSceneTransform(new AffineTransform2D(b_forward)); band_b.setSceneToModelTransform(new AffineTransform2D(b_inverse)); band_b.setNoDataValue(Double.NaN); band_b.setNoDataValueUsed(true); product.addBand(band_b); return product; } catch (NoninvertibleTransformException e) { return null; } }
@Override protected void onOK() { String uncertaintyExpression = targetExprArea.getText(); Product targetProduct = sourceBand.getProduct(); int width = sourceBand.getRasterWidth(); int height = sourceBand.getRasterHeight(); ProductNodeGroup<Band> bandGroup = targetProduct.getBandGroup(); VirtualBand uncertaintyBand = new VirtualBand(getBandName(), ProductData.TYPE_FLOAT32, width, height, uncertaintyExpression); uncertaintyBand.setDescription("Uncertainty propagated from band " + sourceBand.getName() + " = " + sourceBand.getExpression()); uncertaintyBand.setUnit(sourceBand.getUnit()); uncertaintyBand.setNoDataValue(Double.NaN); uncertaintyBand.setNoDataValueUsed(true); uncertaintyBand.setValidPixelExpression(sourceBand.getValidPixelExpression()); ProductUtils.copySpectralBandProperties(sourceBand, uncertaintyBand); bandGroup.add(uncertaintyBand); sourceBand.addAncillaryVariable(uncertaintyBand, relation); UndoRedo.Manager undoManager = SnapApp.getDefault().getUndoManager(targetProduct); if (undoManager != null) { undoManager.addEdit(new UndoableProductNodeInsertion<>(bandGroup, uncertaintyBand)); } hide(); uncertaintyBand.setModified(true); if (SnapApp.getDefault().getPreferences().getBoolean(BandMathsDialog.PREF_KEY_AUTO_SHOW_NEW_BANDS, true)) { OpenImageViewAction.openImageView(uncertaintyBand); } }
rasterWidth, rasterHeight, ozoneExpr); ozoneBand.setDescription("estimated ozone"); ozoneBand.setNoDataValue(0); ozoneBand.setNoDataValueUsed(true); ozoneBand.setUnit("kgm^-2"); rasterWidth, rasterHeight, presExpr); surfPresBand.setDescription("estimated sea level pressure (p0=101325 Pa, hScale=8.4km)"); surfPresBand.setNoDataValue(0); surfPresBand.setNoDataValueUsed(true); surfPresBand.setUnit("Pascal");