diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 362:d79a51fc4f1d

Added necessary methods to start the computation of waterlevel data. flys-artifacts/trunk@1770 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 29 Apr 2011 07:46:27 +0000
parents d97982627596
children 0ccf7200fc51
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Fri Apr 29 07:27:05 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java	Fri Apr 29 07:46:27 2011 +0000
@@ -20,8 +20,12 @@
 
 import de.intevation.artifacts.common.utils.XMLUtils;
 
+import de.intevation.flys.model.River;
+
 import de.intevation.flys.artifacts.states.DefaultState;
 import de.intevation.flys.artifacts.context.FLYSContext;
+import de.intevation.flys.artifacts.model.WQKms;
+import de.intevation.flys.artifacts.model.WstValueTable;
 
 
 /**
@@ -215,7 +219,82 @@
 
             ui.appendChild(state.describeStatic(doc, ui, context, uuid));
         }
+    }
 
+
+    //
+    // METHODS FOR RETRIEVING COMPUTED DATA FOR DIFFERENT CHART TYPES
+    //
+
+    /**
+     * Returns the data that is computed by a waterlevel computation.
+     *
+     * @return an array of data triples that consist of W, Q and Kms.
+     */
+    public WQKms[] getWaterlevelData()
+    throws NullPointerException
+    {
+        logger.debug("WINFOArtifact.getWaterlevelData");
+
+        River river = getRiver();
+        if (river == null) {
+            throw new NullPointerException("No river selected.");
+        }
+
+        double[] kms = getKms();
+        if (kms == null) {
+            throw new NullPointerException("No Kms selected.");
+        }
+
+        double[] qs = getQs();
+        if (qs == null) {
+            // TODO Use DischargeTableValue.getQForW() to compute the Qs.
+        }
+
+        WstValueTable wst = WstValueTable.getTable(river);
+        if (wst == null) {
+            throw new NullPointerException("No Wst found for selected river.");
+        }
+
+        // TODO Introduce a caching mechanism here!
+
+        return computeWaterlevelData(kms, qs, wst);
+    }
+
+
+    /**
+     * Computes the data of a waterlevel computation based on the interpolation
+     * in WstValueTable.
+     *
+     * @param kms The kilometer values.
+     * @param qa The discharge values.
+     * @param wst The WstValueTable used for the interpolation.
+     *
+     * @return an array of data triples that consist of W, Q and Kms.
+     */
+    public static WQKms[] computeWaterlevelData(
+        double[]      kms,
+        double[]      qs,
+        WstValueTable wst)
+    {
+        logger.info("WINFOArtifact.computeWaterlevelData");
+
+        WQKms[] wqkms = new WQKms[qs.length];
+        for (int i = 0; i < wqkms.length; i++) {
+            wqkms[i] = new WQKms();
+        }
+
+        for (double km: kms) {
+            double[] interpolatedW = wst.interpolateW(km, qs);
+
+            // TODO Modify the interpolation to return a better formed data
+            // structure.
+            for (int i = 0; i < interpolatedW.length; i++) {
+                wqkms[i].add(interpolatedW[i], qs[i], km);
+            }
+        }
+
+        return wqkms;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org