diff flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java @ 3169:b6da650b0718

FixA: Added longitudinal section chart. flys-artifacts/trunk@4782 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Mon, 25 Jun 2012 15:53:34 +0000
parents
children 70966b52c073
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java	Mon Jun 25 15:53:34 2012 +0000
@@ -0,0 +1,344 @@
+package de.intevation.flys.exports.fixings;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+
+import de.intevation.artifactdatabase.state.ArtifactAndFacet;
+
+import de.intevation.flys.artifacts.model.FacetTypes;
+
+import de.intevation.flys.artifacts.model.fixings.DateRange;
+import de.intevation.flys.artifacts.model.fixings.FixFunction;
+import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet;
+import de.intevation.flys.artifacts.model.fixings.QW;
+import de.intevation.flys.artifacts.model.fixings.QWD;
+import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod;
+
+import de.intevation.flys.exports.ChartGenerator;
+import de.intevation.flys.exports.XYChartGenerator;
+
+import de.intevation.flys.jfree.Function2DAdapter;
+import de.intevation.flys.jfree.StyledXYSeries;
+import de.intevation.flys.jfree.StyledAreaSeriesCollection;
+
+import de.intevation.flys.utils.KMIndex;
+
+import org.apache.log4j.Logger;
+
+import org.jfree.data.general.DatasetUtilities;
+
+import org.jfree.data.xy.XYSeries;
+import org.jfree.chart.plot.Marker;
+import org.jfree.chart.plot.ValueMarker;
+import org.jfree.data.xy.XYSeriesCollection;
+
+import org.w3c.dom.Document;
+
+public class FixLongitudinalSectionGenerator
+extends XYChartGenerator
+implements FacetTypes
+{
+    private static Logger logger =
+        Logger.getLogger(FixLongitudinalSectionGenerator.class);
+
+    public static final String I18N_CHART_TITLE =
+        "chart.fixings.longitudinalsection.title";
+
+    public static final String I18N_CHART_SUBTITLE =
+        "chart.fixings.longitudinalsection.subtitle";
+
+    public static final String I18N_XAXIS_LABEL =
+        "chart.fixings.longitudinalsection.xaxis.label";
+
+    public static final String I18N_YAXIS_LABEL =
+        "chart.fixings.longitudinalsection.yaxis.label";
+
+    public static final String I18N_CHART_TITLE_DEFAULT  =
+        "Fixierungsanalyse";
+
+    public static final String I18N_XAXIS_LABEL_DEFAULT  =
+        "[m]";
+
+    public static final String I18N_YAXIS_LABEL_DEFAULT  =
+        "delta W [cm]";
+
+    public static enum YAXIS {
+        dW(0);
+        public int idx;
+        private YAXIS(int c) {
+            idx = c;
+        }
+    }
+
+    @Override
+    public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
+        String name = aaf.getFacetName();
+        logger.debug("doOut: " + name);
+
+        if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) {
+            doSectorAverageDeviationOut(aaf, doc, visible);
+        }
+        else if (name.contains(FIX_SECTOR_AVERAGE_LS)) {
+            doSectorAverageOut(aaf, doc, visible);
+        }
+        else if (name.equals(FIX_REFERENCE_EVENTS_LS)) {
+            doReferenceEventsOut(aaf, doc, visible);
+        }
+        else if (name.equals(FIX_ANALYSIS_EVENTS_LS)) {
+            doAnalysisEventsOut(aaf, doc, visible);
+        }
+        else if (name.equals(FIX_DEVIATION_LS)) {
+            doReferenceDeviationOut(aaf, doc, visible);
+        }
+        else {
+            logger.warn("Unknown facet name " + name);
+            return;
+        }
+    }
+
+    protected void doSectorAverageOut(
+        ArtifactAndFacet aaf,
+        Document doc,
+        boolean visible)
+    {
+        logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex());
+
+        int index = aaf.getFacet().getIndex();
+        int sectorNdx = index & 3;
+        int periodNdx = index >> 2;
+
+        KMIndex<AnalysisPeriod[]> kms =
+            (KMIndex<AnalysisPeriod[]>)aaf.getData(context);
+
+        if(kms == null) {
+            return;
+        }
+
+        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc);
+
+        for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) {
+            double km = entry.getKm();
+            AnalysisPeriod[] ap = entry.getValue();
+            QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx];
+            if (qwd == null) {
+                continue;
+            }
+            double deltaW = qwd.getDeltaW();
+            series.add(km, deltaW);
+        }
+
+        addAxisSeries(series, 0, visible);
+
+    }
+
+
+    protected void doSectorAverageDeviationOut(
+        ArtifactAndFacet aaf,
+        Document doc,
+        boolean visible)
+    {
+        logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex());
+
+        int index = aaf.getFacet().getIndex();
+        int sectorNdx = index & 3;
+        int periodNdx = index >> 2;
+
+        KMIndex<AnalysisPeriod[]> kms =
+            (KMIndex<AnalysisPeriod[]>)aaf.getData(context);
+
+        if(kms == null) {
+            return;
+        }
+
+        StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc);
+        XYSeries upper =
+            new StyledXYSeries(aaf.getFacetDescription(), false, doc);
+        XYSeries lower =
+            new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc);
+
+
+        for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) {
+            double km = entry.getKm();
+            AnalysisPeriod[] ap = entry.getValue();
+            QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx];
+            double dev = ap[periodNdx].getQSectorStdDev(sectorNdx);
+            logger.debug("std-dev: " + dev);
+            if (qwd == null) {
+                continue;
+            }
+            double deltaW = qwd.getDeltaW();
+            double up = deltaW + dev;
+            double lo = deltaW - dev;
+            upper.add(km, up);
+            lower.add(km, lo);
+        }
+        area.addSeries(upper);
+        area.addSeries(lower);
+
+        addAreaSeries(area, 0, visible);
+    }
+
+
+    protected void doReferenceDeviationOut(
+        ArtifactAndFacet aaf,
+        Document doc,
+        boolean visible)
+    {
+        logger.debug("doReferenceOut");
+
+        KMIndex<double[]> kms =
+            (KMIndex<double[]>)aaf.getData(context);
+
+        if(kms == null) {
+            return;
+        }
+
+        StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc);
+        XYSeries upper =
+            new StyledXYSeries(aaf.getFacetDescription(), false, doc);
+        XYSeries lower =
+            new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc);
+
+
+        for (KMIndex.Entry<double[]> entry: kms) {
+            double km = entry.getKm();
+            double[] devArray = entry.getValue();
+            if (devArray == null) {
+                continue;
+            }
+            double dev = devArray[0];
+            double up = dev;
+            double lo = -dev;
+            upper.add(km, up);
+            lower.add(km, lo);
+        }
+        area.addSeries(upper);
+        area.addSeries(lower);
+
+        Marker marker = new ValueMarker(0);
+        marker.setStroke(new BasicStroke(2));
+        marker.setPaint(Color.BLACK);
+        addValueMarker(marker);
+        addAreaSeries(area, 0, visible);
+    }
+
+    protected void doAnalysisEventsOut(
+        ArtifactAndFacet aaf,
+        Document doc,
+        boolean visible)
+    {
+        logger.debug("doAnalysisEventsOut");
+        int index = aaf.getFacet().getIndex();
+        int sectorNdx = index & 3;
+        int periodNdx = index >> 2;
+
+        KMIndex<AnalysisPeriod[]> kms =
+            (KMIndex<AnalysisPeriod[]>)aaf.getData(context);
+
+        if(kms == null) {
+            return;
+        }
+
+        XYSeriesCollection col = new XYSeriesCollection();
+
+        List<StyledXYSeries> series = new ArrayList<StyledXYSeries>();
+
+        for (KMIndex.Entry<AnalysisPeriod[]> entry: kms) {
+            double km = entry.getKm();
+            AnalysisPeriod[] ap = entry.getValue();
+            QWD[] qwds = ap[periodNdx].getQWDs();
+
+            String space = "";
+            for (int i = 0; i < qwds.length; i++) {
+                if (series.size() <= i && qwds.length > i) {
+                    StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc);
+                    series.add (s);
+                }
+                StyledXYSeries s = series.get(i);
+                s.add(km, qwds[i].getDeltaW());
+                space+= " ";
+            }
+        }
+        for (StyledXYSeries s: series) {
+            col.addSeries(s);
+        }
+
+        addAxisDataset(col, 0, visible);
+    }
+
+    protected void doReferenceEventsOut(
+        ArtifactAndFacet aaf,
+        Document doc,
+        boolean visible)
+    {
+        logger.debug("doReferenceEventOut");
+
+        KMIndex<QWD[]> kms =
+            (KMIndex<QWD[]>)aaf.getData(context);
+
+        if(kms == null) {
+            return;
+        }
+
+        XYSeriesCollection col = new XYSeriesCollection();
+
+        List<StyledXYSeries> series = new ArrayList<StyledXYSeries>();
+
+        for (KMIndex.Entry<QWD[]> entry: kms) {
+            double km = entry.getKm();
+            QWD[] qwds = entry.getValue();
+
+            String space = "";
+            for (int i = 0; i < qwds.length; i++) {
+                if (series.size() <= i && qwds.length > i) {
+                    StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc);
+                    series.add (s);
+                }
+                StyledXYSeries s = series.get(i);
+                s.add(km, qwds[i].getDeltaW());
+                space += " ";
+            }
+        }
+        for (StyledXYSeries s: series) {
+            col.addSeries(s);
+        }
+
+        addAxisDataset(col, 0, visible);
+    }
+
+
+    @Override
+    protected String getDefaultChartTitle() {
+        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
+    }
+
+    @Override
+    protected String getDefaultXAxisLabel() {
+        return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
+    }
+
+    @Override
+    protected String getDefaultYAxisLabel(int pos) {
+        return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
+    }
+
+    @Override
+    protected ChartGenerator.YAxisWalker getYAxisWalker() {
+        return new YAxisWalker() {
+            @Override
+            public int length() {
+                return YAXIS.values().length;
+            }
+
+            @Override
+             public String getId(int idx) {
+                YAXIS[] yaxes = YAXIS.values();
+                return yaxes[idx].toString();
+            }
+        };
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org