@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 ); }
dstEnv = baseEnvelope; } else { if ( srcRaster.getCoordinateSystem() == null ) { throw new NullPointerException( "The source raster has no coordinate system." ); dstEnv = srcRaster.getEnvelope(); dstSRS = srcRaster.getCoordinateSystem(); } else { GeometryTransformer dstTransformer = new GeometryTransformer( dstSRS ); dstEnv = dstTransformer.transform( srcRaster.getEnvelope(), srcRaster.getCoordinateSystem() ); tileSize = maxTileSize; } else { tileSize = TileGrid.calculateOptimalTileSize( srcRaster.getColumns(), srcRaster.getRows(), dstEnv, maxTileSize ); baseResolution = (float) TileGrid.calculateBaseResolution( srcRaster.getColumns(), srcRaster.getRows(), dstEnv, tileSize );
Envelope env = raster.getEnvelope(); RasterGeoReference geoRef = raster.getRasterReference(); int targetColumns = 0; int targetRows = 0; instantiate( targetColumns, targetRows, raster.getEnvelope(), raster.getRasterReference(), gridFile, raster.getRasterDataInfo() );
/** * Returns columns of the raster. * * @return width in pixel */ public int getColumns() { return getRasterReference().getSize( getEnvelope() )[0]; }
/** * Create raster levels until the last level consists of only one tile. * * @throws UnknownCRSException * @throws IllegalArgumentException * @throws IOException */ private void createRasterLevels( AbstractRaster srcRaster ) throws IllegalArgumentException, UnknownCRSException, IOException { TiledRaster dstRaster; AbstractRaster tmpRaster = srcRaster; int i = 1; do { // calculate until the last level consist of one tile dstRaster = createRasterLevel( tmpRaster, i ); tmpRaster = dstRaster; i++; } while ( tmpRaster.getColumns() - 1 > tileSize || tmpRaster.getRows() - 1 > tileSize ); }
/** * Returns a subset of the raster. * * @param x * left boundary * @param y * upper boundary * @param x2 * right boundary * @param y2 * lower boundary * @return subset of the raster */ public AbstractRaster 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 ); }
@Override public RasterDataInfo getRasterDataInfo() { SimpleRaster raster = multiRange.get( 0 ).getAsSimpleRaster(); if ( raster != null ) { return raster.getRasterDataInfo(); } return null; }
private TextureTile getTextureTile( double minX, double minY, double maxX, double maxY ) { if ( raster.getRasterDataInfo().getDataType() != DataType.BYTE ) { LOG.warn( "Raster type is not byte, textures can currently only be bytes." ); return null; AbstractRaster subset = raster.getSubRaster( subsetEnv, null, OriginLocation.OUTER ); SimpleRaster simpleRaster = subset.getAsSimpleRaster(); if ( LOG.isDebugEnabled() ) { LOG.debug( "#getTextureTile(): as simple raster: " + ( System.currentTimeMillis() - begin2 ) + ", env: " Envelope envelope = raster.getRasterReference().getEnvelope( data.second, subset.getCoordinateSystem() ); double dataMinX = envelope.getMin().get0(); double dataMinY = envelope.getMin().get1();
/** * 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; }
newOpts.copyOf( options ); AbstractRaster raster = RasterFactory.loadRasterFromFile( filename, newOpts ); ICRS rasterCRS = raster.getCoordinateSystem(); if ( defaultCRS == null ) { defaultCRS = rasterCRS; rasterEnvelope = raster.getEnvelope(); if ( defaultCRS != null && raster.getCoordinateSystem() == null ) { raster.setCoordinateSystem( defaultCRS ); resultEnvelope = raster.getEnvelope(); } else { resultEnvelope = resultEnvelope.merge( raster.getEnvelope() ); rasterReference = raster.getRasterReference(); } else { rasterReference = RasterGeoReference.merger( rasterReference, raster.getRasterReference() );
return result; SimpleRaster originalSimpleRaster = tiles.get( 0 ).getAsSimpleRaster(); SimpleRaster result = originalSimpleRaster.createCompatibleSimpleRaster( getRasterReference(), env ); LOG.debug( "Tiled to simple -> result(w,h): " + result.getColumns() + ", " + result.getRows() ); Geometry intersec = r.getEnvelope().getIntersection( env ); if ( intersec != null ) { if ( intersec instanceof Point ) { if ( LOG.isDebugEnabled() ) { LOG.debug( "Adding raster intersection:{}, rasterInfo:{}, rasterref: {} ", new Object[] { subsetEnv, r.getRasterDataInfo(), r.getRasterReference() } );
if ( tileEnvelope.intersects( raster.getEnvelope() ) ) { SimpleRaster subRaster = raster.getSubRaster( tileEnvelope ).getAsSimpleRaster(); if ( tiles != null && !tiles.isEmpty() ) { for ( AbstractRaster ar : tiles ) { if ( ar.isSimpleRaster() ) { ( (SimpleRaster) ar ).dispose();
/** * Interpolates the given raster to retrieve a raster with the given width and height. * * @param sourceRaster * the raster to get an interpolation version from * @param dstWidth * the width (columns) of the resulting raster * @param dstHeight * the height (rows) of the resulting raster * @return the interpolated raster */ public AbstractRaster interPolate( AbstractRaster sourceRaster, int dstWidth, int dstHeight ) { SimpleRaster simpleSourceRaster = sourceRaster.getAsSimpleRaster(); RasterData srcData = simpleSourceRaster.getReadOnlyRasterData(); RasterGeoReference srcREnv = simpleSourceRaster.getRasterReference(); // interpolation is needed. Interpolation interpolation = InterpolationFactory.getInterpolation( interpolationType, srcData ); RasterRect rr = new RasterRect( 0, 0, dstWidth, dstHeight ); RasterData dstData = srcData.createCompatibleWritableRasterData( rr, null ); RasterGeoReference dstREnv = RasterGeoReference.create( sourceRaster.getRasterReference().getOriginLocation(), sourceRaster.getEnvelope(), dstWidth, dstHeight ); // use warp to calculate the correct sample positions in the source raster. // the warp is a cubic polynomial function created of 100 points in the dstEnvelope. This function will map // points from the source crs to the target crs very accurate. WarpPolynomial warp = createWarp( dstWidth, dstHeight, srcREnv, dstREnv ); warpTransform( warp, interpolation, dstData ); return new SimpleRaster( dstData, sourceRaster.getEnvelope(), dstREnv, (ResourceMetadata) sourceRaster.getMetadata() ); }
/** * Adds a new tile to the container. * * @param raster * new tile */ public synchronized void addTile( AbstractRaster raster ) { if ( raster != null ) { if ( this.envelope == null ) { this.envelope = raster.getEnvelope(); } else { this.envelope = this.envelope.merge( raster.getEnvelope() ); } if ( this.rasterReference == null ) { this.rasterReference = raster.getRasterReference(); } else { this.rasterReference = RasterGeoReference.merger( this.rasterReference, raster.getRasterReference() ); } if ( this.rdi == null ) { this.rdi = raster.getRasterDataInfo(); } if ( this.resolutionInfo == null ) { this.resolutionInfo = raster.getResolutionInfo(); } tiles.add( raster ); } }
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." ); } }
options.setNoData( noDatas ); AbstractRaster filteredRaster = reader.load( tmpGridFile, options ); if ( !raster.isSimpleRaster() ) { List<AbstractRaster> tiles = ( (TiledRaster) raster ).getTileContainer().getTiles( raster.getEnvelope() ); + outputType ); for ( AbstractRaster r : tiles ) { if ( r != null && r.isSimpleRaster() ) { ByteBufferRasterData data = (ByteBufferRasterData) ( (SimpleRaster) r ).getRasterData(); RasterReader origReader = data.getReader(); if ( origReader != null ) { Envelope env = r.getRasterReference().relocateEnvelope( OriginLocation.OUTER, r.getEnvelope() ); AbstractRaster subRaster = filteredRaster.getSubRaster( env ); String id = origReader.getDataLocationId(); File outputFile = new File( outputDir, id + "." + outputType ); RasterReader origReader = data.getReader(); if ( origReader != null ) { Envelope env = raster.getEnvelope(); AbstractRaster subRaster = filteredRaster.getSubRaster( env ); String id = origReader.getDataLocationId(); File outputFile = new File( outputDir, id + "." + outputType );
/** * 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 AbstractRaster apply( RangeSet sourceRangeSet, RangeSet targetRangeset ) { AbstractRaster result = raster(); if ( rangeSetsAreApplicable( sourceRangeSet, targetRangeset ) ) { List<AxisSubset> requestedAxis = targetRangeset.getAxisDescriptions(); if ( requestedAxis != null && !requestedAxis.isEmpty() ) { // create a copy so that the original rangeset will not be modified. List<AxisSubset> copyRA = new ArrayList<AxisSubset>( requestedAxis ); Map<BandType, AxisSubset> referencedBands = getReferencedBands( copyRA ); BandType[] bands = null; if ( referencedBands != null ) { bands = referencedBands.keySet().toArray( new BandType[referencedBands.keySet().size()] ); // filter the bands. result = raster().getSubRaster( raster().getEnvelope(), bands ); boolean applyData = false; for ( AxisSubset ass : referencedBands.values() ) { applyData = ass.hasAxisConstraints(); if ( applyData ) { break; } } if ( applyData ) { result = applyDataFilter( result, requestedAxis, referencedBands ); } } } } return result; }
/** * Return the bounding geometry of a raster as a polygon (but is actually a rectangle). * * @param raster * @return bounding polygon */ public static Polygon createPolygonGeometry( AbstractRaster raster ) { ICRS crs = raster.getCoordinateSystem(); GeometryFactory fac = new GeometryFactory(); Envelope env = raster.getEnvelope(); env = raster.getRasterReference().relocateEnvelope( OriginLocation.OUTER, env ); Point pmin = env.getMin(); Point pmax = env.getMax(); Point p1 = fac.createPoint( null, pmin.get0(), pmin.get1(), crs ); Point p3 = fac.createPoint( null, pmax.get0(), pmax.get1(), crs ); Point p2 = fac.createPoint( null, p1.get0(), p3.get1(), crs ); Point p4 = fac.createPoint( null, p3.get0(), p1.get1(), crs ); Point p5 = fac.createPoint( null, p1.get0(), p1.get1(), crs ); Point[] points = { p1, p2, p3, p4, p5 }; // (asList(points)); LinearRing ring = fac.createLinearRing( null, crs, new PointsList( asList( points ) ) ); Polygon poly = fac.createPolygon( null, crs, ring, null ); return poly; }
/** * Adds a new tile to the container. * * @param raster * new tile */ public void addTile( AbstractRaster raster ) { if ( raster != null ) { if ( this.rdi == null ) { this.rdi = raster.getRasterDataInfo(); } if ( this.resolutionInfo == null ) { this.resolutionInfo = raster.getResolutionInfo(); } index.insert( createEnvelope( raster.getEnvelope() ), raster ); } }