/** * * @param raster * abstract raster data source */ public RasterDataUtility( AbstractRaster raster ) { this( raster.getAsSimpleRaster().getRasterData() ); }
/** * @return the number of bands in this raster. */ public int getBands() { return getRasterData().getBands(); }
@Override public int getColumns() { return getRasterData().getColumns(); }
/** * @return the number of bands in this raster. */ public BandType[] getBandTypes() { return getRasterData().getDataInfo().bandInfo; }
@Override public int getRows() { return getRasterData().getRows(); }
@Override public RasterDataInfo getRasterDataInfo() { return getRasterData().getDataInfo(); }
@Override public void setSubRaster( Envelope env, AbstractRaster source ) { RasterRect rect = getRasterReference().convertEnvelopeToRasterCRS( env ); SimpleRaster src = source.getSubRaster( env ).getAsSimpleRaster(); // source.getSubset( env ) already returns a copy, no need for getReadOnlyRasterData getRasterData().setSubset( rect.x, rect.y, rect.width, rect.height, src.getRasterData() ); }
/** * Creates a buffered image from a given {@link AbstractRaster}, note creating an image might result in a incorrect * view of the raster. * * @param raster * to create the image from * * @return a {@link BufferedImage} created from the given raster. */ public static BufferedImage imageFromRaster( AbstractRaster raster ) { if ( raster != null ) { SimpleRaster sr = raster.getAsSimpleRaster(); return rasterDataToImage( sr.getRasterData() ); } return null; }
@Override public void write( AbstractRaster raster, OutputStream out, RasterIOOptions options ) throws IOException { LOG.debug( "writing to stream with JAI" ); String ext = options.get( RasterIOOptions.OPT_FORMAT ); String format = JAIRasterIOProvider.getJAIFormat( ext ); if ( format != null ) { JAIRasterDataWriter.saveRasterDataToStream( raster.getAsSimpleRaster().getRasterData(), out, format ); } else { JAIRasterDataWriter.saveRasterDataToStream( raster.getAsSimpleRaster().getRasterData(), out, "TIFF" ); } }
@Override public void write( AbstractRaster raster, OutputStream out, RasterIOOptions options ) throws IOException { LOG.debug( "writing to stream with ImageIO" ); String format = options != null ? options.get( RasterIOOptions.OPT_FORMAT ) : null; if ( "geotiff".equals( format ) ) { GeoTiffWriter.save( raster, out ); } else { IIORasterDataWriter.saveRasterDataToStream( raster.getAsSimpleRaster().getRasterData(), out, format ); } }
@Override public void setSubRaster( Envelope env, int dstBand, AbstractRaster source ) { // calculate position in RasterData RasterRect rect = getRasterReference().convertEnvelopeToRasterCRS( env ); getRasterData().setSubset( rect.x, rect.y, dstBand, 0, source.getAsSimpleRaster().getReadOnlyRasterData() ); }
@Override public void write( AbstractRaster raster, File file, RasterIOOptions options ) throws IOException { LOG.debug( "writing " + file + " with ImageIO" ); String format = options != null ? options.get( RasterIOOptions.OPT_FORMAT ) : null; if ( format == null ) { format = FileUtils.getFileExtension( file ); } LOG.debug( "Writing raster with width: {} height: {}", raster.getColumns(), raster.getRows() ); if ( "geotiff".equals( format ) ) { GeoTiffWriter.save( raster, file ); } else { IIORasterDataWriter.saveRasterDataToFile( raster.getAsSimpleRaster().getRasterData(), file, format ); RasterGeoReference rasterReference = raster.getRasterReference(); WorldFileAccess.writeWorldFile( rasterReference, file ); } }
@Override public void setSubRaster( double x, double y, int dstBand, AbstractRaster source ) { // calculate position in RasterData int offset[] = getRasterReference().getRasterCoordinate( x, y ); getRasterData().setSubset( offset[0], offset[1], dstBand, 0, source.getAsSimpleRaster().getReadOnlyRasterData() ); }
@Override public SimpleRaster getSubRaster( Envelope envelope, BandType[] bands, OriginLocation targetLocation ) { // rb: testing for envelope equality can lead to a memory leak, because the memory can not be freed. RasterRect rasterRect = getRasterReference().convertEnvelopeToRasterCRS( envelope ); RasterGeoReference rasterReference = getRasterReference().createRelocatedReference( targetLocation, envelope ); // RasterData view = getReadOnlyRasterData().getSubset( rasterRect, bands ); // rb: don't need to get a readonly raster data, because it will be filled with data later. RasterData view = getRasterData().getSubset( rasterRect, bands ); return new SimpleRaster( view, envelope, rasterReference, metadata ); }
/** * Creates a SimpleRaster with same size, DataType and InterleaveType * * @param bands * number of bands * @return new empty SimpleRaster */ public SimpleRaster createCompatibleSimpleRaster( BandType[] bands ) { RasterData data = this.getRasterData(); RasterData newRaster = data.createCompatibleWritableRasterData( new RasterRect( 0, 0, getColumns(), getRows() ), bands ); return new SimpleRaster( newRaster, getEnvelope(), getRasterReference(), metadata ); }
@Override public void setSubRaster( double x, double y, AbstractRaster source ) { // calculate position in RasterData int offset[] = getRasterReference().getRasterCoordinate( x, y ); RasterData sourceRD = source.getAsSimpleRaster().getReadOnlyRasterData(); getRasterData().setSubset( offset[0], offset[1], sourceRD.getColumns(), sourceRD.getRows(), sourceRD ); }
/** * Create a RasterDataUtility object, where channels are mapped according to the RasterStyle options * * @param raster * @param style */ public RasterDataUtility( AbstractRaster raster, RasterChannelSelection style ) { this( raster.getAsSimpleRaster().getRasterData() ); if ( style != null ) { style.evaluate( raster.getRasterDataInfo().bandInfo ); if ( style.getMode() == ChannelSelectionMode.RGB || style.getMode() == ChannelSelectionMode.GRAY ) { channelMappings = true; indexes = style.evaluate( raster.getRasterDataInfo().bandInfo ); } } }
/** * Returns a single band of the raster. * * @param band * Number of the selected band. * @return A copy of the selected band. */ public SimpleRaster getBand( int band ) { return new SimpleRaster( getRasterData().getSubset( new RasterRect( 0, 0, getColumns(), getRows() ), new BandType[] {} ), getEnvelope(), getRasterReference(), metadata ); }
/** * Creates a new empty writable SimpleRaster with same size, DataType and InterleaveType. * * @return new empty SimpleRaster */ public SimpleRaster createCompatibleSimpleRaster() { int height = this.getRows(); int width = this.getColumns(); RasterData data = this.getRasterData(); BandType[] bands = data.getDataInfo().bandInfo; RasterData newRaster = data.createCompatibleWritableRasterData( new RasterRect( 0, 0, width, height ), bands ); return new SimpleRaster( newRaster, this.getEnvelope(), this.getRasterReference(), metadata ); }
@Override public void setSubRaster( double x, double y, AbstractRaster source ) { RasterGeoReference srcREnv = source.getRasterReference(); RasterGeoReference dstREnv = new RasterGeoReference( srcREnv.getOriginLocation(), srcREnv.getResolutionX(), srcREnv.getResolutionY(), x, y ); Envelope dstEnv = dstREnv.getEnvelope( source.getColumns(), source.getRows(), source.getCoordinateSystem() ); RasterData srcData = source.getAsSimpleRaster().getRasterData(); SimpleRaster movedRaster = new SimpleRaster( srcData, dstEnv, dstREnv, metadata ); setSubRaster( dstEnv, movedRaster ); }