]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffTileInterface.java
Move tif folder to preferences for elevation server
[simantics/district.git] / org.simantics.maps.elevation.server / src / org / simantics / maps / elevation / server / TiffTileInterface.java
index 900630dc42bffc386eabf0fcf203c872599fe53a..8f7ecc010d285e5ba41d55728fc2fc0e904668ed 100644 (file)
@@ -1,32 +1,39 @@
 package org.simantics.maps.elevation.server;
 
+import java.awt.geom.Rectangle2D;
+import java.io.Closeable;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import com.github.benmanes.caffeine.cache.Caffeine;
-import com.github.benmanes.caffeine.cache.LoadingCache;
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.Envelope;
-import com.vividsolutions.jts.index.strtree.STRtree;
-
 import org.geotools.geometry.DirectPosition2D;
 import org.geotools.geometry.Envelope2D;
+import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.referencing.CRS;
 import org.opengis.geometry.DirectPosition;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.referencing.operation.MathTransform;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TiffTileInterface {
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.index.strtree.STRtree;
+
+public class TiffTileInterface implements Closeable {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(TiffTileInterface.class);
 
     private Path tilesFolder;
+    private Map<Path, Envelope> envelopes = new ConcurrentHashMap<>();
     private LoadingCache<Path, TiffInterface> interfaceCache;
     private int openInterfacesSize;
     private STRtree index;
@@ -70,15 +77,13 @@ public class TiffTileInterface {
             TiffInterface tifInterface = openTifInterface(tifFile);
             Envelope2D coords = tifInterface.getCornerCoords();
             try {
-                MathTransform transform = CRS.findMathTransform(tifInterface.getCRS(), c4326);
-                DirectPosition2D min = new DirectPosition2D();
-                DirectPosition2D max = new DirectPosition2D();
-                transform.transform(new DirectPosition2D(coords.getMinX(), coords.getMinY()), min);
-                transform.transform(new DirectPosition2D(coords.getMaxX(), coords.getMaxY()), max);
-                Envelope envelope = new Envelope(min.getX(), max.getX(), min.getY(), max.getY());
+                ReferencedEnvelope refEnv = new ReferencedEnvelope(coords);
+                ReferencedEnvelope targetEnv = refEnv.transform(c4326, false, 30);
+
                 synchronized(index) {
-                    index.insert(envelope, tifFile);
+                    index.insert(targetEnv, tifFile);
                 }
+                envelopes.put(tifFile, targetEnv);
             } catch (Exception e) {
                 LOGGER.error("Could not initialize index for file {}", tifFile, e);
             } finally {
@@ -91,6 +96,15 @@ public class TiffTileInterface {
         });
     }
 
+    public Collection<Rectangle2D> getBoundingBoxes() {
+        Collection<Rectangle2D> rects = envelopes.values().stream().map(env -> {
+            double x = env.getMinX();
+            double y = env.getMinY();
+            return new Rectangle2D.Double(x, y, env.getMaxX() - x, env.getMaxY() - y);
+        }).collect(Collectors.toList());
+        return rects;
+    }
+
     private static CoordinateReferenceSystem c4326;
 
     static {
@@ -104,16 +118,30 @@ public class TiffTileInterface {
     public Number lookup(double x, double y) {
         LOGGER.info("Looking up x={} y={}", x, y);
         DirectPosition p = new DirectPosition2D(c4326, x, y);
-        List<Path> tifFile = (List<Path>) index.query(new Envelope(new Coordinate(x, y)));
-        if (!tifFile.isEmpty()) {
-            TiffInterface tifInterface = openTifInterface(tifFile.get(0));
-            try {
-                return tifInterface.lookup(p);
-            } finally {
-                tifInterface.close();
+        List<Path> tifFiles = (List<Path>) index.query(new Envelope(new Coordinate(x, y)));
+        for (Path tifFile : tifFiles) {
+            TiffInterface tifInterface = openTifInterface(tifFile);
+            if (tifInterface.contains(p)) {
+                try {
+                    return tifInterface.lookup(p);
+                } finally {
+                    tifInterface.close();
+                }
+            } else {
+                System.out.println("not found");
             }
-        } else {
-            return new Double(0); // use 0 by default for now
         }
+        return new Double(0); // use 0 by default for now
+    }
+
+    @Override
+    public void close() throws IOException {
+        interfaceCache.invalidateAll();
+        interfaceCache.cleanUp();
+        
+        envelopes.clear();
+        envelopes = null;
+        index = null;
+        interfaceCache = null;
     }
 }
\ No newline at end of file