/* * 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.v.contoursextractor; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_AUTHORCONTACTS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_AUTHORNAMES; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_DOCUMENTATION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_KEYWORDS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_LABEL; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_LICENSE; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_NAME; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_STATUS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_IN_COVERAGE_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_OUT_GEODATA_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_P_INTERVAL_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_P_MAX_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOUREXTRACTOR_P_MIN_DESCRIPTION; import java.awt.geom.AffineTransform; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.media.jai.JAI; import javax.media.jai.ParameterBlockJAI; import javax.media.jai.RenderedOp; 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.Status; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.feature.DefaultFeatureCollection; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.jaitools.media.jai.contour.ContourDescriptor; import org.jgrasstools.gears.libs.exceptions.ModelsIllegalargumentException; import org.jgrasstools.gears.libs.modules.JGTModel; import org.jgrasstools.gears.libs.monitor.IJGTProgressMonitor; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.metadata.spatial.PixelOrientation; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.util.AffineTransformation; @Description(OMSCONTOUREXTRACTOR_DESCRIPTION) @Documentation(OMSCONTOUREXTRACTOR_DOCUMENTATION) @Author(name = OMSCONTOUREXTRACTOR_AUTHORNAMES, contact = OMSCONTOUREXTRACTOR_AUTHORCONTACTS) @Keywords(OMSCONTOUREXTRACTOR_KEYWORDS) @Label(OMSCONTOUREXTRACTOR_LABEL) @Name(OMSCONTOUREXTRACTOR_NAME) @Status(OMSCONTOUREXTRACTOR_STATUS) @License(OMSCONTOUREXTRACTOR_LICENSE) public class OmsContourExtractor extends JGTModel { @Description(OMSCONTOUREXTRACTOR_IN_COVERAGE_DESCRIPTION) @In public GridCoverage2D inCoverage; @Description(OMSCONTOUREXTRACTOR_P_MIN_DESCRIPTION) @In public Double pMin; @Description(OMSCONTOUREXTRACTOR_P_MAX_DESCRIPTION) @In public Double pMax; @Description(OMSCONTOUREXTRACTOR_P_INTERVAL_DESCRIPTION) @In public Double pInterval; @Description(OMSCONTOUREXTRACTOR_OUT_GEODATA_DESCRIPTION) @Out public SimpleFeatureCollection outGeodata = null; @SuppressWarnings("unchecked") @Execute public void process() throws Exception { if (!concatOr(outGeodata == null, doReset)) { return; } checkNull(inCoverage, pMin, pMax, pInterval); if (pMin > pMax) { throw new ModelsIllegalargumentException("Min has to be bigger than Max.", this, pm); } final AffineTransform mt2D = (AffineTransform) inCoverage.getGridGeometry().getGridToCRS2D(PixelOrientation.CENTER); List<Double> contourIntervals = new ArrayList<Double>(); pm.message("Adding levels:"); for( double level = pMin; level <= pMax; level += pInterval ) { contourIntervals.add(level); pm.message("-> " + level); } pm.beginTask("Extracting contours...", IJGTProgressMonitor.UNKNOWN); ParameterBlockJAI pb = new ParameterBlockJAI("Contour"); pb.setSource("source0", inCoverage.getRenderedImage()); pb.setParameter("levels", contourIntervals); RenderedOp dest = JAI.create("Contour", pb); Collection<LineString> contours = (Collection<LineString>) dest.getProperty(ContourDescriptor.CONTOUR_PROPERTY_NAME); pm.done(); outGeodata = new DefaultFeatureCollection(); SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder(); b.setName("contours"); b.setCRS(inCoverage.getCoordinateReferenceSystem()); b.add("the_geom", LineString.class); b.add("elevation", Double.class); SimpleFeatureType type = b.buildFeatureType(); int id = 0; final AffineTransformation jtsTransformation = new AffineTransformation(mt2D.getScaleX(), mt2D.getShearX(), mt2D.getTranslateX(), mt2D.getShearY(), mt2D.getScaleY(), mt2D.getTranslateY()); for( LineString lineString : contours ) { Object userData = lineString.getUserData(); double elev = -1.0; if (userData instanceof Double) { elev = (Double) userData; lineString.setUserData(null); } lineString.apply(jtsTransformation); SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type); Object[] values = new Object[]{lineString, elev}; builder.addAll(values); SimpleFeature feature = builder.buildFeature(type.getTypeName() + "." + id); id++; ((DefaultFeatureCollection) outGeodata).add(feature); } } }