/*
* 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.hortonmachine.modules.hydrogeomorphology.melton;
import static java.lang.Math.sqrt;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_AUTHORCONTACTS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_AUTHORNAMES;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_KEYWORDS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_LABEL;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_LICENSE;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_NAME;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_STATUS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_fId_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_inElev_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_inFans_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSMELTONNUMBER_outMelton_DESCRIPTION;
import java.text.MessageFormat;
import java.util.List;
import oms3.annotations.Author;
import oms3.annotations.Description;
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.jgrasstools.gears.libs.exceptions.ModelsIllegalargumentException;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.jgrasstools.gears.libs.monitor.DummyProgressMonitor;
import org.jgrasstools.gears.modules.r.scanline.OmsScanLineRasterizer;
import org.jgrasstools.gears.modules.r.summary.OmsRasterSummary;
import org.jgrasstools.gears.utils.RegionMap;
import org.jgrasstools.gears.utils.coverage.CoverageUtilities;
import org.jgrasstools.gears.utils.features.FeatureUtilities;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.AttributeType;
import com.vividsolutions.jts.geom.Geometry;
@Description(OMSMELTONNUMBER_DESCRIPTION)
@Author(name = OMSMELTONNUMBER_AUTHORNAMES, contact = OMSMELTONNUMBER_AUTHORCONTACTS)
@Keywords(OMSMELTONNUMBER_KEYWORDS)
@Label(OMSMELTONNUMBER_LABEL)
@Name(OMSMELTONNUMBER_NAME)
@Status(OMSMELTONNUMBER_STATUS)
@License(OMSMELTONNUMBER_LICENSE)
public class OmsMeltonNumber extends JGTModel {
@Description(OMSMELTONNUMBER_inElev_DESCRIPTION)
@In
public GridCoverage2D inElev = null;
@Description(OMSMELTONNUMBER_inFans_DESCRIPTION)
@In
public SimpleFeatureCollection inFans = null;
@Description(OMSMELTONNUMBER_fId_DESCRIPTION)
@In
public String fId;
@Description(OMSMELTONNUMBER_outMelton_DESCRIPTION)
@Out
public String[][] outMelton = null;
@Execute
public void process() throws Exception {
checkNull(inElev, inFans);
RegionMap regionMap = CoverageUtilities.getRegionParamsFromGridCoverage(inElev);
int cols = regionMap.getCols();
int rows = regionMap.getRows();
double west = regionMap.getWest();
double east = regionMap.getEast();
double south = regionMap.getSouth();
double north = regionMap.getNorth();
AttributeType type = inFans.getSchema().getType(fId);
if (type == null) {
throw new ModelsIllegalargumentException(MessageFormat.format("The attribute {0} does not exist in the vector map.",
fId), this, pm);
}
List<SimpleFeature> fansList = FeatureUtilities.featureCollectionToList(inFans);
outMelton = new String[fansList.size()][2];
int index = 0;
pm.beginTask("Calculating Melton number for fans...", fansList.size());
for( SimpleFeature fan : fansList ) {
Object attribute = fan.getAttribute(fId);
// rasterize the fan
DefaultFeatureCollection newCollection = new DefaultFeatureCollection();
newCollection.add(fan);
OmsScanLineRasterizer rasterizer = new OmsScanLineRasterizer();
rasterizer.inVector = newCollection;
rasterizer.pCols = cols;
rasterizer.pRows = rows;
rasterizer.pNorth = north;
rasterizer.pSouth = south;
rasterizer.pEast = east;
rasterizer.pWest = west;
rasterizer.pValue = 1.0;
rasterizer.pm = new DummyProgressMonitor();
rasterizer.process();
GridCoverage2D rasterizedFan = rasterizer.outRaster;
GridCoverage2D fanElev = CoverageUtilities.coverageValuesMapper(inElev, rasterizedFan);
// extract min and max
OmsRasterSummary summary = new OmsRasterSummary();
summary.pm = new DummyProgressMonitor();
summary.inRaster = fanElev;
summary.process();
double min = summary.outMin;
double max = summary.outMax;
// get the suface of the fan
Geometry geometry = (Geometry) fan.getDefaultGeometry();
double area = geometry.getArea();
// calculate Melton
double melton = (max - min) / sqrt(area);
outMelton[index][0] = attribute.toString();
outMelton[index][1] = String.valueOf(melton);
index++;
pm.message(MessageFormat.format("id: {0} gave Melton number: {1}", attribute.toString(), melton));
pm.message("Based on max: " + max + " min: " + min + " and area: " + area);
pm.worked(1);
}
pm.done();
}
}