/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014-2015, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.process.raster; import java.awt.geom.AffineTransform; import javax.media.jai.Interpolation; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.processing.CoverageProcessor; import org.geotools.process.ProcessException; import org.geotools.process.factory.DescribeParameter; import org.geotools.process.factory.DescribeProcess; import org.geotools.process.factory.DescribeResult; import org.opengis.parameter.ParameterValueGroup; /** * This process computes an Affine transform on the input Coverage. The transformation will set background values in the areas which does not * represent valid data. * * @author Nicola Lagomarsini - GeoSolutions S.A.S. */ @DescribeProcess(title = "Transformed Coverage", description = "Returns the result of an Affine transformation on the input raster.") public class AffineProcess implements RasterProcess { private static final CoverageProcessor PROCESSOR = CoverageProcessor.getInstance(); @DescribeResult(name = "result", description = "Raster transformed by an Affine transformation") public GridCoverage2D execute( @DescribeParameter(name = "coverage", description = "Input raster", min = 1) GridCoverage2D coverage, @DescribeParameter(name = "scalex", description = "Scale parameter for the X direction", min = 0) Double scaleX, @DescribeParameter(name = "scaley", description = "Scale parameter for the Y direction", min = 0) Double scaleY, @DescribeParameter(name = "shearx", description = "Shear parameter for the X direction", min = 0) Double shearX, @DescribeParameter(name = "sheary", description = "Shear parameter for the Y direction", min = 0) Double shearY, @DescribeParameter(name = "translatex", description = "Offset parameter for the X direction", min = 0) Double translateX, @DescribeParameter(name = "translatey", description = "Offset parameter for the Y direction", min = 0) Double translateY, @DescribeParameter(name = "nodata", description = "Output coverage nodata values", min = 0) double[] nodata, @DescribeParameter(name = "interpolation", description = "Interpolation function to use. Values are NEAREST, BILINEAR, BICUBIC2, BICUBIC", min = 0) Interpolation interp) throws ProcessException { // // // // Creation of the Affine transformation // // // double xScale = scaleX != null ? scaleX : 1; double yScale = scaleY != null ? scaleY : 1; double xShear = shearX != null ? shearX : 0; double yShear = shearY != null ? shearY : 0; double xTrans = translateX != null ? translateX : 0; double yTrans = translateY != null ? translateY : 0; AffineTransform transform = new AffineTransform(xScale, yShear, xShear, yScale, xTrans, yTrans); // // // // Selection of the Operation parameters // // // final ParameterValueGroup params = PROCESSOR.getOperation("Affine").getParameters(); // Setting of the Source Coverage params.parameter("Source").setValue(coverage); // Setting of the Transformation parameter params.parameter("transform").setValue(transform); // Setting of the background value to use if present if (nodata != null) { params.parameter("backgroundValues").setValue(nodata); } // If interpolation is present then it is added as a parameter if (interp != null) { params.parameter("interpolation").setValue(interp); } // // // // Execution of the Operation // // // return (GridCoverage2D) PROCESSOR.doOperation(params); } }