Revision: 6503
http://sourceforge.net/p/jump-pilot/code/6503
Author: edso
Date: 2020-09-20 22:17:08 +0000 (Sun, 20 Sep 2020)
Log Message:
-----------
created TiffUtilsV2, basically a caching static wrapper for GeoReferencedImage
general speedup because of reusing the established image source
replaced all TIF JAI.create("ImageRead", ...) with TiffUtilsV2.getRenderedOp()
added TiffUtilsV2.getEnvelope() to retrieve georeferencing from one point
added some logging
TODO:
port TiffUtils.readImage() and others over to TiffUtilsV2
especially the two readImage() methods can possibly be simplified a lot reusing
GeoReferencedImage functionality
Modified Paths:
--------------
core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java
core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java
core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java
core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java
Added Paths:
-----------
core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
Modified: core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java
2020-09-20 21:39:16 UTC (rev 6502)
+++ core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java
2020-09-20 22:17:08 UTC (rev 6503)
@@ -91,10 +91,11 @@
*/
public static void createOverviews(File tiffFile, int overviewsCount)
throws IOException {
- ParameterBlock pbjRead = new ParameterBlock();
- pbjRead.add(ImageIO.createImageInputStream(tiffFile));
- RenderedOp originalImage = JAI.create("ImageRead", pbjRead, null);
+// ParameterBlock pbjRead = new ParameterBlock();
+// pbjRead.add(ImageIO.createImageInputStream(tiffFile));
+// RenderedOp originalImage = JAI.create("ImageRead", pbjRead, null);
+ RenderedOp originalImage = TiffUtilsV2.getRenderedOp(tiffFile);
OutputStream out = new FileOutputStream(new File(tiffFile.getParent(),
tiffFile.getName() + ".ovr"));
Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
2020-09-20 21:39:16 UTC (rev 6502)
+++ core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java
2020-09-20 22:17:08 UTC (rev 6503)
@@ -126,26 +126,29 @@
new Point(bImage.getWidth(),
bImage.getHeight()), cellSize,
cellSize, Double.NaN, stats));
- } else if (fileNameOrURL.toLowerCase().endsWith(".tif")
- ||
fileNameOrURL.toLowerCase().endsWith(".tiff")) {
+ } else if (fileNameOrURL.toLowerCase().endsWith(".tif") ||
fileNameOrURL.toLowerCase().endsWith(".tiff")) {
- TiffMetadata tiffMetadata = TiffTags.readMetadata(new
File(
- fileNameOrURL));
+ File tiffFile = new File(fileNameOrURL);
- int imgWidth = tiffMetadata.getColsCount();
- int imgHeight = tiffMetadata.getRowsCount();
+// TiffMetadata tiffMetadata = TiffTags.readMetadata(new
File(
+// fileNameOrURL));
+//
+// int imgWidth = tiffMetadata.getColsCount();
+// int imgHeight = tiffMetadata.getRowsCount();
+//
+// Envelope imageEnvelope = tiffMetadata.getEnvelope();
+ // Envelope imageEnvelope = getGeoReferencing(fileNameOrURL, true,
+ // new Point(imgWidth, imgHeight));
- Envelope imageEnvelope = tiffMetadata.getEnvelope();
- // Envelope imageEnvelope =
getGeoReferencing(fileNameOrURL, true,
- // new Point(imgWidth, imgHeight));
+// Overviews overviews = OverviewsUtils.getOverviews(new
File(
+// fileNameOrURL), imageEnvelope);
- Overviews overviews = OverviewsUtils.getOverviews(new
File(
- fileNameOrURL), imageEnvelope);
+ Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile);
+ Overviews overviews = OverviewsUtils.getOverviews(new
File(fileNameOrURL), imageEnvelope);
- return TiffUtils.readImage(new File(fileNameOrURL),
- viewPortEnvelope, requestedRes,
overviews, stats);
+ return TiffUtils.readImage(tiffFile, viewPortEnvelope, requestedRes,
overviews, stats);
- } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) {
+ } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) {
GridFloat gf = new GridFloat(fileNameOrURL);
gf.readGrid(null);
@@ -202,16 +205,19 @@
}
else if (filenameOrURL.toLowerCase().endsWith(".tif")
||
filenameOrURL.toLowerCase().endsWith(".tiff")) {
- GeoReferencedRaster geoRaster;
- RenderedOp renderedOp;
- try {
- geoRaster = new GeoReferencedRaster(new
File(filenameOrURL).toURI().toString());
- renderedOp = geoRaster.getImage();
- } catch (ReferencedImageException e) {
- // TODO Auto-generated catch block
- renderedOp = JAI.create("fileload", filenameOrURL);
- }
- return renderedOp.getAsBufferedImage(subset,
null).getData();
+// GeoReferencedRaster geoRaster;
+// RenderedOp renderedOp;
+// try {
+// geoRaster = new GeoReferencedRaster(new
File(filenameOrURL).toURI().toString());
+// renderedOp = geoRaster.getImage();
+// } catch (ReferencedImageException e) {
+// // TODO Auto-generated catch block
+// renderedOp = JAI.create("fileload", filenameOrURL);
+// }
+// return renderedOp.getAsBufferedImage(subset,
null).getData();
+
+ return TiffUtilsV2.getRenderedOp(new
File(filenameOrURL)).getAsBufferedImage(subset, null).getData();
+
} else if (filenameOrURL.toLowerCase().endsWith(".jpg")
|| filenameOrURL.toLowerCase().endsWith(".bmp")
||
filenameOrURL.toLowerCase().endsWith(".jp2")) {
@@ -327,7 +333,7 @@
}
else if (filenameOrURL.toLowerCase().endsWith(".tif")
||
filenameOrURL.toLowerCase().endsWith(".tiff")) {
- renderedOp= TiffUtils.getRenderedOp(new
File(filenameOrURL));
+ renderedOp= TiffUtilsV2.getRenderedOp(new
File(filenameOrURL));
return renderedOp.getData(rectangle)
.getSampleDouble(col, row, band);
@@ -386,7 +392,7 @@
}else if (filenameOrURL.toLowerCase().endsWith(".tif")
||
filenameOrURL.toLowerCase().endsWith(".tiff")) {
RenderedOp renderedOp;
- renderedOp= TiffUtils.getRenderedOp(new
File(filenameOrURL));
+ renderedOp= TiffUtilsV2.getRenderedOp(new
File(filenameOrURL));
if (renderedOp != null) {
return new Point(renderedOp.getWidth(),
renderedOp.getHeight());
Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java
2020-09-20 21:39:16 UTC (rev 6502)
+++ core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java
2020-09-20 22:17:08 UTC (rev 6503)
@@ -546,6 +546,7 @@
Resolution requestedRes =
RasterImageIO.calcRequestedResolution(viewport);
long start = Timer.milliSecondsSince(0);
+ Logger.debug("Try reading "+getName());
ImageAndMetadata imageAndMetadata =
rasterImageIO.loadImage(getWorkbenchContext(), imageFileName, stats,
viewport.getEnvelopeInModelCoordinates(), requestedRes);
Logger.info("Reading '"+getName()+"' took
"+Timer.secondsSinceString(start)+"s.");
metadata = imageAndMetadata.getMetadata();
Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java 2020-09-20
21:39:16 UTC (rev 6502)
+++ core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java 2020-09-20
22:17:08 UTC (rev 6503)
@@ -32,7 +32,6 @@
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jump.workbench.Logger;
-import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster;
/**
*
@@ -81,7 +80,7 @@
xScale = Math.min(xScale, 1);
yScale = Math.min(yScale, 1);
- RenderedOp renderedOp = readSubsampled(tiffFile, xScale, yScale);
+ RenderedOp renderedOp = TiffUtilsV2.readSubsampled(tiffFile, xScale,
yScale);
// For better looking results, but slower:
// rop = JAI.create("SubsampleAverage", pb);
@@ -242,7 +241,7 @@
throws ParserConfigurationException, TransformerException,
TransformerConfigurationException, SAXException,
IOException {
- BufferedImage bufferedImage = readSubsampled(tiffFile, 1,
1).getAsBufferedImage();
+ BufferedImage bufferedImage = TiffUtilsV2.readSubsampled(tiffFile, 1,
1).getAsBufferedImage();
int bandCount = bufferedImage.getRaster().getNumBands();
double minValue[] = new double[bandCount];
@@ -314,63 +313,9 @@
}
- /*
- * public static RenderedOp readSubsampled(File tiffFile, float xScale, float
- * yScale) { System.setProperty("com.sun.media.jai.disableMediaLib", "true");
- * RenderedOp renderedOp = JAI.create("fileload",
tiffFile.getAbsolutePath());
- * ParameterBlock parameterBlock = new ParameterBlock();
- * parameterBlock.addSource(renderedOp); parameterBlock.add(xScale);
- * parameterBlock.add(yScale); return JAI.create("scale", parameterBlock);
- *
- * }
- */
-
- // [Giuseppe Aruta 2020-07-09] whenever it is possible
- // we use JAI Image I/O
-
- public static RenderedOp readSubsampled(File tiffFile, float xScale, float
yScale) {
- RenderedOp renderedOp = getRenderedOp(tiffFile);
- ParameterBlock parameterBlock = new ParameterBlock();
- parameterBlock.addSource(renderedOp);
- parameterBlock.add(xScale);
- parameterBlock.add(yScale);
- renderedOp = JAI.create("scale", parameterBlock);
- return JAI.create("scale", parameterBlock);
-
- }
-
- public static Double readCellValue(File tiffFile, int col, int row, int
band) {
-
+ public static Double readCellValue(File tiffFile, int col, int row, int
band) throws Exception {
Rectangle rectangle = new Rectangle(col, row, 1, 1);
- return getRenderedOp(tiffFile).getData(rectangle).getSampleDouble(col,
row, band);
+ return
TiffUtilsV2.getRenderedOp(tiffFile).getData(rectangle).getSampleDouble(col,
row, band);
}
- public static RenderedOp getRenderedOp(File tiffFile) {
- // Since JAI error messages are rerouted to OJ log
- // I suppress the error message for absence of mediaLib accelerator
- System.setProperty("com.sun.media.jai.disableMediaLib", "true");
- RenderedOp renderedOp = null;
- try {
- // First try with JAI Image I/O "ImageRead"
- GeoReferencedRaster geoRaster = new
GeoReferencedRaster(tiffFile.toURI().toString(),
- new com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi());
- renderedOp = geoRaster.getImage();
- } catch (Exception e) {
- // Then with JAI "FileLoad"
- // System.setProperty("com.sun.media.jai.disableMediaLib", "true");
-
- // <GeoRaster.class> rerouted JAI error messages to OJ log here
- JAI.getDefaultInstance().setImagingListener(new ImagingListener() {
- @Override
- public boolean errorOccurred(String msg, Throwable thrown, Object
where, boolean isRetryable)
- throws RuntimeException {
- Logger.error(thrown);
- return false;
- }
- });
- renderedOp = JAI.create("fileload", tiffFile.toURI().toString());
- }
- return renderedOp;
- }
-
}
Added: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
(rev 0)
+++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
2020-09-20 22:17:08 UTC (rev 6503)
@@ -0,0 +1,69 @@
+package org.openjump.core.rasterimage;
+
+import java.awt.image.renderable.ParameterBlock;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.media.jai.JAI;
+import javax.media.jai.RenderedOp;
+
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jump.workbench.imagery.ReferencedImageException;
+import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster;
+
+public class TiffUtilsV2 {
+ // a File -> RenderedOp cache mapping to prevent recreating inputs for the
same file
+ private static HashMap<File,GeoReferencedRaster> geoRasterCache = new
HashMap<File,GeoReferencedRaster>();
+
+
+ public static RenderedOp getRenderedOp(File tiffFile) throws IOException {
+ GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile);
+ RenderedOp rop;
+ try {
+ rop = geoRaster.getImage();
+ } catch (ReferencedImageException e) {
+ // TODO: handle errors better, wrapping it in IOException here
+ // because that's what's handled up from here
+ throw new IOException(e);
+ }
+ return rop;
+ }
+
+ public static Envelope getEnvelope(File tiffFile) throws IOException {
+ GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile);
+
+ return geoRaster.getOriginalEnvelope();
+ }
+
+ private static GeoReferencedRaster getGeoReferencedRaster(File tiffFile)
throws IOException {
+ // prevent recreating inputs by reusing cached RenderedOp
+ if (geoRasterCache.containsKey(tiffFile))
+ return geoRasterCache.get(tiffFile);
+
+ GeoReferencedRaster geoRaster;
+ try {
+ geoRaster = new GeoReferencedRaster(tiffFile.toString(),
+ new com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi());
+ } catch (ReferencedImageException e) {
+ // TODO: handle errors better, wrapping it in IOException here
+ // because that's what's handled up from here
+ throw new IOException(e);
+ }
+
+ // save in cache
+ geoRasterCache.put(tiffFile, geoRaster);
+
+ return geoRaster;
+ }
+
+ public static RenderedOp readSubsampled(File tiffFile, float xScale, float
yScale) throws IOException {
+ RenderedOp renderedOp = getRenderedOp(tiffFile);
+ ParameterBlock parameterBlock = new ParameterBlock();
+ parameterBlock.addSource(renderedOp);
+ parameterBlock.add(xScale);
+ parameterBlock.add(yScale);
+ renderedOp = JAI.create("scale", parameterBlock);
+ return JAI.create("scale", parameterBlock);
+ }
+}
Property changes on:
core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified:
core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java
===================================================================
---
core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java
2020-09-20 21:39:16 UTC (rev 6502)
+++
core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java
2020-09-20 22:17:08 UTC (rev 6503)
@@ -58,6 +58,7 @@
import com.vividsolutions.jump.feature.FeatureCollection;
import com.vividsolutions.jump.feature.FeatureDataset;
import com.vividsolutions.jump.feature.FeatureSchema;
+import com.vividsolutions.jump.workbench.Logger;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.model.Layerable;
@@ -334,11 +335,12 @@
}
} catch (RasterDataNotFoundException ex) {
- cellValues = "???";
+ cellValues = "???";
} catch (IOException e) {
- cellValues = " - ";
+ cellValues = " - ";
+ Logger.error(e);
} catch (NoninvertibleTransformException e) {
- cellValues = " - ";
+ cellValues = " - ";
}
name = ((RasterImageLayer) layer).getName();
getPanel().getContext().setStatusMessage(
@@ -346,7 +348,7 @@
+ cellValues.toString());}
}
}
-
+
@Override
public String getName() {
return
I18N.get("org.openjump.core.ui.plugin.raster.RasterQueryPlugIn");
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel