/* * 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.modules; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.AUTHORCONTACTS; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.AUTHORNAMES; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.KEYWORDS; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.LABEL; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.LICENSE; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.NAME; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.STATUS; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inConfluenceId2DischargeMap_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inDischarge_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inDownstreamLevel_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inLateralId2DischargeMap_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inRiver_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inSectionPoints_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.inSections_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.outputLevelFile_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.outputDischargeFile_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.pDeltaTMillis_DESCRIPTION; import static org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo.pDeltaTMillis_UNIT; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; 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.Status; import oms3.annotations.UI; import oms3.annotations.Unit; import oms3.io.CSTable; import oms3.io.DataIO; import oms3.io.TableIterator; import org.jgrasstools.gears.io.timeseries.OmsTimeSeriesReader; import org.jgrasstools.gears.libs.modules.JGTConstants; import org.jgrasstools.gears.libs.modules.JGTModel; import org.jgrasstools.hortonmachine.modules.hydrogeomorphology.saintgeo.OmsSaintGeo; import org.joda.time.DateTime; @Description(DESCRIPTION) @Author(name = AUTHORNAMES, contact = AUTHORCONTACTS) @Keywords(KEYWORDS) @Label(LABEL) @Name(NAME) @Status(STATUS) @License(LICENSE) public class SaintGeo extends JGTModel { @Description(inRiver_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inRiverPoints = null; @Description(inSections_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inSections = null; @Description(inSectionPoints_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inSectionPoints = null; @Description(inDischarge_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inDischarge; @Description(inDownstreamLevel_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inDownstreamLevel; @Description(inLateralId2DischargeMap_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inLateralId2Discharge; @Description(inConfluenceId2DischargeMap_DESCRIPTION) @UI(JGTConstants.FILEIN_UI_HINT) @In public String inConfluenceId2Discharge; @Description(pDeltaTMillis_DESCRIPTION) @Unit(pDeltaTMillis_UNIT) @In public long pDeltaTMillis = 5000; @Description(outputLevelFile_DESCRIPTION) @UI(JGTConstants.FILEOUT_UI_HINT) @In public String outputLevelFile; @Description(outputDischargeFile_DESCRIPTION) @UI(JGTConstants.FILEOUT_UI_HINT) @In public String outputDischargeFile; @Execute public void process() throws Exception { checkNull(inRiverPoints, inSectionPoints, inSections, inDischarge); OmsSaintGeo saintGeo = new OmsSaintGeo(); saintGeo.inRiverPoints = getVector(inRiverPoints); saintGeo.inSectionPoints = getVector(inSectionPoints); saintGeo.inSections = getVector(inSections); double[] discharge = readToArray(inDischarge); saintGeo.inDischarge = discharge; if (inDownstreamLevel != null) { double[] level = readToArray(inDownstreamLevel); saintGeo.inDownstreamLevel = level; } if (inLateralId2Discharge!=null) { HashMap<Integer, double[]> lateralData = readIdData(inLateralId2Discharge); saintGeo.inLateralId2DischargeMap = lateralData; } if (inConfluenceId2Discharge!=null) { HashMap<Integer, double[]> confluenceData = readIdData(inConfluenceId2Discharge); saintGeo.inConfluenceId2DischargeMap = confluenceData; } saintGeo.pDeltaTMillis = pDeltaTMillis; saintGeo.outputLevelFile = outputLevelFile; saintGeo.outputDischargeFile = outputDischargeFile; saintGeo.process(); } private HashMap<Integer, double[]> readIdData( String path ) throws Exception { CSTable table = DataIO.table(new File(path), null); HashMap<Integer, List<Double>> dataMap = new HashMap<>(); int columnCount = table.getColumnCount(); int[] ids = new int[columnCount - 1]; // minus type and timestamp for( int i = 2; i <= columnCount; i++ ) { Map<String, String> columnInfo = table.getColumnInfo(i); String idStr = columnInfo.get("id"); int id = Integer.parseInt(idStr); ids[i - 2] = id; } TableIterator<String[]> rowsIterator = (TableIterator<String[]>) table.rows().iterator(); while( rowsIterator.hasNext() ) { String[] row = rowsIterator.next(); for( int i = 2; i < row.length; i++ ) { List<Double> dataList = dataMap.get(ids[i - 2]); if (dataList == null) { dataList = new ArrayList<>(); dataMap.put(ids[i - 2], dataList); } double value = -1; if (row[i] == null || row[i].length() == 0) { value = JGTConstants.doubleNovalue; } else { String valueStr = row[i]; value = Double.parseDouble(valueStr); } dataList.add(value); } } HashMap<Integer, double[]> outDataMap = new HashMap<>(); for( Entry<Integer, List<Double>> entry : dataMap.entrySet() ) { Integer id = entry.getKey(); List<Double> valueList = entry.getValue(); double[] values = new double[valueList.size()]; for( int i = 0; i < values.length; i++ ) { values[i] = valueList.get(i); } outDataMap.put(id, values); } return outDataMap; } private double[] readToArray( String file ) throws IOException { OmsTimeSeriesReader reader = new OmsTimeSeriesReader(); reader.file = file; reader.fileNovalue = "-9999"; reader.read(); HashMap<DateTime, double[]> outData = reader.outData; double[] data = new double[outData.size()]; int counter = 0; for( double[] values : outData.values() ) { data[counter++] = values[0]; } return data; } public static void main( String[] args ) throws Exception { String base = "D:/Dropbox/hydrologis/lavori/2015_phd_bz/gSoC2015/data/data_adige_test/"; String inSec = base + "sections_adige_75_rev.shp"; String inSecP = base + "sectionpoints_adige_75_rev.shp"; String inRiv = base + "riverpoints_adige_75_rev.shp"; String inDischarge = base + "head_discharge.csv"; String inLevel = base + "downstream_waterlevel.csv"; String inLateral = base + "q_lateral_offtakes.csv"; String outLevelFile = base + "saintgeo_level_out_offtakes.csv"; String outDischargeFile = base + "saintgeo_discharge_out_offtakes.csv"; SaintGeo sg = new SaintGeo(); sg.inRiverPoints = inRiv; sg.inSectionPoints = inSecP; sg.inSections = inSec; sg.inDischarge = inDischarge; sg.inDownstreamLevel = inLevel; sg.inLateralId2Discharge = inLateral; sg.pDeltaTMillis = 5000; sg.outputLevelFile = outLevelFile; sg.outputDischargeFile = outDischargeFile; sg.process(); } }