diff gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java @ 482:64e65daa65e9

Fixed some bugs with calculating "Horizontalschnitte". gnv-artifacts/trunk@557 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 17 Jan 2010 21:26:21 +0000
parents 20dde2b6f1b5
children 823e4f808418
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java	Sun Jan 17 16:34:11 2010 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java	Sun Jan 17 21:26:21 2010 +0000
@@ -24,7 +24,10 @@
 
 import de.intevation.gnv.geobackend.sde.datasources.RasterObject;
 
+import de.intevation.gnv.math.AreaInterpolation;
 import de.intevation.gnv.math.AttributedPoint2ds;
+import de.intevation.gnv.math.Point2d;
+import de.intevation.gnv.math.QueriedXYDepth;
 
 import de.intevation.gnv.state.InputData;
 import de.intevation.gnv.state.OutputStateBase;
@@ -37,11 +40,15 @@
 import de.intevation.gnv.utils.StringUtils;
 import de.intevation.gnv.utils.WKTUtils;
 
+import java.awt.Dimension;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 
@@ -324,7 +331,8 @@
                 preprocess(
                     queryExecutor.executeQuery(
                         queryID,
-                        addedFilterValues)));
+                        addedFilterValues)),
+                getGroundInterpolation(callContext));
         }
         catch (QueryException e) {
             log.error(e,e);
@@ -343,29 +351,99 @@
 
         AttributedPoint2ds ap2ds = new AttributedPoint2ds();
 
-        boolean first = true;
+        ArrayList<Point2d> points = new ArrayList<Point2d>(results.size());
+
+        int sIdx = -1;
+        int iIdx = -1;
+        int jIdx = -1;
+        int vIdx = -1;
+        int kIdx = -1;
+
+        boolean firstWarn = true;
 
         for (Result result: results) {
 
-            if (debug && first) {
-                first = false;
+            if (sIdx == -1) {
                 ResultDescriptor rd = result.getResultDescriptor();
-                log.debug(rd);
+                sIdx     = rd.getColumnIndex("SHAPE");
+                iIdx     = rd.getColumnIndex("IPOSITION");
+                jIdx     = rd.getColumnIndex("JPOSITION");
+                kIdx     = rd.getColumnIndex("KPOSITION");
+                vIdx     = rd.getColumnIndex("YORDINATE");
+                int tIdx = rd.getColumnIndex("TIMEVALUE");
+                int pIdx = rd.getColumnIndex("PARAMETERID");
+
+                if (sIdx == -1 || iIdx == -1
+                ||  jIdx == -1 || kIdx == -1 
+                ||  vIdx == -1 || tIdx == -1
+                ||  pIdx == -1
+                ) {
+                    log.error("missing column in result set");
+                    return null;
+                }
+
+                ap2ds.setAttribute("date",      result.getDate(tIdx));
+                ap2ds.setAttribute("parameter", result.getInteger(pIdx));
             }
+            Coordinate coord = WKTUtils.toCoordinate(result.getString(sIdx));
+            if (coord == null) {
+                if (firstWarn) {
+                    firstWarn = false;
+                    log.warn("cannot fetch coordinate from result");
+                }
+                continue;
+            }
+            double v = result.getDouble(vIdx);
+            int    i = result.getInteger(iIdx);
+            int    j = result.getInteger(jIdx);
+
+            Point2d p2d = new Point2d(coord.x, coord.y, v, i, j);
+            points.add(p2d);
+            
         }
-
-        // TODO: do the interpolation
+        ap2ds.setPoints(points);
 
         return ap2ds;
     }
     
     public AttributedPoint2ds process(
-        Envelope           env,
+        Envelope           boundingBox,
         Polygon            polygon,
         int                numSamples,
-        AttributedPoint2ds input
+        AttributedPoint2ds input,
+        int                groundInterpolation
     ) {
-        return input;
+        if (input == null) {
+            log.error("no data to interpolate");
+            return null;
+        }
+
+        boolean debug = log.isDebugEnabled();
+
+        if (debug) {
+            log.debug("before interpolation");
+        }
+
+        AreaInterpolation interpolation =
+            new AreaInterpolation();
+
+        List<? extends Point2d> points = input.getPoints();
+
+        if (!interpolation.interpolate(
+            points, 
+            boundingBox,
+            new Dimension(numSamples, numSamples),
+            new QueriedXYDepth(groundInterpolation)
+        )) {
+            log.error("interpolation failed");
+            return null;
+        }
+
+        if (debug) {
+            log.debug("after interpolation");
+        }
+
+        return null;
     }
 
     

http://dive4elements.wald.intevation.org