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()]); }
public RasterDataSymbol(final String symbolName, final RasterDataNode raster, final Source source) { this(symbolName, computeSymbolType(raster, source), raster, source); }
@Override public String evalS(EvalEnv env) throws EvalException { final double value = evalD(env); return Double.toString(value); } }
Band floatBand = new Band("floatBand", ProductData.TYPE_FLOAT32, 1, 1); RasterDataSymbol fgeo = new RasterDataSymbol("fgeo", floatBand, RasterDataSymbol.Source.GEOPHYSICAL); assertEquals("fgeo", fgeo.getName()); assertSame(floatBand, fgeo.getRaster()); assertEquals(Term.TYPE_D, fgeo.getRetType()); assertEquals(RasterDataSymbol.Source.GEOPHYSICAL, fgeo.getSource()); RasterDataSymbol fraw = new RasterDataSymbol("fraw", floatBand, RasterDataSymbol.Source.RAW); assertEquals("fraw", fraw.getName()); assertSame(floatBand, fraw.getRaster()); assertEquals(Term.TYPE_D, fraw.getRetType()); assertEquals(RasterDataSymbol.Source.RAW, fraw.getSource()); RasterDataSymbol sigeo = new RasterDataSymbol("sigeo", scaledIntBand, RasterDataSymbol.Source.GEOPHYSICAL); assertEquals("sigeo", sigeo.getName()); assertSame(scaledIntBand, sigeo.getRaster()); assertEquals(Term.TYPE_D, sigeo.getRetType()); assertEquals(RasterDataSymbol.Source.GEOPHYSICAL, sigeo.getSource()); RasterDataSymbol siraw = new RasterDataSymbol("siraw", scaledIntBand, RasterDataSymbol.Source.RAW); assertEquals("siraw", siraw.getName()); assertSame(scaledIntBand, siraw.getRaster()); assertEquals(Term.TYPE_I, siraw.getRetType()); assertEquals(RasterDataSymbol.Source.RAW, siraw.getSource());
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; }
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; }
/** * Utility method which returns all raster data nodes referenced in a given array of raster data symbols. * The given <code>rasterDataSymbols</code> argument can contain multiple references to the same raster data node, * e.g. if multilple {@link SingleFlagSymbol}s refer to the same raster. * * @param rasterDataSymbols the array to be analysed * @return the array of raster data nodes, never <code>null</code> but may be empty */ public static RasterDataNode[] getRefRasters(RasterDataSymbol[] rasterDataSymbols) { Set<RasterDataNode> set = new HashSet<>(rasterDataSymbols.length * 2); List<RasterDataNode> list = new ArrayList<>(rasterDataSymbols.length); for (RasterDataSymbol symbol : rasterDataSymbols) { RasterDataNode raster = symbol.getRaster(); if (!set.contains(raster)) { list.add(raster); set.add(raster); } } return list.toArray(new RasterDataNode[list.size()]); }
private static void registerBandSymbols(WritableNamespace namespace, Product product, String namePrefix) { for (int i = 0; i < product.getNumBands(); i++) { final Band band = product.getBandAt(i); final String symbolName = namePrefix + band.getName(); namespace.registerSymbol(new RasterDataSymbol(symbolName, band, RasterDataSymbol.GEOPHYSICAL)); namespace.registerSymbol(new RasterDataSymbol(symbolName + ".raw", band, RasterDataSymbol.RAW)); } }
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"); } } } }
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 void registerTiePointGridSymbols(WritableNamespace namespace, Product product, String namePrefix) { for (int i = 0; i < product.getNumTiePointGrids(); i++) { final TiePointGrid grid = product.getTiePointGridAt(i); final String symbolName = namePrefix + grid.getName(); namespace.registerSymbol(new RasterDataSymbol(symbolName, grid, RasterDataSymbol.GEOPHYSICAL)); } }
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 static void registerMaskSymbols(WritableNamespace namespace, Product product, String namePrefix) { for (int i = 0; i < product.getMaskGroup().getNodeCount(); i++) { final Mask mask = product.getMaskGroup().get(i); final String symbolName = namePrefix + mask.getName(); namespace.registerSymbol(new RasterDataSymbol(symbolName, mask)); } }
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; }