@Override public RenderedImage createImage(int level) { return ImageManager.getInstance().createColoredBandImage(rasterDataNodes, imageInfo, level); } }
@Override public RenderedImage createImage(int level) { return ImageManager.getInstance().createColoredMaskImage(product, expression, color, inverseMask, level); } }
private static MultiLevelImage getMaskImage(Product product, String maskExpr) { MultiLevelImage maskImage = null; if (StringUtils.isNotNullAndNotEmpty(maskExpr)) { maskImage = ImageManager.getInstance().getMaskImage(maskExpr, product); } return maskImage; }
private BandImageMultiLevelSource(MultiLevelModel model, RasterDataNode[] rasterDataNodes) { super(model); this.rasterDataNodes = rasterDataNodes.clone(); imageInfo = ImageManager.getInstance().getImageInfo(rasterDataNodes); }
public static BandImageMultiLevelSource create(RasterDataNode[] rasterDataNodes, MultiLevelModel model, ProgressMonitor pm) { ImageManager.getInstance().prepareImageInfos(rasterDataNodes, pm); return new BandImageMultiLevelSource(model, rasterDataNodes); }
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 isPixelValid(Band band, int pixelX, int pixelY, int level) { if (band.isValidMaskUsed()) { PlanarImage image = ImageManager.getInstance().getValidMaskImage(band, level); Raster data = getRasterTile(image, pixelX, pixelY); return data.getSample(pixelX, pixelY, 0) != 0; } else { return true; } }
@Override protected RenderedImage createImage(int level) { ImageManager imageManager = ImageManager.getInstance(); RenderingHints rh = new RenderingHints(JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance( BorderExtenderCopy.BORDER_COPY)); PlanarImage geophysicalImage = imageManager.getGeophysicalImage(getSource(), level); int dataBufferType = getDataType() == ProductData.TYPE_FLOAT64 ? DataBuffer.TYPE_DOUBLE : DataBuffer.TYPE_FLOAT; geophysicalImage = FormatDescriptor.create(geophysicalImage, dataBufferType, null); PlanarImage validMaskImage = imageManager.getValidMaskImage(getSource(), level); if (validMaskImage != null) { geophysicalImage = new FillConstantOpImage(geophysicalImage, validMaskImage, Float.NaN); } return createSourceLevelImage(geophysicalImage, level, rh); } };
static PlanarImage getEffectiveMaskImage(RasterDataNode raster, int level, RenderedImage roiImage) { PlanarImage maskImage = ImageManager.getInstance().getValidMaskImage(raster, level); if (maskImage == roiImage) { return maskImage; } if (roiImage != null) { if (maskImage != null) { final ImageLayout imageLayout = new ImageLayout(); imageLayout.setTileWidth(maskImage.getTileWidth()); imageLayout.setTileHeight(maskImage.getTileHeight()); final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout); maskImage = MinDescriptor.create(maskImage, roiImage, hints); } else { maskImage = PlanarImage.wrapRenderedImage(roiImage); } } return maskImage; }
public static void accumulate(RasterDataNode rasterDataNode, int level, RenderedImage roiImage, Shape roiShape, StxOp op, ProgressMonitor pm) { Assert.notNull(rasterDataNode, "raster"); Assert.argument(level >= 0, "level"); Assert.argument(roiImage == null || level == 0, "level"); Assert.notNull(pm, "pm"); final PlanarImage dataImage = ImageManager.getInstance().getGeophysicalImage(rasterDataNode, level); if (dataImage.getSampleModel().getNumBands() != 1) { throw new IllegalStateException("dataImage.sampleModel.numBands != 1"); } PlanarImage maskImage = getEffectiveMaskImage(rasterDataNode, level, roiImage); Shape maskShape = getEffectiveShape(rasterDataNode, roiShape); accumulate(op, dataImage, maskImage, maskShape, pm); }
/** * Gets the valid-mask image associated with this {@code RasterDataNode}. * * @return The rendered image. * @since BEAM 4.2 */ public MultiLevelImage getValidMaskImage() { if (!isValidMaskImageSet() && isValidMaskUsed()) { synchronized (this) { if (!isValidMaskImageSet() && isValidMaskUsed()) { validMaskImage = ImageManager.getInstance().getMaskImage(getValidMaskExpression(), getProduct()); } } } return validMaskImage; }
private void initData(final Band latBand, final Band lonBand, final String validMaskExpr, ProgressMonitor pm) throws IOException { if (useTiling) { RenderedImage validMask = null; if (validMaskExpr != null && validMaskExpr.trim().length() > 0 && pixelPosEstimator != null) { validMask = ImageManager.getInstance().getMaskImage(validMaskExpr, latBand.getProduct()); } latLonImage = new LatLonImage(this.latBand.getGeophysicalImage(), this.lonBand.getGeophysicalImage(), validMask, pixelPosEstimator); } else { try { pm.beginTask("Preparing data for pixel based geo-coding...", 4); latGrid = PixelGrid.create(latBand, SubProgressMonitor.create(pm, 1)); lonGrid = PixelGrid.create(lonBand, SubProgressMonitor.create(pm, 1)); if (validMaskExpr != null && validMaskExpr.trim().length() > 0) { final BitRaster validMask = latBand.getProduct().createValidMask(validMaskExpr, SubProgressMonitor.create(pm, 1)); fillInvalidGaps(new RasterDataNode.ValidMaskValidator(rasterHeight, 0, validMask), (float[]) latGrid.getDataElems(), (float[]) lonGrid.getDataElems(), SubProgressMonitor.create(pm, 1)); } } finally { pm.done(); } } }
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; }
@Before public void setup() { reader = (GeoTiffProductReader) new GeoTiffProductReaderPlugIn().createReaderInstance(); outputStream = new ByteArrayOutputStream(); location = new File("memory.tif"); final int width = 14; final int height = 14; outProduct = new Product("P", "T", width, height); final Band bandInt16 = outProduct.addBand("int16", ProductData.TYPE_INT16); bandInt16.setDataElems(createShortData(getProductSize(), 23)); ImageManager.getInstance().getSourceImage(bandInt16, 0); }
/** * Gets the statistics. * If the statistics have not been set before they are computed using the given progress monitor {@code pm} and then set. * This method belongs to preliminary API and may be removed or changed in the future. * * @param accurate If true, accurate statistics are computed. * @param pm A progress monitor which is used to compute the new statistics, if required. * @return The statistics. * @since since BEAM 4.5 */ public synchronized Stx getStx(boolean accurate, ProgressMonitor pm) { if (stx == null || stx.getResolutionLevel() > 0 && accurate) { if (accurate) { setStx(computeStxImpl(0, pm)); } else { final int levelCount = getSourceImage().getModel().getLevelCount(); final int statisticsLevel = ImageManager.getInstance().getStatisticsLevel(this, levelCount); setStx(computeStxImpl(statisticsLevel, pm)); } } return stx; }
public static long getGeophysicalSampleLong(Band band, int pixelX, int pixelY, int level) { final PlanarImage image = ImageManager.getInstance().getSourceImage(band, level); final int tileX = image.XToTileX(pixelX); final int tileY = image.YToTileY(pixelY); final Raster data = image.getTile(tileX, tileY); final long sample; if (band.getDataType() == ProductData.TYPE_INT8) { sample = (byte) data.getSample(pixelX, pixelY, 0); } else if (band.getDataType() == ProductData.TYPE_UINT32) { sample = data.getSample(pixelX, pixelY, 0) & 0xFFFFFFFFL; } else { sample = data.getSample(pixelX, pixelY, 0); } if (band.isScalingApplied()) { return (long) band.scale(sample); } return sample; } }
public static double getGeophysicalSampleDouble(Band band, int pixelX, int pixelY, int level) { final PlanarImage image = ImageManager.getInstance().getSourceImage(band, level); final int tileX = image.XToTileX(pixelX); final int tileY = image.YToTileY(pixelY); final Raster data = image.getTile(tileX, tileY); if (data == null) { return Double.NaN; } final double sample; if (band.getDataType() == ProductData.TYPE_INT8) { sample = (byte) data.getSample(pixelX, pixelY, 0); } else if (band.getDataType() == ProductData.TYPE_UINT32) { sample = data.getSample(pixelX, pixelY, 0) & 0xFFFFFFFFL; } else { sample = data.getSampleDouble(pixelX, pixelY, 0); } if (band.isScalingApplied()) { return band.scale(sample); } return sample; }
/** * size of source image is calculated in * {@code com.bc.ceres.glevel.support.DefaultMultiLevelSource#createImage(int)} * <p/> * size of mask image is calculated in * {@code org.esa.beam.jai.ImageManager#createSingleBandedImageLayout(org.esa.beam.framework.datamodel.RasterDataNode)} * <p/> * they shall not produce different results. */ @Test public void testImageAndMaskSize() { Product p = new Product("n", "t", 8501, 7651); Band b = p.addBand("b", ProductData.TYPE_FLOAT32); b.setNoDataValue(13); b.setNoDataValueUsed(true); b.setSourceImage(ConstantDescriptor.create((float) p.getSceneRasterWidth(), (float) p.getSceneRasterHeight(), new Float[]{42f}, null)); ImageManager imageManager = ImageManager.getInstance(); int levelCount = b.getSourceImage().getModel().getLevelCount(); PlanarImage sourceImage = imageManager.getSourceImage(b, levelCount - 1); PlanarImage maskImage = imageManager.getValidMaskImage(b, levelCount - 1); assertEquals(sourceImage.getWidth(), maskImage.getWidth()); assertEquals(sourceImage.getHeight(), maskImage.getHeight()); }
@Test public void testWriteReadIndexCodingSingle8BitBand() throws IOException { outProduct.removeBand(outProduct.getBandAt(0)); final Band bandUInt8 = outProduct.addBand("uint8", ProductData.TYPE_UINT8); bandUInt8.setDataElems(createByteData(getProductSize(), 23)); ImageManager.getInstance().getSourceImage(bandUInt8, 0); setTiePointGeoCoding(outProduct); final IndexCoding indexCoding = new IndexCoding("color_map"); indexCoding.addIndex("i1", 23, ""); indexCoding.addIndex("i2", 24, ""); indexCoding.addIndex("i3", 27, ""); indexCoding.addIndex("i4", 30, ""); outProduct.getBandAt(0).setSampleCoding(indexCoding); outProduct.getIndexCodingGroup().add(indexCoding); final Product inProduct = writeReadProduct(); assertEquals(1, inProduct.getIndexCodingGroup().getNodeCount()); final Band indexBand = inProduct.getBandAt(0); testIndexCoding(indexBand, 4); }
@Test public void testWriteReadIndexCodingWith2BandsBand() throws IOException { final Band bandUInt8 = outProduct.addBand("uint8", ProductData.TYPE_UINT8); bandUInt8.setDataElems(createByteData(getProductSize(), 20)); ImageManager.getInstance().getSourceImage(bandUInt8, 0); setTiePointGeoCoding(outProduct); final IndexCoding indexCoding = new IndexCoding("color_map"); indexCoding.addIndex("i1", 23, ""); indexCoding.addIndex("i2", 24, ""); indexCoding.addIndex("i3", 27, ""); indexCoding.addIndex("i4", 30, ""); outProduct.getIndexCodingGroup().add(indexCoding); outProduct.getBandAt(0).setSampleCoding(indexCoding); outProduct.getBandAt(1).setSampleCoding(indexCoding); final Product inProduct = writeReadProduct(); assertEquals(1, inProduct.getIndexCodingGroup().getNodeCount()); testIndexCoding(inProduct.getBandAt(0), 4); testIndexCoding(inProduct.getBandAt(1), 4); }