/** * Utility method which returns all raster data symbols references in a given term. * * @param term the term to be analysed * @return the array of raster data symbols, never <code>null</code> but may be empty */ public static RasterDataSymbol[] getRefRasterDataSymbols(Term term) { return getRefRasterDataSymbols(new Term[]{term}); }
public static RasterDataNode[] getRefRasters(String expression, Product[] products, int defaultProductNamePrefix) throws ParseException { RasterDataSymbol[] symbols = getRefRasterDataSymbols( new Term[]{parseExpression(expression, products, defaultProductNamePrefix)}); RasterDataNode[] rasters = new RasterDataNode[symbols.length]; for (int i = 0; i < symbols.length; i++) { rasters[i] = symbols[i].getRaster(); } return rasters; }
private static RasterRegion[] createRasterRegions(final Term[] terms, final int width, final int height) { final Set<RasterDataSymbol> rasterSymbolSet = new HashSet<RasterDataSymbol>(); for (final Term term : terms) { final RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(term); rasterSymbolSet.addAll(Arrays.asList(refRasterDataSymbols)); } List<RasterRegion> rasterRegions = new ArrayList<RasterRegion>(rasterSymbolSet.size()); for (RasterDataSymbol symbol : rasterSymbolSet) { RasterRegion rasterRegion = RasterRegion.createRasterRegion(symbol.getRaster(), width, height); rasterRegions.add(rasterRegion); symbol.setData(rasterRegion.getData().getElems()); } return rasterRegions.toArray(new RasterRegion[rasterRegions.size()]); }
private static void checkRegion(final int offsetX, final int offsetY, final int width, final int height, final Term[] terms) { for (final Term term : terms) { final RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(term); for (RasterDataSymbol refRasterDataSymbol : refRasterDataSymbols) { final RasterDataNode raster = refRasterDataSymbol.getRaster(); final int rasterWidth = raster.getSceneRasterWidth(); final int rasterHeight = raster.getSceneRasterHeight(); if (rasterWidth < (offsetX + width) || rasterHeight < (offsetY + height)) { throw new IllegalArgumentException("out of bounds."); } } } }
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 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 boolean isTargetBandReferencedInExpression() { final Product[] products = getCompatibleProducts(); final int defaultIndex = Arrays.asList(products).indexOf(visatApp.getSelectedProduct()); final Namespace namespace = BandArithmetic.createDefaultNamespace(products, defaultIndex == -1 ? 0 : defaultIndex); final Parser parser = new ParserImpl(namespace, false); try { final Term term = parser.parse(getExpression()); final RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(term); String bName = getBandName(); if (targetProduct.containsRasterDataNode(bName)) { for (final RasterDataSymbol refRasterDataSymbol : refRasterDataSymbols) { final String refRasterName = refRasterDataSymbol.getRaster().getName(); if (bName.equalsIgnoreCase(refRasterName)) { return true; } } } } catch (ParseException e) { return false; } return false; }
final RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(terms); return BandArithmetic.getRefRasters(refRasterDataSymbols);
final RasterDataSymbol[] termSymbols = BandArithmetic.getRefRasterDataSymbols(term); for (final RasterDataSymbol termSymbol : termSymbols) { final RasterDataNode refRaster = termSymbol.getRaster();
public void testGetRefRasterDataSymbols() throws ParseException { final Product[] products = new Product[]{_product1, _product2}; final Parser parser = new ParserImpl(BandArithmetic.createDefaultNamespace(products, 0), false); String[] expectedSymbols = new String[]{"b1", "$2.b1"}; final Term term = parser.parse("b1 + $2.b1"); final RasterDataSymbol[] rasterSymbols = BandArithmetic.getRefRasterDataSymbols(term); assertEquals(2, rasterSymbols.length); for (int i = 0; i < expectedSymbols.length; i++) { String expectedSymbol = expectedSymbols[i]; boolean found = false; for (int j = 0; j < rasterSymbols.length; j++) { RasterDataSymbol rasterSymbol = rasterSymbols[j]; if (expectedSymbol.equals(rasterSymbol.getName())) { found = true; break; } } if (!found) { fail("Expected symbol {" + expectedSymbol + "} not found"); } } } }
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; }
Rectangle rect = targetTile.getRectangle(); Term term = createTerm(descriptorMap.get(band).expression); RasterDataSymbol[] refRasterDataSymbols = BandArithmetic.getRefRasterDataSymbols(term);