Revision: 6518
http://sourceforge.net/p/jump-pilot/code/6518
Author: ma15569
Date: 2020-09-22 16:07:41 +0000 (Tue, 22 Sep 2020)
Log Message:
-----------
Added a new method to read Image and Metadata for TIF.
It gets rid of using Commons Imaging that sometimes throws exception
on both reading resolution of the image. Metadata are now decoded partially via
loaded GeoRasterImage or by using JAI to read noData value.
Removed code to read overviews.
Modified Paths:
--------------
core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
2020-09-22 14:56:54 UTC (rev 6517)
+++ core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
2020-09-22 16:07:41 UTC (rev 6518)
@@ -140,11 +140,14 @@
// Overviews overviews = OverviewsUtils.getOverviews(new
File(
// fileNameOrURL), imageEnvelope);
- Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile);
- Overviews overviews = OverviewsUtils.getOverviews(new
File(fileNameOrURL), imageEnvelope);
+ // Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile);
+ // Overviews overviews = OverviewsUtils.getOverviews(new
File(fileNameOrURL), imageEnvelope);
- return TiffUtilsV2.readImage(tiffFile, viewPortEnvelope, requestedRes,
overviews, stats);
-
+ // return TiffUtilsV2.readImage(tiffFile, viewPortEnvelope, requestedRes,
overviews, stats);
+
+ // [Giuseppe Aruta 2020-sept-22] added new method that remove overviews
and gets metadata
+ // directly from GeoRasterImage or using JAI
+ return TiffUtilsV2.readImageAndMetadata(tiffFile, viewPortEnvelope,
requestedRes, stats);
} else if (fileNameOrURL.toLowerCase().endsWith(".flt")) {
GridFloat gf = new GridFloat(fileNameOrURL);
Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
2020-09-22 14:56:54 UTC (rev 6517)
+++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
2020-09-22 16:07:41 UTC (rev 6518)
@@ -29,6 +29,9 @@
import org.apache.commons.imaging.formats.tiff.TiffImageParser;
import org.xml.sax.SAXException;
+import com.sun.media.jai.codec.FileSeekableStream;
+import com.sun.media.jai.codec.TIFFDirectory;
+import com.sun.media.jai.codec.TIFFField;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jump.workbench.Logger;
@@ -90,6 +93,7 @@
return JAI.create("scale", parameterBlock);
}
+
/**
* Method to build an ImageAndMetadata file
* An ImageAndMetadata groups the Envelope, the Image, the Statistics and
@@ -201,7 +205,134 @@
}
}
+
+
+
+
+
+ /**
+ * New method to build an ImageAndMetadata file
+ * An ImageAndMetadata groups the Envelope, the Image, the Statistics and
+ * NoData value of a TIF file
+ * Removed reading overviews and dependency to commons imaging library
+ * @param tiffFile
+ * @param viewportEnvelope
+ * @param requestedRes
+ * @param stats
+ * @return ImageAndMetadata
+ * @throws NoninvertibleTransformException
+ * @throws IOException
+ * @throws FileNotFoundException
+ * @throws TiffTags.TiffReadingException
+ * @throws Exception
+ */
+ public static ImageAndMetadata readImageAndMetadata(File tiffFile, Envelope
viewportEnvelope, Resolution requestedRes,
+ Stats stats) throws NoninvertibleTransformException, IOException,
FileNotFoundException,
+ TiffTags.TiffReadingException, Exception {
+ RenderedOp renderedOp1 = getRenderedOp(tiffFile);
+ Envelope wholeImageEnvelope = getEnvelope(tiffFile);
+
+ //[Giuseppe Aruta 2020-sept-22] Deactivated Commons Imaging <TiffTag
class>
+ // as it throws an error on computing Resolution.
+ // This value can be calculated from envelope and image.
+ //Deactivated code
+ // TiffTags.TiffMetadata tiffMetadata =
TiffTags.readMetadata(tiffFile);
+ //int originalImageWidth = tiffMetadata.getColsCount();
+ //int originalImageHeight = tiffMetadata.getRowsCount();
+ // Resolution cellSize = tiffMetadata.getResolution();
+ // Double noData = tiffMetadata.getNoData();
+
+ //[Giuseppe Aruta 2020-sept-22]
+ // Try to read geotiff noData tag using JAI.
+ // It also solves the problem of the size of AsterDEM files
+ // @ TODO This part should be ported to
+ //
com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster
+ // as only NoData tag is used = 42113
+ final FileSeekableStream fileSeekableStream = new
FileSeekableStream(
+ tiffFile.getAbsoluteFile());
+ final TIFFDirectory tiffDirectory = new TIFFDirectory(
+ fileSeekableStream, 0);
+ Double noData=Double.NEGATIVE_INFINITY;
+ final TIFFField[] availTags = tiffDirectory.getFields();
+ try {
+ for (final TIFFField availTag : availTags) {
+ if (availTag.getTag() == 42113) {
+ String noDataString = "";
+ if(availTag.getType()== TIFFField.TIFF_ASCII) {
+ noDataString = availTag.toString();
+ if(noDataString.equalsIgnoreCase("NaN")) {
+ noDataString = "NaN";
+ }
+ } else if(availTag.getType()== TIFFField.TIFF_BYTE) {
+ noDataString = new String(availTag.getAsBytes());
+ }else if(availTag.getType()== TIFFField.TIFF_FLOAT) {
+ noDataString = Float.toString(availTag.getAsFloat(0));
+ }
+ noData = Double.valueOf(noDataString);
+ }
+ }
+ } catch (NumberFormatException e){
+ //[Giuseppe Aruta 2020-sept-22]
+ //Sometimes reading NoData fails with NumberFormatException
+ //Thus the rastee is not well displayed in the view
+ //This code sets a standard (Saga gis) noData value readable for
OpenJUMP
+ noData=-99999.0D;
+ }
+ /////End of NoData reading
+
+
+
+ double cellSizeX =
wholeImageEnvelope.getWidth()/renderedOp1.getWidth();
+ double cellSizeY =
wholeImageEnvelope.getHeight()/renderedOp1.getHeight();
+ if (requestedRes == null) {
+ requestedRes = new Resolution(cellSizeX, cellSizeY);
+ }
+ if (stats == null) {
+ // Statistics on all pixels
+ stats = calculateStats(tiffFile, noData, tiffFile);
+ }
+ float xScale = (float) (cellSizeX / requestedRes.getX());
+ float yScale = (float) (cellSizeY / requestedRes.getY());
+ xScale = Math.min(xScale, 1);
+ yScale = Math.min(yScale, 1);
+
+ RenderedOp renderedOp = readSubsampled(tiffFile, xScale, yScale);
+
+
+ Resolution subsetResolution = new
Resolution(wholeImageEnvelope.getWidth() / renderedOp.getWidth(),
+ wholeImageEnvelope.getHeight() / renderedOp.getHeight());
+
+ Rectangle imageSubset =
RasterImageIO.getDrawingRectangle(renderedOp.getWidth(), renderedOp.getHeight(),
+ wholeImageEnvelope, viewportEnvelope, subsetResolution);
+
+ BufferedImage bufferedImage;
+ Envelope imagePartEnvelope;
+ int actualImageWidth;
+ int actualImageHeight;
+ if (imageSubset == null) {
+ bufferedImage = null;
+ imagePartEnvelope = null;
+ actualImageWidth = 0;
+ actualImageHeight = 0;
+ } else {
+ bufferedImage = renderedOp.getAsBufferedImage(imageSubset,
null);
+ imagePartEnvelope = getImageSubsetEnvelope(wholeImageEnvelope,
imageSubset, subsetResolution);
+ actualImageWidth = bufferedImage.getWidth();
+ actualImageHeight = bufferedImage.getHeight();
+ }
+
+ Metadata metadata = new Metadata(wholeImageEnvelope,
imagePartEnvelope,
+ new Point(renderedOp1.getWidth(), renderedOp1.getHeight()),
new Point(actualImageWidth, actualImageHeight),
+ (cellSizeX + cellSizeY) / 2, (subsetResolution.getX() +
subsetResolution.getY()) / 2, noData,
+ stats);
+ return new ImageAndMetadata(bufferedImage, metadata);
+
+
+
+
+ }
+
/**
* Method to read overviews of a TIF from the file metadata or from an
external .ovr file
* @param tiffFile
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel