@Override public MultiRangedRaster getSubRaster( Envelope env, BandType[] bands, OriginLocation targetLocation ) { if ( getEnvelope().equals( env ) && ( bands == null || Arrays.equals( bands, getRasterDataInfo().bandInfo ) ) ) { return this; } checkBounds( env ); MultiRangedRaster result = new MultiRangedRaster(); for ( AbstractRaster raster : multiRange ) { result.addRaster( raster.getSubRaster( env, bands, targetLocation ) ); } return result; }
@Override public MultiRangedRaster getSubRaster( double x, double y, double x2, double y2 ) { // what about the precision model? Formerly: getRasterReference().getDelta() was used Envelope env = getGeometryFactory().createEnvelope( new double[] { x, y }, new double[] { x2, y2 }, null ); return getSubRaster( env ); }
/** * Returns a new MultiRangedRaster with selected indices. * * @param indices * selected ranges * @return new MultiRangeRaster */ public MultiRangedRaster getRanges( int... indices ) { MultiRangedRaster result = new MultiRangedRaster(); for ( int index : indices ) { result.addRaster( multiRange.get( index ) ); } return result; }
/** * Adds an AbstractRaster to the MultiRangedRaster * * @param raster */ public void addRaster( AbstractRaster raster ) { extendEnvelope( raster.getEnvelope() ); extendRasterReference( raster.getRasterReference() ); multiRange.add( raster ); }
/** * 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 ); } }
/** * 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 MultiRangedRaster copy() { MultiRangedRaster result = new MultiRangedRaster(); for ( AbstractRaster r : multiRange ) { result.addRaster( r.copy() ); } return result; }
/** * Sets the MultiRangedRaster with data from source. * * The number of ranges and the number of bands in source must be equal. * * @param x * left boundary * @param y * upper boundary * @param source * data to copy */ @Override public void setSubRaster( double x, double y, AbstractRaster source ) { // checkBounds(x, y, source.getColumns(), source.getRows()); SimpleRaster src = source.getAsSimpleRaster(); if ( src.getBands() != getNumberOfRanges() ) { throw new IndexOutOfBoundsException(); } for ( int i = 0; i < getNumberOfRanges(); i++ ) { SimpleRaster raster = multiRange.get( i ).getAsSimpleRaster(); raster.setSubRaster( x, y, src.getBand( i ).getAsSimpleRaster() ); multiRange.set( i, raster ); } }