Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java @ 5645:696d710470f5
flys/issue1077: Show loads as step line, therefore transform data in
SedimentLoadFacet to stretch as in the measurement stations bounds.
Deal with this new kind of data in the Generator.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Wed, 10 Apr 2013 09:35:07 +0200 |
parents | 19772b414d46 |
children | ddb2a4e982b8 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java Wed Apr 10 09:32:47 2013 +0200 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java Wed Apr 10 09:35:07 2013 +0200 @@ -2,20 +2,30 @@ import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + import de.intevation.artifactdatabase.state.Facet; import de.intevation.artifacts.Artifact; import de.intevation.artifacts.CallContext; import de.intevation.flys.artifacts.FLYSArtifact; import de.intevation.flys.artifacts.model.CalculationResult; import de.intevation.flys.artifacts.model.DataFacet; +import de.intevation.flys.model.MeasurementStation; +import de.intevation.flys.artifacts.model.FacetTypes; import de.intevation.flys.artifacts.states.DefaultState.ComputeType; +import de.intevation.flys.utils.FLYSUtils; + public class SedimentLoadFacet extends DataFacet { + /** Very own logger. */ private static Logger logger = Logger.getLogger(SedimentLoadFacet.class); + private static double EPSILON = 1e-5; + public SedimentLoadFacet() { } @@ -35,9 +45,73 @@ Object[] data = (SedimentLoadResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS - return data != null && data.length > index ? data[index] : null; + List<MeasurementStation> allStations = FLYSUtils.getRiver(flys).getMeasurementStations(); + SedimentLoadResult result = data != null && data.length > index ? (SedimentLoadResult)data[index] : null; + if (result == null) { + return null; + } + + // Filter stations according to type. + List<MeasurementStation> stations = new ArrayList<MeasurementStation>(); + for (MeasurementStation station: allStations) { + if (station.getRange() == null || station.getMeasurementType() == null) { + continue; + } + if (FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Geschiebe")) + stations.add(station); + else if (!FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Schwebstoff")) + stations.add(station); + } + + // Access data according to type. + double[][] sd = null; + if (getName().equals(FacetTypes.SEDIMENT_LOAD_SAND)) + sd = result.getSandData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_COARSE)) + sd = result.getCoarseData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_FINEMIDDLE)) + sd = result.getFineMiddleData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND)) + sd = result.getSuspSandData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND_BED)) + sd = result.getSuspSandBedData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SEDIMENT)) + sd = result.getSuspSedimentData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL_LOAD)) + sd = result.getTotalLoadData(); + else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL)) + sd = result.getTotalData(); + + double[] km = sd[0]; + double[] load = sd[1]; + + double[][] values = new double[2][]; + values[0] = new double[km.length*2]; + values[1] = new double[km.length*2]; + + // Find station via its station (km). + // TODO what to do with gaps in measurement stations. + for (int i = 0; i < km.length; i++) { + boolean matchFound = false; + for (MeasurementStation station: stations) { + if (Math.abs(station.getStation() - km[i]) < EPSILON) { + values[0][i*2] = station.getRange().getA().doubleValue(); + values[1][i*2] = load[i]; + values[0][i*2+1] = station.getRange().getB().doubleValue(); + values[1][i*2+1] = load[i]; + matchFound = true; + } + } + if (!matchFound) { + values[0][i*2] = km[i]; + values[1][i*2] = load[i]; + logger.debug("No measurement station for km " + km[i]); + } + } + return values; } + /** Copy deeply. */ @Override public Facet deepCopy() {