--- /dev/null
+package org.simantics.maps.elevation.server;
+
+import java.awt.image.DataBuffer;
+import java.nio.file.Path;
+
+import org.geotools.coverage.grid.GridCoverage2D;
+import org.geotools.gce.geotiff.GeoTiffReader;
+import org.geotools.geometry.Envelope2D;
+import org.opengis.geometry.DirectPosition;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TiffInterface {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TiffInterface.class);
+
+ private final Path tifPath;
+ private GridCoverage2D coverage;
+ private CoordinateReferenceSystem crs;
+
+ private boolean init = false;
+
+ public TiffInterface(Path tifPath) {
+ this.tifPath = tifPath;
+ loadMetadata();
+ }
+
+ private void loadMetadata() {
+ GeoTiffReader reader = null;
+ try {
+ reader = new GeoTiffReader(this.tifPath.toFile());
+ this.coverage = reader.read(null);
+ this.crs = coverage.getCoordinateReferenceSystem();
+ this.init = true;
+ } catch (Exception e) {
+ LOGGER.error("Could not load {}", tifPath, e);
+ } finally {
+ if (reader != null) {
+ reader.dispose();
+ }
+ }
+ }
+
+ public Number lookup(DirectPosition pos) {
+ ensureInit();
+ Object r = coverage.evaluate(pos);
+ final int dataType = coverage.getRenderedImage().getSampleModel().getDataType();
+ switch (dataType) {
+ case DataBuffer.TYPE_BYTE: return new Byte(((byte[]) r)[0]);
+ case DataBuffer.TYPE_SHORT: // Fall through
+ case DataBuffer.TYPE_USHORT: // Fall through
+ case DataBuffer.TYPE_INT: return new Integer(((int[]) r)[0]);
+ case DataBuffer.TYPE_FLOAT: return new Float(((float[]) r)[0]);
+ case DataBuffer.TYPE_DOUBLE: return new Double(((double[]) r)[0]);
+ default: return null;
+ }
+ }
+
+ private void ensureInit() {
+ if (!init) {
+ throw new IllegalStateException("Interface is not initialized for " + this.tifPath);
+ }
+ }
+
+ public void close() {
+ coverage.dispose(true);
+ }
+
+ public Envelope2D getCornerCoords() {
+ return coverage.getEnvelope2D();
+ }
+
+ public CoordinateReferenceSystem getCRS() {
+ return crs;
+ }
+}