]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffInterface.java
First version of elevation server based on GeoTIFF files
[simantics/district.git] / org.simantics.maps.elevation.server / src / org / simantics / maps / elevation / server / TiffInterface.java
diff --git a/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffInterface.java b/org.simantics.maps.elevation.server/src/org/simantics/maps/elevation/server/TiffInterface.java
new file mode 100644 (file)
index 0000000..1448523
--- /dev/null
@@ -0,0 +1,77 @@
+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;
+    }
+}