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
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to