Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.plugin / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.mainplugin / src / main / java / org / gvsig / raster / tools / app / mainplugin / HistogramExtension.java @ 43876

History | View | Annotate | Download (14.5 KB)

1
package org.gvsig.raster.tools.app.mainplugin;
2

    
3
import java.awt.Color;
4
import java.awt.Dimension;
5
import java.awt.event.ItemEvent;
6
import java.awt.event.ItemListener;
7
import java.util.ArrayList;
8
import java.util.List;
9

    
10
import javax.swing.JComboBox;
11
import javax.swing.JOptionPane;
12
import javax.swing.event.AncestorEvent;
13
import javax.swing.event.AncestorListener;
14

    
15
import org.apache.commons.lang3.StringUtils;
16
import org.cresques.cts.ICoordTrans;
17
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
19

    
20
import org.gvsig.andami.IconThemeHelper;
21
import org.gvsig.andami.plugins.Extension;
22
import org.gvsig.app.ApplicationLocator;
23
import org.gvsig.app.ApplicationManager;
24
import org.gvsig.app.project.documents.view.ViewDocument;
25
import org.gvsig.app.project.documents.view.gui.IView;
26
import org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.exception.ReadException;
28
import org.gvsig.fmap.dal.raster.BandDescriptor;
29
import org.gvsig.fmap.dal.raster.RasterQuery;
30
import org.gvsig.fmap.dal.raster.RasterStore;
31
import org.gvsig.fmap.geom.Geometry;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.fmap.mapcontext.ViewPort;
34
import org.gvsig.fmap.mapcontext.events.ColorEvent;
35
import org.gvsig.fmap.mapcontext.events.ExtentEvent;
36
import org.gvsig.fmap.mapcontext.events.ProjectionEvent;
37
import org.gvsig.fmap.mapcontext.events.listeners.ViewPortListener;
38
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException;
39
import org.gvsig.fmap.mapcontext.layers.FLayer;
40
import org.gvsig.fmap.mapcontext.layers.FLayers;
41
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
42
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
43
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingLocator;
44
import org.gvsig.fmap.mapcontext.raster.swing.MapContextRasterSwingManager;
45
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendChangedEvent;
46
import org.gvsig.fmap.mapcontext.rendering.legend.events.listeners.LegendListener;
47
import org.gvsig.fmap.mapcontrol.MapControl;
48
import org.gvsig.raster.lib.buffer.api.Buffer;
49
import org.gvsig.raster.lib.buffer.api.statistics.Statistics;
50
import org.gvsig.raster.lib.legend.api.RasterLegend;
51
import org.gvsig.raster.lib.legend.api.colorinterpretation.ColorInterpretation;
52
import org.gvsig.raster.swing.buffer.RasterSwingBufferLocator;
53
import org.gvsig.raster.swing.buffer.RasterSwingBufferManager;
54
import org.gvsig.raster.swing.buffer.SelectableBandsTableModel;
55
import org.gvsig.raster.swing.buffer.exceptions.RasterCreatingPanelException;
56
import org.gvsig.raster.swing.buffer.histogram.HistogramPanel;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.i18n.I18nManager;
59
import org.gvsig.tools.swing.api.ToolsSwingLocator;
60
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
61
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
62

    
63
/**
64
 *
65
 * @author fdiaz
66
 *
67
 */
