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=f688024b0d078ef8250593a2878202eaa1dc6cef;hb=c30f0393c0ba0ac5d2c5a895f250a6484e78bf0e;hp=900630dc42bffc386eabf0fcf203c872599fe53a;hpb=c6ddbec532645f52583c1ab9691cfb802724fca7;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 900630dc..f688024b 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,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 envelopes = new ConcurrentHashMap<>(); private LoadingCache 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 getBoundingBoxes() { + Collection 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 { @@ -102,18 +116,32 @@ public class TiffTileInterface { } 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(); + 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 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