diff gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java @ 657:af3f56758f59

merged gnv-artifacts/0.5
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:13:53 +0200
parents f7038820df2e
children 9a828e5a2390
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/math/QueriedXYDepth.java	Fri Sep 28 12:13:53 2012 +0200
@@ -0,0 +1,94 @@
+/**
+ *
+ */
+package de.intevation.gnv.math;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import java.lang.ref.SoftReference;
+
+import org.apache.log4j.Logger;
+
+import com.vividsolutions.jts.geom.Coordinate;
+
+import de.intevation.gnv.geobackend.base.Result;
+import de.intevation.gnv.geobackend.base.query.QueryExecutor;
+import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
+import de.intevation.gnv.geobackend.base.query.exception.QueryException;
+import de.intevation.gnv.geobackend.sde.datasources.RasterObject;
+
+import de.intevation.gnv.utils.WKTUtils;
+
+/**
+ * @author Tim Englich         (tim.englich@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class QueriedXYDepth implements XYDepth {
+
+    /**
+     * the logger, used to log exceptions and additonaly information
+     */
+    private static Logger log = Logger.getLogger(QueriedXYDepth.class);
+    
+    private static final String queryID = "rasterQuery";
+    
+    private QueryExecutor queryExecutor;
+    
+    private ArrayList<SoftReference<RasterObject>> rasterData;
+
+    private RasterObject last;
+
+    private int interpolation;
+    
+    public QueriedXYDepth() {
+        this(RasterObject.BILINEAR);
+    }
+
+    public QueriedXYDepth(int interpolation) {
+        this.interpolation = interpolation;
+        rasterData    = new ArrayList<SoftReference<RasterObject>>();
+        queryExecutor = QueryExecutorFactory.getInstance().getQueryExecutor();
+    }
+
+    /**
+     * @see de.intevation.gnv.math.XYDepth#depth(com.vividsolutions.jts.geom.Coordinate)
+     */
+    public double depth(Coordinate coordinate) {
+        double resultValue = Double.NaN;
+        
+        RasterObject ro = getRasterObject(coordinate);
+        
+        if (ro == null) {
+            try {
+                String[] filterValues = new String[] { WKTUtils.toWKT(coordinate) };
+                Collection<Result> result = queryExecutor.executeQuery(this.queryID,filterValues);
+                for (Result row: result) {
+                    if ((ro = (RasterObject)row.getObject(0)) != null) {
+                        rasterData.add(new SoftReference<RasterObject>(last = ro));
+                    }
+                    break;
+                }
+            } catch (QueryException e) {
+                log.error(e, e);
+            }
+        }
+        return ro != null
+            ? ro.getValue(coordinate, interpolation)
+            : Double.NaN; 
+    }
+    
+    private RasterObject getRasterObject(Coordinate coordinate) {
+        if (last != null && last.contains(coordinate)) {
+            return last;
+        }
+        for (int i = rasterData.size()-1; i >= 0; --i) {
+            SoftReference<RasterObject> ref = rasterData.get(i);
+            RasterObject ro = ref.get();
+            if (ro != null && ro.contains(coordinate)) {
+                return last = ro;
+            }
+        }
+        return null;
+    }
+}

http://dive4elements.wald.intevation.org