X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.maps.elevation.server%2Fsrc%2Forg%2Fsimantics%2Fmaps%2Felevation%2Fserver%2FTiffTileInterface.java;h=6cc9cd7b79e0c544f01f14f02c7c23563ef50927;hb=HEAD;hp=d6f1910e7057efce2c19b6f64e77d64de0c4df2b;hpb=03bf22e6e4d5bc912d4ec70c1956b1c804b837d3;p=simantics%2Fdistrict.git diff --git a/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffTileInterface.java b/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffTileInterface.java index d6f1910e..6cc9cd7b 100644 --- a/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffTileInterface.java +++ b/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffTileInterface.java @@ -1,6 +1,7 @@ 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; @@ -14,10 +15,10 @@ import java.util.stream.Stream; 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; @@ -27,11 +28,12 @@ import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.index.strtree.STRtree; -public class TiffTileInterface { +public class TiffTileInterface implements Closeable { private static final Logger LOGGER = LoggerFactory.getLogger(TiffTileInterface.class); private Path tilesFolder; + private Map envelopes = new ConcurrentHashMap<>(); private LoadingCache interfaceCache; private int openInterfacesSize; private STRtree index; @@ -75,16 +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, envelope); + envelopes.put(tifFile, targetEnv); } catch (Exception e) { LOGGER.error("Could not initialize index for file {}", tifFile, e); } finally { @@ -97,8 +96,6 @@ public class TiffTileInterface { }); } - private Map envelopes = new ConcurrentHashMap<>(); - public Collection getBoundingBoxes() { Collection rects = envelopes.values().stream().map(env -> { double x = env.getMinX(); @@ -114,23 +111,38 @@ public class TiffTileInterface { try { c4326 = CRS.decode("EPSG:4326"); } catch (Exception e) { - LOGGER.error("Could not initialize epsg:4326", e); + LOGGER.error("Could not initialize EPSG:4326", e); } } public Number lookup(double x, double y) { - LOGGER.info("Looking up x={} y={}", x, y); + LOGGER.trace("Looking up x={} y={}", x, y); DirectPosition p = new DirectPosition2D(c4326, x, y); - List tifFile = (List) 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(); + @SuppressWarnings("unchecked") + List tifFiles = (List) 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 Double.valueOf(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