/** * * @param raster * abstract raster data source */ public RasterDataUtility( AbstractRaster raster ) { this( raster.getAsSimpleRaster().getRasterData() ); }
@Override public RasterDataInfo getRasterDataInfo() { SimpleRaster raster = multiRange.get( 0 ).getAsSimpleRaster(); if ( raster != null ) { return raster.getRasterDataInfo(); } return null; }
/** * Sets a range with data from source. * * @param x * left boundary * @param y * upper boundary * @param index * index of the destination range * @param source * data to copy (first band will be used) */ @Override public void setSubRaster( double x, double y, int index, AbstractRaster source ) { // checkBounds(x, y, source.getColumns(), source.getRows()); if ( index >= getNumberOfRanges() ) { throw new IndexOutOfBoundsException(); } SimpleRaster raster = multiRange.get( index ).getAsSimpleRaster(); raster.setSubRaster( x, y, source ); multiRange.set( index, raster ); }
@Override public SimpleRaster getAsSimpleRaster() { int i = 0; SimpleRaster raster = multiRange.get( i ).getAsSimpleRaster(); SimpleRaster result = raster.createCompatibleSimpleRaster( BandType.fromBufferedImageType( 0, multiRange.size(), null ) ); result.setSubRaster( getEnvelope(), i, raster ); for ( i = 1; i < multiRange.size(); i++ ) { raster = multiRange.get( i ).getAsSimpleRaster(); result.setSubRaster( getEnvelope(), i, raster ); } return result; }
@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" ); } }
/** * 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; }
/** * Apply the given kernel to the given raster */ public void run() { long time = currentTimeMillis(); Envelope env = originalRaster.getRasterReference().getEnvelope( newTileRect, null ); SimpleRaster procesRaster = originalRaster.getSubRaster( env ).getAsSimpleRaster(); DEMFilter filter = new SmoothingFilter( size, stdevCorr, procesRaster ); SimpleRaster filteredResult = filter.applyFilter(); resultWriter.push( filteredResult ); this.availableFilters.push( this ); synchronized ( lock ) { lock.notifyAll(); } LOG.info( "{}. Filtering of tile took: {} seconds.", Thread.currentThread().getName(), ( Math.round( ( currentTimeMillis() - time ) / 10d ) / 100d ) ); } }
@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 ); } }
/** * Sets the MultiRangedRaster with data from source. * * The number of ranges must be equal. * * @param x * left boundary * @param y * upper boundary * @param source * data to copy */ public void setSubset( double x, double y, MultiRangedRaster source ) { // checkBounds(x, y, source.getColumns(), source.getRows()); if ( source.getNumberOfRanges() != getNumberOfRanges() ) { throw new IndexOutOfBoundsException(); } for ( int i = 0; i < getNumberOfRanges(); i++ ) { SimpleRaster raster = multiRange.get( i ).getAsSimpleRaster(); raster.setSubRaster( x, y, source.getRange( i ).getAsSimpleRaster() ); multiRange.set( i, raster ); } }
@Override public void write( AbstractRaster raster, File file, RasterIOOptions options ) throws IOException { LOG.debug( "writing " + file + " with JAI" ); String ext = FileUtils.getFileExtension( file ); String format = JAIRasterIOProvider.getJAIFormat( ext ); if ( format != null ) { JAIRasterDataWriter.saveRasterDataToFile( raster.getAsSimpleRaster().getRasterData(), file.getAbsolutePath(), format ); } else { JAIRasterDataWriter.saveRasterDataToFile( raster.getAsSimpleRaster().getRasterData(), file.getAbsolutePath() ); } RasterGeoReference rasterReference = raster.getRasterReference(); WorldFileAccess.writeWorldFile( rasterReference, file ); }
@Override public Set<TileFile> getTiles( Envelope env, double metersPerPixel ) { TiledRaster raster = (TiledRaster) mrr.getRaster( metersPerPixel ); TileContainer container = raster.getTileContainer(); List<AbstractRaster> tiles = container.getTiles( env ); Set<TileFile> result = new HashSet<TileFile>(); int level = -1; for ( Double res : mrr.getResolutions() ) { if ( metersPerPixel <= res ) { level++; } else { break; } } // make sure it will get to level 0 level = Math.max( 0, level ); for ( AbstractRaster r : tiles ) { if ( r != null ) { int id = r.hashCode(); result.add( new MyTile( id, level, r.getAsSimpleRaster() ) ); } } return result; }
@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 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() ); }
@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 ); } } }
/** * Performs contrast enhancement on all bands of a raster and returns the modified raster. * * @param raster * initial raster * @param contrastEnhancement * @return the enhanced raster */ private AbstractRaster performContrastEnhancement( AbstractRaster raster, ContrastEnhancement contrastEnhancement ) { if ( contrastEnhancement == null ) return raster; LOG.trace( "Enhancing contrast for overall raster..." ); RasterData data = raster.getAsSimpleRaster().getRasterData(), newData = data; RasterDataUtility rasutil = new RasterDataUtility( raster ); rasutil.setContrastEnhancement( contrastEnhancement ); rasutil.precomputeContrastEnhancements( -1, contrastEnhancement ); for ( int band = 0; band < data.getBands(); band++ ) newData = setEnhancedChannelData( newData, rasutil, band, band, contrastEnhancement ); AbstractRaster newRaster = new SimpleRaster( newData, raster.getEnvelope(), raster.getRasterReference(), null ); return newRaster; }
private void setSubsetWithAlphaHack( SimpleRaster target, AbstractRaster source ) { if ( target != null && source != null ) { // rb: todo the intersection of two envelopes should be an envelope, but the cast will be wrong. Envelope tEnv = target.getEnvelope(); Envelope sEnv = source.getEnvelope(); if ( tEnv != null && sEnv != null ) { Geometry geom = tEnv.getIntersection( sEnv ); if ( geom != null ) { Envelope intersectEnv = geom.getEnvelope(); if ( intersectEnv != null ) { RasterRect rect = target.getRasterReference().convertEnvelopeToRasterCRS( intersectEnv ); SimpleRaster src = source.getSubRaster( intersectEnv ).getAsSimpleRaster(); PixelInterleavedRasterData targetData = (PixelInterleavedRasterData) target.getRasterData(); setSubset( targetData, rect.x, rect.y, rect.width, rect.height, src.getRasterData() ); } } } } else { LOG.debug( "Ignoring rasters because of null reference." ); } }
@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 ); }