public static RasterDataNode[] getRefRasters(String expression, Product... products) throws ParseException { return getRefRasters(expression, products, 0); }
private void checkExpressionForExternalReferences(String expression) { final Product[] compatibleProducts = getCompatibleProducts(); if (compatibleProducts.length > 1) { int defaultIndex = Arrays.asList(compatibleProducts).indexOf(targetProduct); RasterDataNode[] rasters = null; try { rasters = BandArithmetic.getRefRasters(expression, compatibleProducts, defaultIndex); } catch (ParseException ignored) { } if (rasters != null && rasters.length > 0) { Set<Product> externalProducts = new HashSet<Product>(compatibleProducts.length); for (RasterDataNode rdn : rasters) { Product product = rdn.getProduct(); if (product != targetProduct) { externalProducts.add(product); } } if (!externalProducts.isEmpty()) { visatApp.showWarningDialog("The entered maths expression references multiple products.\n" + "It will cause problems unless the session is restored as is.\n\n" + "Note: You can save the session from the file menu."); } } } }
private void collectReferencedRastersInExpression(String expression, ArrayList<String> referencedNodeNames) { if (expression == null || expression.trim().isEmpty()) { return; } try { final Term term = sourceProduct.parseExpression(expression); final RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(term); final RasterDataNode[] refRasters = BandArithmetic.getRefRasters(refRasterDataSymbols); if (refRasters.length > 0) { for (RasterDataNode refRaster : refRasters) { final String refNodeName = refRaster.getName(); if (!referencedNodeNames.contains(refNodeName)) { referencedNodeNames.add(refNodeName); collectReferencedRastersInExpression(refNodeName, referencedNodeNames); } } } } catch (ParseException e) { getLogger().log(Level.WARNING, e.getMessage(), e); } }
private static String createUnambiguousExpression(String vme, Product[] products, int productIndex) throws ParseException { RasterDataNode[] rasters = getRefRasters(vme, products, productIndex); for (RasterDataNode raster : rasters) { String name = raster.getName();
private static Map<Mask, Mask> transferReferredMasks(String expression, Product sourceProduct, Product targetProduct) { final Map<Mask, Mask> translationMap = new HashMap<Mask, Mask>(); final RasterDataNode[] rasters; try { rasters = BandArithmetic.getRefRasters(expression, sourceProduct); } catch (ParseException e) { return translationMap; } for (RasterDataNode raster : rasters) { if (raster instanceof Mask && !targetProduct.getMaskGroup().contains(raster.getName())) { Mask refMask = (Mask) raster; Mask newMask = refMask.getImageType().transferMask(refMask, targetProduct); translationMap.put(refMask, newMask); } } return translationMap; }
final ProductManager productManager = product.getProductManager(); if (productManager != null) { nodes = BandArithmetic.getRefRasters(expression, productManager.getProducts(), productManager.getProductIndex(product)); } else { nodes = BandArithmetic.getRefRasters(expression, product);
Assert.argument(defaultProductIndex >= 0 && defaultProductIndex < products.length, "defaultProductIndex"); final RasterDataNode[] rasters = getRefRasters(expression, products, defaultProductIndex); if (rasters.length == 0) { return validMaskExpression;
expression); try { final RasterDataNode[] refRasters = BandArithmetic.getRefRasters(expression, product); String validExpression = null; for (RasterDataNode refRaster : refRasters) {
return BandArithmetic.getRefRasters(refRasterDataSymbols);
@Override public boolean canTransferMask(Mask mask, Product product) { final String expression = getExpression(mask); if (StringUtils.isNullOrEmpty(expression)) { return false; } try { if (mask.getProduct() != null) { for (RasterDataNode raster : BandArithmetic.getRefRasters(expression, mask.getProduct())) { if (raster instanceof Mask) { if (!product.getMaskGroup().contains(raster.getName())) { Mask refMask = (Mask) raster; if (!canTransferMask(refMask, product)) { return false; } } } else { if (!product.containsRasterDataNode(raster.getName())) { return false; } } } } else { // the mask has not been added to a product yet BandArithmetic.getRefRasters(expression, product); } } catch (ParseException e) { return false; } return true; }
static void copyReferencedRasters(String validMaskExpression, Scene sourceScene, Scene targetScene, ProductSubsetDef subsetDef) throws ParseException { final Product targetProduct = targetScene.getProduct(); final RasterDataNode[] nodes = BandArithmetic.getRefRasters(validMaskExpression, sourceScene.getProduct()); for (RasterDataNode node : nodes) { if (!targetProduct.containsRasterDataNode(node.getName())) { if (node instanceof TiePointGrid) { TiePointGrid tpg = TiePointGrid.createSubset((TiePointGrid) node, subsetDef); targetProduct.addTiePointGrid(tpg); } if (node instanceof Band) { final Band sourceBand = (Band) node; final Band band = createSubset(sourceBand, targetScene, subsetDef); targetProduct.addBand(band); setFlagCoding(band, sourceBand.getFlagCoding()); } } } }
@Test public void testGetRefRasterDataSymbols() throws ParseException { FlagCoding fc = createFlagCoding(); Product p1 = createProduct(fc, 1); RasterDataNode[] rasters; rasters = BandArithmetic.getRefRasters("c + w * q - w", p1); assertNotNull(rasters); assertEquals(3, rasters.length); assertSame(p1.getBand("c"), rasters[0]); assertSame(p1.getBand("w"), rasters[1]); assertSame(p1.getBand("q"), rasters[2]); Product p2 = createProduct(fc, 2); Product p3 = createProduct(fc, 3); rasters = BandArithmetic.getRefRasters("c + ($2.w - $1.w) * $3.q + ($2.l - $1.l) * $3.q", p1, p3, p2); assertNotNull(rasters); assertEquals(6, rasters.length); assertSame(p1.getBand("c"), rasters[0]); assertSame(p2.getBand("w"), rasters[1]); assertSame(p1.getBand("w"), rasters[2]); assertSame(p3.getBand("q"), rasters[3]); assertSame(p2.getBand("l"), rasters[4]); assertSame(p1.getBand("l"), rasters[5]); }
public void testCreateDefaultNamespaceWithMultipleProducts() { final Namespace namespace = BandArithmetic.createDefaultNamespace(new Product[]{_product1, _product2}, 0); final Symbol symbolP1 = namespace.resolveSymbol("$1.b1"); assertNotNull(symbolP1); assertTrue(symbolP1 instanceof RasterDataSymbol); assertEquals("$1.b1", symbolP1.getName()); final Symbol symbolWithoutPrefix = namespace.resolveSymbol("b1"); assertNotNull(symbolWithoutPrefix); assertTrue(symbolP1 instanceof RasterDataSymbol); assertEquals("b1", symbolWithoutPrefix.getName()); final RasterDataNode[] refRasters = BandArithmetic.getRefRasters(new RasterDataSymbol[]{ (RasterDataSymbol) symbolWithoutPrefix, (RasterDataSymbol) symbolP1 }); assertEquals(1, refRasters.length); final Symbol symbolP2 = namespace.resolveSymbol("$2.b1"); assertNotNull(symbolP2); assertEquals("$2.b1", symbolP2.getName()); final Symbol symbolNotFound = namespace.resolveSymbol("fails"); assertNull(symbolNotFound); }