/*
* This file is part of JGrasstools (http://www.jgrasstools.org)
* (C) HydroloGIS - www.hydrologis.com
*
* JGrasstools is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jgrasstools.gears.modules.r.aoi;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSHYDRO_LICENSE;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.GridCoverage2DReader;
import org.geotools.coverage.processing.Operations;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.jgrasstools.gears.libs.modules.JGTProcessingRegion;
import org.jgrasstools.gears.utils.RegionMap;
import org.jgrasstools.gears.utils.coverage.CoverageUtilities;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import oms3.annotations.Author;
import oms3.annotations.Description;
import oms3.annotations.Documentation;
import oms3.annotations.Execute;
import oms3.annotations.In;
import oms3.annotations.Keywords;
import oms3.annotations.Label;
import oms3.annotations.License;
import oms3.annotations.Name;
import oms3.annotations.Out;
import oms3.annotations.Range;
import oms3.annotations.Status;
@Description("Module that extracts a gridcoverage for a given area of interest, resampling it if necessary.")
@Label("Area of interest")
@Name("Area of interest")
@Documentation("")
@Author(name = "Andrea Antonello, Falko Braeutigam", contact = "www.hydrologis.com")
@Keywords("raster, crop")
@Status(Status.EXPERIMENTAL)
@License(OMSHYDRO_LICENSE)
public class OmsAreaOfInterestGridCoverage extends JGTModel {
@In
@Description("The source raster data.")
public GridCoverage2DReader inCoverageReader;
@In
@Description("The requested are aof interest bounds.")
public ReferencedEnvelope aoi;
@In
@Description("The requested resampling resolution factor.")
@Range(min = 1, max = 100)
public int resolutionFactor = 1;
@Description("The resampled and cropped gridcoverage.")
@Out
public GridCoverage2D outCoverage;
@Execute
public void process() throws Exception {
CoordinateReferenceSystem crs = inCoverageReader.getCoordinateReferenceSystem();
aoi = aoi.transform( crs, true );
GeneralEnvelope originalEnvelope = inCoverageReader.getOriginalEnvelope();
GridEnvelope2D overviewGridEnvelope = (GridEnvelope2D) inCoverageReader.getOriginalGridRange();
double[] llCorner = originalEnvelope.getLowerCorner().getCoordinate();
double[] urCorner = originalEnvelope.getUpperCorner().getCoordinate();
JGTProcessingRegion originalRegion = new JGTProcessingRegion(llCorner[0], urCorner[0], llCorner[1], urCorner[1],
overviewGridEnvelope.height, overviewGridEnvelope.width);
RegionMap originalRegionMap = CoverageUtilities.makeRegionParamsMap(urCorner[1], llCorner[1], llCorner[0], urCorner[0],
originalRegion.getWEResolution(), originalRegion.getNSResolution(), overviewGridEnvelope.width,
overviewGridEnvelope.height);
RegionMap subRegion = originalRegionMap.toSubRegion(aoi.getMaxY(), aoi.getMinY(), aoi.getMinX(), aoi.getMaxX());
double xres = subRegion.getXres();
double yres = subRegion.getYres();
if (resolutionFactor > 1) {
xres = xres * resolutionFactor;
yres = yres * resolutionFactor;
}
outCoverage = CoverageUtilities.getGridCoverage((AbstractGridCoverage2DReader) inCoverageReader, subRegion.getNorth(),
subRegion.getSouth(), subRegion.getEast(), subRegion.getWest(), xres, yres,
crs);
ReferencedEnvelope outenvelope = new ReferencedEnvelope(subRegion.getWest(), subRegion.getEast(), subRegion.getSouth(),
subRegion.getNorth(), crs);
outCoverage = (GridCoverage2D) Operations.DEFAULT.crop(outCoverage, outenvelope);
}
}