diff flys-artifacts/src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java @ 369:2ce7b473620e

Implemented the chart creation of a longitudinal section chart - W and Q facets. flys-artifacts/trunk@1778 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 29 Apr 2011 10:13:24 +0000
parents 8830eecad69e
children 60f63539d004
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java	Fri Apr 29 10:02:59 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/LongitudinalSectionGenerator.java	Fri Apr 29 10:13:24 2011 +0000
@@ -1,10 +1,10 @@
 package de.intevation.flys.exports;
 
-import java.io.IOException;
-
 import org.apache.log4j.Logger;
 
-import org.jfree.data.xy.DefaultXYDataset;
+import org.jfree.data.xy.XYDataset;
+import org.jfree.data.xy.XYSeries;
+import org.jfree.data.xy.XYSeriesCollection;
 
 import org.w3c.dom.Document;
 
@@ -19,39 +19,162 @@
  *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
-public class LongitudinalSectionGenerator extends ChartGenerator {
+public class LongitudinalSectionGenerator extends XYChartGenerator {
 
     /** The logger that is used in this generator.*/
     private static Logger logger =
         Logger.getLogger(LongitudinalSectionGenerator.class);
 
 
-    protected DefaultXYDataset dataset;
+    public static final String LONGITUDINAL_SECTION_W =
+        "longitudinal_section.w";
+
+    public static final String LONGITUDINAL_SECTION_Q =
+        "longitudinal_section.q";
+
+
+    /** The storage for the series to be drawn in this chart.*/
+    protected XYSeriesCollection dataset;
 
 
     public LongitudinalSectionGenerator() {
         super();
 
-        this.dataset = new DefaultXYDataset();
+        this.dataset = new XYSeriesCollection();
+    }
+
+
+    protected String getChartTitle() {
+        // TODO i18n
+        return "Wasserstand für Gewässer";
+    }
+
+
+    protected String getXAxisLabel() {
+        return "km";
+    }
+
+
+    protected String getYAxisLabel() {
+        return "W [NN + m]";
+    }
+
+
+    protected XYDataset getXYDataset() {
+        return dataset;
     }
 
 
     public void doOut(Artifact artifact, String facet, Document attr) {
         logger.debug("LongitudinalSectionGenerator.doOut: " + facet);
 
+        if (facet == null) {
+            logger.error("No facet name for doOut(). No output generated!");
+            return;
+        }
+
+        if (facet.equals(LONGITUDINAL_SECTION_W)) {
+            doWOut(getWaterlevelData(artifact));
+        }
+        else if (facet.equals(LONGITUDINAL_SECTION_Q)) {
+            doQOut(getWaterlevelData(artifact));
+        }
+        else {
+            logger.warn("Unknown facet name: " + facet);
+            return;
+        }
+    }
+
+
+    /**
+     * Returns the waterlevel data computed by the WINFOArtifact.
+     *
+     * @param artifact The WINFOArtifact.
+     *
+     * @return the computed waterlevel data.
+     */
+    protected WQKms[] getWaterlevelData(Artifact artifact) {
         WINFOArtifact winfoArtifact = (WINFOArtifact) artifact;
         WQKms[]       wqkms         = winfoArtifact.getWaterlevelData();
 
         logger.debug("Got " + wqkms.length + " WQKms objects.");
+
+        return wqkms;
     }
 
 
-    public void generate()
-    throws IOException
-    {
-        logger.debug("LongitudinalSectionGenerator.generate");
+    /**
+     * Process the output for W facets in a longitudinal section curve.
+     *
+     * @param wqkms An array of WQKms values.
+     */
+    protected void doWOut(WQKms[] wqkms) {
+        logger.debug("LongitudinalSectionGenerator.doWOut");
 
-        // TODO Implement me!
+        int idx = 0;
+        for (WQKms tmp: wqkms) {
+            XYSeries series = new XYSeries(getSeriesName(tmp, "w", idx++));
+
+            double[] target = new double[3];
+            int      size   = tmp.size();
+
+            if (logger.isDebugEnabled()) {
+                logger.debug("Generate series: " + series.getKey());
+
+                logger.debug("Start km: " + tmp.getKms(0));
+                logger.debug("End   km: " + tmp.getKms(size-1));
+                logger.debug("Values  : " + size);
+            }
+
+            for (int i = 0; i < size; i++) {
+                target = tmp.get(i, target);
+
+                logger.debug("++ W Tuple: " + target[2] + " -> " + target[0]);
+                series.add(target[2], target[0]);
+            }
+
+            dataset.addSeries(series);
+        }
+    }
+
+
+    /**
+     * Process the output for Q facets in a longitudinal section curve.
+     *
+     * @param wqkms An array of WQKms values.
+     */
+    protected void doQOut(WQKms[] wqkms) {
+        logger.debug("LongitudinalSectionGenerator.doQOut");
+
+        int idx = 0;
+        for (WQKms tmp: wqkms) {
+            XYSeries series = new XYSeries(getSeriesName(tmp, "Q", idx++));
+
+            double[] target = new double[3];
+            int      size   = tmp.size();
+
+            if (logger.isDebugEnabled()) {
+                logger.debug("Generate series: " + series.getKey());
+
+                logger.debug("Start km: " + tmp.getKms(0));
+                logger.debug("End   km: " + tmp.getKms(size-1));
+                logger.debug("Values  : " + size);
+            }
+
+            for (int i = 0; i < size; i++) {
+                target = tmp.get(i, target);
+
+                logger.debug("++ Q Tuple: " + target[2] + " -> " + target[1]);
+                series.add(target[2], target[1]);
+            }
+
+            dataset.addSeries(series);
+        }
+    }
+
+
+    protected String getSeriesName(WQKms wqkms, String prefix, int idx) {
+        return prefix + "-" + idx;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org