68
public class HistogramExtension extends Extension {
69

    
70
    private static final Logger logger = LoggerFactory.getLogger(HistogramExtension.class);
71

    
72
    @Override
73
    public void initialize() {
74
        IconThemeHelper.registerIcon("action", "layer-histogram", this);
75
    }
76

    
77
    @Override
78
    public void execute(String actionCommand) {
79

    
80
        if (StringUtils.equalsIgnoreCase(actionCommand, "histogram")) {
81
            IView view = getActiveView();
82
            MapControl mapControl = view.getMapControl();
83
            FLayer[] layers = mapControl.getMapContext().getLayers().getActives();
84
            if (layers[0] instanceof RasterLayer) {
85
                final RasterLayer layer = (RasterLayer) layers[0];
86

    
87
                WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
88
                RasterSwingBufferManager manager = RasterSwingBufferLocator.getSwingManager();
89
                I18nManager i18nManager = ToolsLocator.getI18nManager();
90

    
91
                final HistogramPanel panel;
92
                try {
93
                    panel = (HistogramPanel) manager.createHistogramPanel();
94
                    panel.asJComponent().setPreferredSize(new Dimension(650, 520));
95
                    panel.set(layer.getStatistics(null));
96
                    panel.setEnabledVisibleStatistics(true);
97

    
98
                    final RasterStore store = layer.getRasterStore();
99
                    List<BandDescriptor> descriptors = new ArrayList<BandDescriptor>();
100
                    for (int i = 0; i < store.getBands(); i++) {
101
                        descriptors.add(layer.getRasterStore().getBandDescriptor(i));
102
                    }
103

    
104

    
105
//                    try {
106
//                        final RasterLegend legend = ((RasterLegend) layer.getLegend());
107
//                        //FIXME: Parece que la RasterLegend no lanza eventos de ContentsChanged.
108
//                        //Cuando lo haga, eliminar esta l?nea;
109
//                        updateColors(panel, store, legend);
110

    
111
//                        legend.addLegendListener(new LegendContentsChangedListener() {
112
//
113
//                            @Override
114
//                            public boolean symbolChanged(SymbolLegendEvent e) {
115
//                                updateColors(panel, store, legend);
116
//                                return true;
117
//                            }
118
//
119
//                            @Override
120
//                            public void legendCleared(LegendClearEvent event) {
121
//                                updateColors(panel, store, legend);
122
//                            }
123
//                        });
124

    
125

    
126
                        ((FLyrDefault) layer).addLegendListener(new LegendListener() {
127
                            @Override
128
                            public void legendChanged(LegendChangedEvent e) {
129
                                updateColors(panel, store, (RasterLegend)e.getNewLegend());
130
                            }
131
                        });
132
//                    } catch (LegendLayerException e) {
133
//                        logger.warn("Can't get layer's legend.", e);
134
//                    }
135

    
136

    
137
                    MapContextRasterSwingManager rasterSwingManager = MapContextRasterSwingLocator.getSwingManager();
138
                    SelectableBandsTableModel tableModel =
139
                        rasterSwingManager.createSelectableBandDescriptorsTableModel(descriptors);
140
                    panel.set(tableModel);
141
                    final ViewPort viewPort = mapControl.getViewPort();
142
                    final ViewPortListener viewPortListener = new ViewPortListener() {
143

    
144
                        @Override
145
                        public void projectionChanged(ProjectionEvent e) {
146
                            doUpdateViewPort(panel, layer, viewPort);
147
                        }
148
                        @Override
149
                        public void extentChanged(ExtentEvent e) {
150
                            doUpdateViewPort(panel, layer, viewPort);
151
                        }
152
                        @Override
153
                        public void backColorChanged(ColorEvent e) {
154
                            // Do nothing
155
                        }
156
                    };
157

    
158
                    panel.addChangeItemSourceListener(new ItemListener() {
159
                        @Override
160
                        public void itemStateChanged(ItemEvent event) {
161
                            if (event.getStateChange() == ItemEvent.SELECTED) {
162
//                                // FIXME: Parece que la RasterLegend no lanza
163
//                                // eventos de ContentsChanged.
164
//                                // Cuando lo haga, todo el bloque try-catch siguiente
165
//                                try {
166
//                                    RasterLegend legend = ((RasterLegend) layer.getLegend());
167
//                                    updateColors(panel, store, legend);
168
//                                } catch (LegendLayerException e) {
169
//                                    logger.warn("Can't get layer's legend.", e);
170
//                                }
171

    
172

    
173
                                int selectedIndex = ((JComboBox<?>) (event.getSource())).getSelectedIndex();
174
                                if (selectedIndex == 0) {
175
                                    viewPort.removeViewPortListener(viewPortListener);
176
                                } else if (selectedIndex == 1) {
177
                                    viewPort.addViewPortListener(viewPortListener);
178
                                    doUpdateViewPort(panel, layer, viewPort);
179
                                }
180
                            }
181
                        }
182
                    });
183

    
184
                    panel.asJComponent().addAncestorListener(new AncestorListener() {
185
                        @Override
186
                        public void ancestorRemoved(AncestorEvent event) {
187
                            viewPort.removeViewPortListener(viewPortListener);
188
                        }
189
                        @Override
190
                        public void ancestorMoved(AncestorEvent event) {
191
                            // Do nothing
192
                        }
193
                        @Override
194
                        public void ancestorAdded(AncestorEvent event) {
195
                            // Do nothing
196
                        }
197
                    });
198
                } catch (RasterCreatingPanelException e2) {
199
                    logger.error("Error creating panel", e2);
200
                    JOptionPane.showMessageDialog(null,
201
                        new StringBuilder().append(i18nManager.getTranslation("error_creating_panel")).append(":")
202
                            .append(e2.getLocalizedMessage()), i18nManager.getTranslation("error"),
203
                        JOptionPane.ERROR_MESSAGE);
204
                    return;
205
                }
206

    
207
                winManager.showWindow(panel.asJComponent(),
208
                    i18nManager.getTranslation("Histogram") + ": " + layer.getName(), WindowManager.MODE.WINDOW);
209
            }
210
        }
211
    }
212

    
213
    /**
214
     * @param panel
215
     * @param store
216
     * @param legend
217
     */
218
    private void updateColors(final HistogramPanel panel, RasterStore store, RasterLegend legend) {
219
        Color[] colorBands = new Color[store.getBands()];
220
        ColorInterpretation colorInterpretations = legend.getColorInterpretation();
221
        if (colorInterpretations != null) {
222
            for (int i = 0; i < store.getBands(); i++) {
223
                switch (colorInterpretations.get(i)) {
224
                case ColorInterpretation.RED_BAND:
225
                    colorBands[i] = Color.red;
226
                    break;
227
                case ColorInterpretation.GREEN_BAND:
228
                    colorBands[i] = Color.green;
229
                    break;
230
                case ColorInterpretation.BLUE_BAND:
231
                    colorBands[i] = Color.blue;
232
                    break;
233
                case ColorInterpretation.ALPHA_BAND:
234
                    colorBands[i] = Color.lightGray;
235
                    break;
236
                case ColorInterpretation.GRAY_BAND:
237
                    colorBands[i] = Color.darkGray;
238
                    break;
239
                case ColorInterpretation.CYAN_BAND:
240
                    colorBands[i] = Color.cyan;
241
                    break;
242
                case ColorInterpretation.MAGENTA_BAND:
243
                    colorBands[i] = Color.magenta;
244
                    break;
245
                case ColorInterpretation.YELLOW_BAND:
246
                    colorBands[i] = Color.yellow;
247
                    break;
248
                case ColorInterpretation.BLACK_BAND:
249
                    colorBands[i] = Color.black;
250
                    break;
251
                default:
252
                    colorBands[i] = Color.orange;
253
                    break;
254
                }
255
            }
256
            panel.setBandColors(colorBands);
257
        }
258
    }
259

    
260
    protected void doUpdateViewPort(HistogramPanel panel, RasterLayer layer, ViewPort viewPort) {
261
        logger.info("UPDATING VIEWPORT");
262
        if (panel.isEnabledVisibleStatistics()) {
263

    
264
            Envelope envelope = viewPort.getAdjustedEnvelope();
265
            Statistics statistics;
266
            Envelope layerEnvelope;
267
            try {
268
                layerEnvelope = layer.getFullEnvelope();
269
            } catch (ReadException e1) {
270
                logger.warn("Can't get layer's envelope.", e1);
271
                return;
272
            }
273
            if (envelope.contains(layerEnvelope)) {
274
                statistics = layer.getStatistics(null);
275
                panel.setVisibleStatistics(statistics);
276
            } else {
277
                if (envelope.intersects(layerEnvelope)) {
278

    
279
                    RasterStore rasterStore = layer.getRasterStore();
280
                    RasterQuery query = rasterStore.createRasterQuery();
281
                    ICoordTrans ct = layer.getCoordTrans();
282
                    Geometry geom = envelope.getGeometry();
283
                    if (ct != null) {
284
                        geom.reProject(ct.getInverted());
285
                    }
286
                    Envelope reprojectedEnvelope = geom.getEnvelope();
287

    
288
                    double pixelSize = reprojectedEnvelope.getLength(0) / (double) viewPort.getImageWidth();
289
                    query.setPixelSize(pixelSize);
290

    
291
                    query.setClip(reprojectedEnvelope);
292
                    Buffer buffer = null;
293
                    try {
294
                        buffer = rasterStore.getRasterSet(query);
295
                    } catch (DataException e) {
296
                        logger.warn("Can't create rasterSet from envelope", e);
297
                        return;
298
                    }
299
                    statistics = buffer.getStatistics(null);
300
                    panel.setVisibleStatistics(statistics);
301
                } else {
302
                    panel.setVisibleStatistics(null);
303
                }
304
            }
305
        }
306
    }
307

    
308
    @Override
309
    public boolean isEnabled() {
310
        IView view = getActiveView();
311
        if (view != null) {
312
            ViewDocument viewDocument = view.getViewDocument();
313
            FLayer[] layers = viewDocument.getMapContext().getLayers().getActives();
314
            if (layers.length == 1 && layers[0] instanceof RasterLayer) {
315
                return true;
316
            }
317
        }
318
        return false;
319
    }
320

    
321
    @Override
322
    public boolean isVisible() {
323
        IView view = getActiveView();
324
        if (view != null) {
325
            ViewDocument viewDocument = view.getViewDocument();
326
            FLayers layers = viewDocument.getMapContext().getLayers();
327
            for (FLayer fLayer : layers) {
328
                if (fLayer instanceof RasterLayer) {
329
                    return true;
330
                }
331
            }
332
        }
333
        return false;
334

    
335
    }
336

    
337
    private IView getActiveView() {
338
        ApplicationManager application = ApplicationLocator.getManager();
339
        IView view = (IView) application.getActiveComponent(ViewDocument.class);
340
        return view;
341
    }
342

    
343
}