/** * Quick method for populating the {@link CUDABean} instance provided. * * @param bean * @param reference * @param coverage * @param geo * @param transform * @throws IOException * @throws MismatchedDimensionException * @throws TransformException */ private void populateBean( CUDABean bean, boolean reference, GridCoverage2D coverage, Geometry geo, MathTransform transform, int buffer) throws IOException, MismatchedDimensionException, TransformException { RenderedImage image = coverage.getRenderedImage(); // 0) Check if a buffer must be applied Geometry originalGeo = (Geometry) geo.clone(); if (buffer > 0) { try { if (!"EPSG:4326" .equals(CRS.lookupIdentifier(coverage.getCoordinateReferenceSystem(), false))) { geo = geo.buffer(buffer); } else { geo = geo.buffer(buffer / 111.128); } } catch (FactoryException e) { geo = geo.buffer(buffer); } } // 1) Crop the two coverages with the selected Geometry GridCoverage2D crop = CROP.execute(coverage, geo, null); transform = ProjectiveTransform.create( (AffineTransform) crop.getGridGeometry().getGridToCRS(PixelInCell.CELL_CORNER)) .inverse(); // 2) Extract the BufferedImage from each image image = crop.getRenderedImage(); Rectangle rectIMG = new Rectangle(image.getMinX(), image.getMinY(), image.getWidth(), image.getHeight()); ImageWorker w = new ImageWorker(image); BufferedImage buf = w.getBufferedImage(); if (image instanceof RenderedOp) { ((RenderedOp) image).dispose(); } // 3) Generate an array of data from each image Raster data = buf.getData(); final DataBufferByte db = (DataBufferByte) data.getDataBuffer(); byte[] byteData = db.getData(); if (reference) { // 4) Transform the Geometry to Raster space Geometry rs = JTS.transform(geo, transform); Geometry rsFilter = JTS.transform(geo.difference(originalGeo), transform); ROI roiGeo = new ROIGeometry(rs); ROI roiFilter = new ROIGeometry(rsFilter); // 5) Extract an array of data from the transformed ROI byte[] roiData = getROIData((buffer > 0 ? roiFilter : roiGeo), rectIMG); bean.setRoi(roiData); bean.setRoiObj(roiGeo); // 6) Setting the Coverage data array bean.setReferenceImage(byteData); // 7) Setting the Image dimensions bean.setHeight(rectIMG.height); bean.setWidth(rectIMG.width); bean.setMinX(rectIMG.x); bean.setMinY(rectIMG.y); } else { // 6) Setting the Coverage data array bean.setCurrentImage(byteData); } // 7) Store the Reference Covergae containing the geospatial info bean.setReferenceCoverage(coverage); }