Revision: 5934
http://sourceforge.net/p/jump-pilot/code/5934
Author: ma15569
Date: 2018-08-28 12:48:05 +0000 (Tue, 28 Aug 2018)
Log Message:
-----------
Reactivated Raster Legend plugin with option to save legend to image
Modified Paths:
--------------
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java
Added Paths:
-----------
core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
Added:
core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
(rev 0)
+++ core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
2018-08-28 12:48:05 UTC (rev 5934)
@@ -0,0 +1,383 @@
+package org.openjump.core.rasterimage.styler;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.image.BufferedImage;
+import java.awt.image.Raster;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.TreeMap;
+
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JLayeredPane;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+
+import org.apache.log4j.Logger;
+import org.openjump.core.apitools.LayerTools;
+import org.openjump.core.rasterimage.RasterImageLayer;
+import org.openjump.core.rasterimage.RasterSymbology;
+import org.openjump.core.rasterimage.styler.ui.ColorsLabelLegendComponent;
+import org.openjump.core.rasterimage.styler.ui.GradientLabelLegendComponent;
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+import org.openjump.core.ui.plugin.layer.pirolraster.RasterImageContextMenu;
+import org.openjump.core.ui.swing.DetachableInternalFrame;
+
+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.jump.I18N;
+import com.vividsolutions.jump.task.TaskMonitor;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.WorkbenchContext;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
+import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
+import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.plugin.ThreadedPlugIn;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+
+/**
+ * Plugin for displaying the raster (ASC, FLT formats) legend. The menu is
+ * actived only if a raster layer is selected.
+ *
+ * [Giuseppe Aruta 28/08/2018] Reactivated with option to save legend to image
+ * TODO Internazionalize
+ *
+ * @author GeomaticaEAmbiente
+ */
+public class RasterLegendPlugIn implements ThreadedPlugIn {
+
+ private final String sSaved = I18N
+
.get("org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.file.saved");
+ private final String sShowLegend = I18N
+ .get("org.openjump.core.ui.plugin.style");
+ private final String SCouldNotSave = I18N
+
.get("org.openjump.sextante.gui.additionalResults.AdditionalResultsPlugIn.Could-not-save-selected-result");
+ private final String SAVE = I18N
+ .get("deejump.plugin.SaveLegendPlugIn.Save");
+ private final String CLOSE = I18N
+ .get("ui.plugin.imagery.ImageLayerManagerDialog.Close");
+
+ @Override
+ public void initialize(PlugInContext context) throws Exception {
+
+ /* Add item to pop-up menu, only for rasters */
+ final JPopupMenu menu = RasterImageContextMenu.getInstance(context);
+ context.getFeatureInstaller().addPopupMenuPlugin(menu, this, getName(),
+ false, null, createEnableCheck(context.getWorkbenchContext()));
+
+ }
+
+ JScrollPane scrollPane = new JScrollPane();
+ WorkbenchContext wcontext = JUMPWorkbench.getInstance().getContext();
+
+ public static RasterImageLayer rasterImageLayer = new RasterImageLayer();
+
+ public static RasterImageLayer getLayer() {
+ return rasterImageLayer;
+
+ }
+
+ @Override
+ public boolean execute(PlugInContext context) throws Exception {
+
+ rasterImageLayer = (RasterImageLayer) LayerTools.getSelectedLayerable(
+ context, RasterImageLayer.class);
+
+ final RasterSymbology rasterStyler = rasterImageLayer.getSymbology();
+
+ if (rasterStyler.getColorMapEntries_tm().size() > 40) {
+ JOptionPane.showMessageDialog(context.getWorkbenchFrame(),
+ // bundle.getString("LegendDialog.More40Colors.message"),
+ "More than 40 colors", RasterStylesExtension.extensionName,
+ JOptionPane.INFORMATION_MESSAGE);
+ return false;
+ }
+
+ final TreeMap<Double, Color> colorMapEntries = rasterStyler
+ .getColorMapEntries_tm();
+
+ final String type = RasterLegendPlugIn.getLayer().getSymbology()
+ .getColorMapType();
+
+ if (type.equals(RasterSymbology.TYPE_INTERVALS)
+ || type.equals(RasterSymbology.TYPE_SINGLE)) {
+ scrollPane = new JScrollPane(getPanelInterval(colorMapEntries,
+ rasterImageLayer),
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+ } else if (type.equals(RasterSymbology.TYPE_RAMP)) {
+ scrollPane = new JScrollPane(getPanelGradient(colorMapEntries,
+ rasterImageLayer),
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+
+ }
+
+ scrollPane.setPreferredSize(new Dimension(300, 400));
+ final JPanel panel = new JPanel();
+ panel.setLayout(new BorderLayout());
+ panel.add(scrollPane, BorderLayout.CENTER);
+ panel.setPreferredSize(scrollPane.getPreferredSize());
+ final DetachableInternalFrame frame = new DetachableInternalFrame();
+ frame.setTitle(getName() + " (" + rasterImageLayer.getName() + ")");
+ frame.setResizable(true);
+ frame.setClosable(true);
+ frame.setIconifiable(true);
+ frame.setMaximizable(true); // frame.setFrameIcon(ICON);
+ frame.setSize(300, 500);
+ frame.setLayer(JLayeredPane.PALETTE_LAYER);
+
+ frame.add(panel, BorderLayout.NORTH);
+
+ final JPanel okPanel = new JPanel();
+ final JButton saveButton = new JButton(SAVE) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(100, 25);
+ }
+ };
+
+ final JButton closeButton = new JButton(CLOSE) {
+ private static final long serialVersionUID = 2L;
+
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(100, 25);
+ }
+ };
+
+ saveButton.addActionListener(new java.awt.event.ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ save(scrollPane, rasterImageLayer);
+ // frame.dispose();
+ return;
+ }
+ });
+
+ closeButton.addActionListener(new java.awt.event.ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ frame.dispose();
+
+ return;
+ }
+ });
+
+ okPanel.add(saveButton, BorderLayout.WEST);
+ okPanel.add(closeButton, BorderLayout.EAST);
+
+ frame.add(okPanel, BorderLayout.SOUTH);
+ frame.pack();
+ context.getWorkbenchFrame().addInternalFrame(frame, true, true);
+
+ return true;
+
+ }
+
+ @Override
+ public void run(TaskMonitor monitor, PlugInContext context)
+ throws Exception {
+ }
+
+ private JPanel getPanelInterval(TreeMap<Double, Color> colorMapEntry_tm,
+ RasterImageLayer rLayer) throws Exception {
+
+ final ColorsLabelLegendComponent component = new
ColorsLabelLegendComponent(
+ colorMapEntry_tm, rLayer.getNoDataValue(), rLayer.getName());
+ component.setPreferredSize(new Dimension(200, 400));
+
+ final JPanel panel = new JPanel(new BorderLayout());
+ panel.add(component);
+ panel.setVisible(true);
+
+ return panel;
+
+ }
+
+ private JPanel getPanelGradient(TreeMap<Double, Color> colorMapEntry,
+ RasterImageLayer rLayer) throws Exception {
+
+ final GradientLabelLegendComponent component = new
GradientLabelLegendComponent(
+ colorMapEntry, rLayer.getNoDataValue(), rLayer.getName());
+ component.setPreferredSize(new Dimension(200, 400));
+ final JPanel panel = new JPanel(new BorderLayout());
+ panel.add(component);
+ panel.setVisible(true);
+
+ return panel;
+
+ }
+
+ @Override
+ public String getName() {
+ return sShowLegend;
+ }
+
+ public Icon getIcon() {
+ return null;
+ }
+
+ public static MultiEnableCheck createEnableCheck(
+ final WorkbenchContext workbenchContext) {
+
+ final MultiEnableCheck multiEnableCheck = new MultiEnableCheck();
+ final EnableCheckFactory checkFactory = new EnableCheckFactory(
+ workbenchContext);
+ multiEnableCheck.add(checkFactory
+ .createWindowWithLayerNamePanelMustBeActiveCheck());
+ multiEnableCheck.add(checkFactory
+ .createExactlyNLayerablesMustBeSelectedCheck(1,
+ RasterImageLayer.class));
+ multiEnableCheck.add(checkFactory
+ .createRasterImageLayerExactlyNBandsMustExistCheck(1));
+ return multiEnableCheck;
+ }
+
+ public void save(JScrollPane pane, RasterImageLayer rLayer) {
+ FileNameExtensionFilter filter;
+ final JPanel panel = (JPanel) pane.getViewport().getView();
+ final int w = panel.getWidth();
+ final int h = panel.getHeight();
+ final BufferedImage bi = new BufferedImage(w, h,
+ BufferedImage.TYPE_INT_RGB);
+ final Graphics2D g = bi.createGraphics();
+ panel.paint(g);
+
+ filter = new FileNameExtensionFilter("Portable Network Graphics (png)",
+ "png");
+ final JFileChooser fc = new GUIUtil.FileChooserWithOverwritePrompting(
+ "png");
+
+ fc.setFileFilter(filter);
+ fc.addChoosableFileFilter(filter);
+ final int returnVal = fc.showSaveDialog(JUMPWorkbench.getInstance()
+ .getFrame());
+ fc.getWidth();
+ fc.getHeight();
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ try {
+ final File file = new File(fc.getSelectedFile() + "-legend"
+ + ".png");
+ ImageIO.write(bi, "png", file);
+
+ saved(file);
+ } catch (final Exception e) {
+ notsaved();
+ Logger(this.getClass(), e);
+ }
+ }
+ }
+
+ public double cellSizeX(Raster r, Envelope env) throws IOException {
+ return env.getWidth() / r.getWidth();
+ }
+
+ public double cellSizeY(Raster r, Envelope env) throws IOException {
+ return env.getHeight() / r.getHeight();
+ }
+
+ public static BufferedImage joinBufferedImage(BufferedImage img1,
+ BufferedImage img2) {
+
+ // do some calculate first
+ final int offset = 5;
+ final int wid = img1.getWidth() + img2.getWidth() + offset;
+ final int height = Math.max(img1.getHeight(), img2.getHeight())
+ + offset;
+ // create a new buffer and draw two image into the new image
+ final BufferedImage newImage = new BufferedImage(wid, height,
+ BufferedImage.TYPE_INT_ARGB);
+ final Graphics2D g2 = newImage.createGraphics();
+ final Color oldColor = g2.getColor();
+ // fill background
+ g2.setPaint(Color.WHITE);
+ g2.fillRect(0, 0, wid, height);
+ // draw image
+ g2.setColor(oldColor);
+ g2.drawImage(img1, null, 0, 0);
+ g2.drawImage(img2, null, img1.getWidth() + offset, 0);
+ g2.dispose();
+ return newImage;
+ }
+
+ public static void Logger(Class<?> plugin, Exception e) {
+ final Logger LOG = Logger.getLogger(plugin);
+ JUMPWorkbench
+ .getInstance()
+ .getFrame()
+ .warnUser(
+ plugin.getSimpleName() + " Exception: " +
e.toString());
+ LOG.error(plugin.getName() + " Exception: ", e);
+ }
+
+ protected void saved(File file) {
+ JUMPWorkbench.getInstance().getFrame()
+ .setStatusMessage(sSaved + " :" + file.getAbsolutePath());
+ }
+
+ protected void notsaved() {
+ JOptionPane.showMessageDialog(null, SCouldNotSave, I18N.get(getName()),
+ JOptionPane.WARNING_MESSAGE);
+ }
+
+ /**
+ * Export an image to GeoTIFF file
+ *
+ * @param outFileName
+ * output file name, ex C:/folder/filename.tif
+ * @param layer
+ * input raster layer. Needed to calculate cell size, envelope
+ * and no data
+ * @param image
+ * BufferedImage to save
+ * @return
+ */
+ private boolean exportToGeoTIFFFile(String sFilename, double cellsizeX,
+ double cellsizeY, double nodata, Envelope envelope,
+ BufferedImage image) {
+ try {
+ final FileOutputStream tifOut = new FileOutputStream(sFilename);
+ final TIFFEncodeParam param = new TIFFEncodeParam();
+ param.setCompression(1);
+ final TIFFField[] tiffFields = new TIFFField[3];
+
+ tiffFields[0] = new TIFFField(33550, 12, 2, new double[] {
+ cellsizeX, cellsizeY });
+ final String noDataS = Double.toString(nodata);
+ final byte[] bytes = noDataS.getBytes();
+ tiffFields[1] = new TIFFField(42113, 1, noDataS.length(), bytes);
+
+ tiffFields[2] = new TIFFField(33922, 12, 6, new double[] { 0.0D,
+ 0.0D, 0.0D, envelope.getMinX(), envelope.getMaxY(), 0.0D
});
+ param.setExtraFields(tiffFields);
+ final TIFFImageEncoder encoder = (TIFFImageEncoder) TIFFCodec
+ .createImageEncoder("tiff", tifOut, param);
+ encoder.encode(image);
+ tifOut.close();
+
+ } catch (final Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+}
Property changes on:
core/trunk/src/org/openjump/core/rasterimage/styler/RasterLegendPlugIn.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified:
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java
===================================================================
---
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java
2018-08-28 12:46:05 UTC (rev 5933)
+++
core/trunk/src/org/openjump/core/rasterimage/styler/RasterStylesExtension.java
2018-08-28 12:48:05 UTC (rev 5934)
@@ -7,13 +7,13 @@
@Override
public void configure(PlugInContext pic) throws Exception {
-
+
new RasterStylesPlugIn().initialize(pic);
-
+ new RasterLegendPlugIn().initialize(pic);
+
}
-
+
public static final String extensionName = "Raster Styles";
public static final String suffixBlackBKey = "_Styles";
-
+
}
-
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel