Revision: 6025
          http://sourceforge.net/p/jump-pilot/code/6025
Author:   ma15569
Date:     2018-12-20 18:56:18 +0000 (Thu, 20 Dec 2018)
Log Message:
-----------
Added some methods to work with image files

Modified Paths:
--------------
    core/trunk/src/org/openjump/core/apitools/IOTools.java

Modified: core/trunk/src/org/openjump/core/apitools/IOTools.java
===================================================================
--- core/trunk/src/org/openjump/core/apitools/IOTools.java      2018-12-20 
17:19:34 UTC (rev 6024)
+++ core/trunk/src/org/openjump/core/apitools/IOTools.java      2018-12-20 
18:56:18 UTC (rev 6025)
@@ -17,6 +17,7 @@
 import static 
com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn.get;
 import static javax.xml.parsers.DocumentBuilderFactory.newInstance;
 
+import java.awt.image.BufferedImage;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,6 +28,7 @@
 import java.io.OutputStreamWriter;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.net.URI;
 import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -38,6 +40,7 @@
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 import java.util.regex.Pattern;
 
@@ -58,6 +61,9 @@
 import org.geotools.dbffile.DbfFile;
 import org.geotools.dbffile.DbfFileWriter;
 import org.openjump.core.ccordsys.srid.SRIDStyle;
+import org.openjump.core.rasterimage.GeoTiffConstants;
+import org.openjump.core.rasterimage.TiffTags;
+import org.openjump.core.ui.io.file.FileLayerLoader;
 import org.openjump.core.ui.plugin.file.open.JFCWithEnterAction;
 import org.openjump.core.ui.plugin.style.ImportSLDPlugIn;
 import org.openjump.core.ui.util.ScreenScale;
@@ -68,6 +74,11 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
+import com.sun.media.jai.codec.TIFFEncodeParam;
+import com.sun.media.jai.codec.TIFFField;
+import com.sun.media.jai.codecimpl.TIFFCodec;
+import com.sun.media.jai.codecimpl.TIFFImageEncoder;
+import com.vividsolutions.jts.geom.Envelope;
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jump.I18N;
 import com.vividsolutions.jump.feature.AttributeType;
@@ -85,13 +96,18 @@
 import com.vividsolutions.jump.io.datasource.DataSource;
 import com.vividsolutions.jump.io.datasource.DataSourceQuery;
 import com.vividsolutions.jump.util.Blackboard;
+import com.vividsolutions.jump.util.FileUtil;
 import com.vividsolutions.jump.util.java2xml.Java2XML;
 import com.vividsolutions.jump.util.java2xml.XML2Java;
 import com.vividsolutions.jump.workbench.JUMPWorkbench;
 import com.vividsolutions.jump.workbench.Logger;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+import com.vividsolutions.jump.workbench.imagery.ImageryLayerDataset;
+import 
com.vividsolutions.jump.workbench.imagery.geoimg.GeoImageFactoryFileLayerLoader;
 import com.vividsolutions.jump.workbench.model.Layer;
 import com.vividsolutions.jump.workbench.model.LayerManager;
 import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.registry.Registry;
 import com.vividsolutions.jump.workbench.ui.GUIUtil;
 import com.vividsolutions.jump.workbench.ui.MultiInputDialog;
 import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
@@ -1184,4 +1200,97 @@
         fw.close();
     }
 
+    /**
+     * Load an image file as ReferenceImageLayer.class defining its extension
+     * @param  File. File to load
+     * @param wcontext. WorkbenchContext
+     * @param extension. extension of the file, eg. "tif"
+     * @throws Exception
+     */
+    public static void loadImageAsLayer(File file, WorkbenchContext wcontext,
+            String extension) throws Exception {
+
+        final Registry registry = wcontext.getRegistry();
+        @SuppressWarnings("unchecked")
+        final List<FileLayerLoader> loaders = registry
+                .getEntries(FileLayerLoader.KEY);
+        FileLayerLoader loader = null;
+        for (final FileLayerLoader fileLayerLoader : loaders) {
+            if (fileLayerLoader instanceof GeoImageFactoryFileLayerLoader) {
+                loader = fileLayerLoader;
+            }
+        }
+        final URI uri = file.toURI();
+        final Map<String, Object> dp = new HashMap<String, Object>();
+        dp.put(DataSource.URI_KEY, uri.toString());
+        //  dp.put(DataSource.FILE_KEY, outFile);
+        dp.put(ImageryLayerDataset.ATTR_TYPE, extension);
+        // dp.put(wcontext.getLayerManager()., StandardCategoryNames.WORKING);
+        loader.open(null, uri, dp);
+    }
+
+    /**
+     * Save a BufferedImage and envelope to GeoTIFF file.
+     * cellsize is calculate from parameters (raster and envelope)
+     * nodata is set to SAGA standard value (-99999.00)
+     * compression is set to packbits
+     * @param java.awt.image.BufferedImage
+     * @param com.vividsolutions.jts.geom.Envelope
+     * @param outFile
+     * @throws IOException
+     */
+    public static void saveGeoTIFF(BufferedImage image, Envelope envelope,
+            File file) throws IOException {
+
+        final double nodata = -99999.00;
+        final double cellSizeX = envelope.getWidth() / image.getWidth();
+        final double cellSizeY = envelope.getHeight() / image.getHeight();
+        saveGeoTIFF(image, envelope, cellSizeX, cellSizeY,
+                TIFFEncodeParam.COMPRESSION_PACKBITS, nodata, file);
+
+    }
+
+    /**
+     * Save a given BufferedImage and envelope to GeoTIFF file, giving nodata 
value, x and y values of 
+     * cell size and compsession
+     * @param java.awt.image.BufferedImage
+     * @param com.vividsolutions.jts.geom.Envelope
+     * @param cellsizex. Double cell size in x direction
+     * @param cellsizey. Double cell size in y direction
+     * @param nodata. Double nodata value
+     * @param compsession. Integer, see  
com.sun.media.jai.codec.TIFFEncodeParam
+     * @param file. Output file
+     * @throws IOException
+     */
+    public static void saveGeoTIFF(BufferedImage image, Envelope envelope,
+            double cellsizex, double cellsizey, int compression, double nodata,
+            File file) {
+        try {
+            final FileOutputStream tifOut = new FileOutputStream(file);
+            final TIFFEncodeParam param = new TIFFEncodeParam();
+            param.setCompression(compression);
+            final TIFFField[] tiffFields = new TIFFField[3];
+            tiffFields[0] = new TIFFField(GeoTiffConstants.ModelPixelScaleTag,
+                    TIFFField.TIFF_DOUBLE, 2, new double[] { cellsizex,
+                            cellsizey });
+            final String noDataS = Double.toString(nodata);
+            final byte[] bytes = noDataS.getBytes();
+            tiffFields[1] = new TIFFField(TiffTags.TIFFTAG_GDAL_NODATA,
+                    TIFFField.TIFF_BYTE, noDataS.length(), bytes);
+            tiffFields[2] = new TIFFField(GeoTiffConstants.ModelTiepointTag,
+                    TIFFField.TIFF_DOUBLE, 6, new double[] { 0, 0, 0,
+                            envelope.getMinX(), envelope.getMaxY(), 0 });
+            param.setExtraFields(tiffFields);
+            final TIFFImageEncoder encoder = (TIFFImageEncoder) TIFFCodec
+                    .createImageEncoder("tiff", tifOut, param);
+
+            encoder.encode(image);
+            tifOut.flush();
+            FileUtil.close(tifOut);
+
+        } catch (final Exception e) {
+            ;
+        }
+    }
+
 }



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to