/* * 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.raster4xyz; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_AUTHORCONTACTS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_AUTHORNAMES; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_DOCUMENTATION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_KEYWORDS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_LABEL; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_LICENSE; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_NAME; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_STATUS; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_IN_FILE_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_OUT_RASTER_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_P_CODE_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_P_RES_DESCRIPTION; import static org.jgrasstools.gears.i18n.GearsMessages.OMSXYZ2RASTER_P_SEPARATOR_DESCRIPTION; import java.awt.image.WritableRaster; import java.util.ArrayList; import java.util.List; 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 oms3.annotations.UI; import org.geotools.coverage.grid.GridCoordinates2D; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.geometry.DirectPosition2D; import org.geotools.referencing.CRS; import org.jgrasstools.gears.libs.modules.JGTConstants; import org.jgrasstools.gears.libs.modules.JGTModel; import org.jgrasstools.gears.libs.monitor.IJGTProgressMonitor; import org.jgrasstools.gears.utils.CrsUtilities; import org.jgrasstools.gears.utils.RegionMap; import org.jgrasstools.gears.utils.coverage.CoverageUtilities; import org.jgrasstools.gears.utils.files.FileUtilities; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; @Description(OMSXYZ2RASTER_DESCRIPTION) @Documentation(OMSXYZ2RASTER_DOCUMENTATION) @Author(name = OMSXYZ2RASTER_AUTHORNAMES, contact = OMSXYZ2RASTER_AUTHORCONTACTS) @Keywords(OMSXYZ2RASTER_KEYWORDS) @Label(OMSXYZ2RASTER_LABEL) @Name(OMSXYZ2RASTER_NAME) @Status(OMSXYZ2RASTER_STATUS) @License(OMSXYZ2RASTER_LICENSE) public class OmsXyz2Raster extends JGTModel { @Description(OMSXYZ2RASTER_IN_FILE_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inFile; @Description(OMSXYZ2RASTER_P_RES_DESCRIPTION) @In public Double pRes; @Description(OMSXYZ2RASTER_P_CODE_DESCRIPTION) @UI(JGTConstants.CRS_UI_HINT) @In public String pCode; @Description(OMSXYZ2RASTER_P_SEPARATOR_DESCRIPTION) @In public String pSeparator; @Description(OMSXYZ2RASTER_OUT_RASTER_DESCRIPTION) @Out public GridCoverage2D outRaster; private double res = 0.0; @SuppressWarnings("nls") @Execute public void process() throws Exception { checkNull(inFile, pRes, pCode); CoordinateReferenceSystem crs = CrsUtilities.getCrsFromEpsg(pCode, null); res = pRes; Envelope env = null; pm.beginTask("Reading triplets file...", IJGTProgressMonitor.UNKNOWN); List<String> linesList = FileUtilities.readFileToLinesList(inFile); pm.done(); List<Coordinate> coordList = new ArrayList<Coordinate>(); double n = Double.NEGATIVE_INFINITY; double s = Double.POSITIVE_INFINITY; double e = Double.NEGATIVE_INFINITY; double w = Double.POSITIVE_INFINITY; if (pSeparator == null) { pSeparator = "\\s+"; } pm.beginTask("Extracting data...", linesList.size()); for( String line : linesList ) { String[] split = line.trim().split(pSeparator); if (split.length != 3) { pm.worked(1); continue; } double x = Double.parseDouble(split[0].trim()); if (x > e) { e = x; } if (x < w) { w = x; } double y = Double.parseDouble(split[1].trim()); if (y > n) { n = y; } if (y < s) { s = y; } double z = Double.parseDouble(split[2].trim()); Coordinate c = new Coordinate(x, y, z); coordList.add(c); if (env == null) { env = new Envelope(c); } else { env.expandToInclude(c); } pm.worked(1); } pm.done(); int rows = (int) ((n - s) / res); int cols = (int) ((e - w) / res); GridGeometry2D gridGeometry = CoverageUtilities.gridGeometryFromRegionValues(n, s, e, w, rows, cols, crs); WritableRaster writableRaster = CoverageUtilities.createDoubleWritableRaster(cols, rows, null, null, JGTConstants.doubleNovalue); pm.beginTask("Create raster...", coordList.size()); DirectPosition2D world = new DirectPosition2D(); for( Coordinate coordinate : coordList ) { world.setLocation(coordinate.x, coordinate.y); GridCoordinates2D grid = gridGeometry.worldToGrid(world); writableRaster.setSample(grid.x, grid.y, 0, coordinate.z); pm.worked(1); } pm.done(); RegionMap regionMap = CoverageUtilities.gridGeometry2RegionParamsMap(gridGeometry); outRaster = CoverageUtilities.buildCoverage("fromxyz", writableRaster, regionMap, crs); } }