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;
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 {
});
}
+ 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 {
}
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<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