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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel