Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / templates / examples / org.gvsig.raster.roimask / org.gvsig.raster.roimask.app / org.gvsig.raster.roimask.app.client / src / main / java / org / gvsig / raster / roimask / app / ROIMaskPreview.java @ 1908

History | View | Annotate | Download (7.24 KB)

1
package org.gvsig.raster.roimask.app;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.geom.Rectangle2D;
5
import java.awt.image.BufferedImage;
6
import java.io.File;
7
import java.util.ArrayList;
8
import java.util.HashMap;
9
import java.util.List;
10

    
11
import org.gvsig.fmap.dal.coverage.RasterLocator;
12
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
13
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
14
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
15
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
16
import org.gvsig.fmap.dal.coverage.exception.ROIException;
17
import org.gvsig.fmap.dal.coverage.grid.ROI;
18
import org.gvsig.fmap.dal.coverage.grid.render.ImageDrawer;
19
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
20
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
21
import org.gvsig.raster.fmap.layers.FLyrRaster;
22
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
23
import org.gvsig.raster.roimask.app.ROIMaskExtension.LayerElement;
24
import org.gvsig.raster.roimask.swing.ROIMaskData;
25
import org.gvsig.raster.swing.preview.DataSourcePreview;
26
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
27
import org.gvsig.raster.algorithm.process.ProcessException;
28
import org.gvsig.raster.algorithm.process.RasterProcess;
29
import org.gvsig.tools.task.Cancellable;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

    
33
@SuppressWarnings("deprecation")
34
public class ROIMaskPreview implements DataSourcePreview {
35
        private FLyrRaster              inputLyr          = null;
36
        private Extent                  bbox              = null;
37
        private ROIMaskData             data              = null;
38
        private static final Logger     logger            = LoggerFactory.getLogger(ROIMaskPreview.class);
39
        
40
        
41
        public void setData(ROIMaskData data) {
42
                this.data = data;
43
                loadLayers();
44
        }
45
        
46
        private void loadLayers() {
47
                if(data == null)
48
                        return;
49
                Object obj = data.getInputLayer();
50
                if(obj != null)
51
                        inputLyr = (FLyrRaster)((LayerElement)data.getInputLayer()).getLayer();
52
                if(inputLyr != null)
53
                        bbox = inputLyr.getFullRasterExtent();                
54
        }
55
        
56
        public void closePreviewLayer() {
57
                
58
        }
59

    
60
        public double getCellSize() {
61
                if(inputLyr != null)
62
                        return inputLyr.getDataStore().getCellSize();
63
                return 1;
64
        }
65
        
66
        public DataSourcePreview cloneDataSourcePreview() {
67
                return this;
68
        }
69

    
70
        public void popStatus() {
71
        }
72

    
73
        public void pushStatus() {
74
        }
75
        
76
        public void draw(BufferedImage image, Graphics2D g, double[] coords, int w, int h, Cancellable cancel, double scale) throws ImageUnavailableException {
77
                //Posici?n de inicio dibujado dentro del Graphics
78
                int x = 0;
79
                int y = 0;
80
                //Coordenadas de la petici?n
81
                double iniX = coords[0];
82
                double iniY = coords[1];
83
                double endX = coords[2];
84
                double endY = coords[3];
85
                
86
                //Se ajustan las coordenadas de petici?n, ancho y alto en coordenadas p?xel, 
87
                //as? como la coordenada de inicio de dibujado 
88
                if(bbox.getULX() > coords[0]) {
89
                        iniX = bbox.getULX();
90
                        x = (int)(((iniX - coords[0]) * w) / Math.abs(coords[2] - coords[0]));
91
                }
92
                                
93
                if(bbox.getULY() < coords[1]) {
94
                        iniY = bbox.getULY();
95
                        y = (int)(((coords[1] - iniY) * h) / Math.abs(coords[3] - coords[1]));
96
                }
97
                
98
                if(bbox.getLRX() < coords[2]) 
99
                        endX = bbox.getLRX();
100
                
101
                if(bbox.getLRY() > coords[3]) 
102
                        endY = bbox.getLRY();
103
                
104
                if(iniX != coords[0] || endX != coords[2]) {
105
                        w = (int)((Math.abs(endX - iniX) * w) / Math.abs(coords[2] - coords[0]));
106
                }
107
                
108
                if(iniY != coords[1] || endY != coords[3]) {
109
                        h = (int)((Math.abs(iniY - endY) * h) / Math.abs(coords[3] - coords[1]));
110
                }
111
                
112
                Extent ext = RasterLocator.getManager().getDataStructFactory().createExtent(iniX, iniY, endX, endY);
113
                BufferedImage img = throwProcess(ext, w, h);
114
                g.drawImage(img, x, y, null);
115
        }
116
        
117
        /**
118
         * Throws the process sequentially. Since the preview is small,
119
         * it should not taken a lot of time
120
         * is small
121
         * @param ext
122
         * @param w
123
         * @param h
124
         * @return
125
         */
126
        @SuppressWarnings("unchecked")
127
        private BufferedImage throwProcess(Extent ext, int w, int h) {
128
                loadLayers();
129
                
130
                RasterProcess task;
131
                try {
132
                        task = RasterBaseAlgorithmLibrary.getManager().createRasterTask("ROIMaskProcess");
133
                        task.addParam(ROIMaskProcess.RASTER_STORE1, inputLyr.getDataStore());
134
                        task.addParam(ROIMaskProcess.TEST_EXTENT, ext);
135
                        task.addParam(ROIMaskProcess.TEST_WIDTH, w);
136
                        task.addParam(ROIMaskProcess.TEST_HEIGHT, h);
137
                        task.addParam(ROIMaskProcess.ROIS, getROIsSelected());
138
                        task.addParam(ROIMaskProcess.ALPHA, data.getAlpha());
139
                        task.addParam(ROIMaskProcess.INVERSE, data.isInverse());
140
                        task.addParam(ROIMaskProcess.NODATA, getNoDataSelected());
141
                        task.addParam(ROIMaskProcess.EXPORT, false);
142
                } catch (ProcessException e1) {
143
                        e1.printStackTrace();
144
                        return null;
145
                } catch (ROIException e) {
146
                        e.printStackTrace();
147
                        return null;
148
                }
149
                
150
                task.init();
151
                try {
152
                        task.process();
153
                } catch (ProcessInterruptedException e1) {
154
                        return null;
155
                } catch (ProcessException e) {
156
                        logger.debug("Error in process");
157
                        return null;
158
                }
159
                
160
                HashMap<String, Object> map = (HashMap<String, Object>)task.getResult();
161
                Buffer buf = (Buffer)map.get(ROIMaskProcess.BUFFER);
162
                Buffer alphaBand = (Buffer)map.get(ROIMaskProcess.ALPHA_BAND);
163
                buf.setDataExtent(ext.toRectangle2D());
164
                if(buf.getBandCount() == 1) {
165
                        buf.replicateBand(0, 1);
166
                        buf.replicateBand(0, 2);
167
                }
168
                Transparency transparency = RasterLocator.getManager().getDataStructFactory().createTransparency();
169
                if(alphaBand != null) {
170
                        transparency.setAlphaBand(alphaBand);
171
                        transparency.activeTransparency();
172
                }
173
                
174
                ImageDrawer drawer = RasterLocator.getManager().createImageDrawerService();
175
                drawer.setBuffer(buf);
176
                drawer.setLastTransparency(transparency);
177
                try {
178
                        if(inputLyr.getDataStore().getDataType()[0] != Buffer.TYPE_BYTE)
179
                                drawer.addEnhanced(inputLyr.getDataStore().getStatistics(), true, 0.2);
180
                        return (BufferedImage)drawer.drawBufferOverImageObject();
181
                } catch (ProcessInterruptedException e) {
182
                        return null;
183
                } 
184
    }
185
        
186
        private NoData getNoDataSelected() {
187
                NoData nodata = RasterLocator.getManager().getDataStructFactory().createDefaultNoData(
188
                                inputLyr.getDataStore().getBandCount(), inputLyr.getDataStore().getDataType()[0]);
189
                nodata.setValue(data.getValueNoData());
190
                return nodata;
191
        }
192
        
193
        private ROI[] getROIsSelected() throws ROIException {
194
                List<ROI> roi = inputLyr.getRois();
195
                boolean[] roisSelected = data.getROIsSelected();
196
                List<ROI> roisToDraw = new ArrayList<ROI>(); 
197
                for (int i = 0; i < roisSelected.length; i++) {
198
                        if(roisSelected[i])
199
                                roisToDraw.add(roi.get(i));
200
                }
201
                return roisToDraw.toArray(new ROI[0]);
202
        }
203
        
204
        public Object getSource() {
205
                return null;
206
        }
207

    
208
        public Rectangle2D getBBoxRectangle() {
209
                if(inputLyr != null)
210
                        return inputLyr.getFullRasterExtent().toRectangle2D();
211
                return new Rectangle2D.Double();
212
        }
213

    
214
        public void addParams(RasterProcess task, String path, String fileName) throws ROIException {
215
                if(!fileName.matches("([*]\\.[???])")) {
216
                        fileName += ".tif";
217
                }
218
                task.addParam(ROIMaskProcess.PATH, path + File.separator + fileName);
219
                task.addParam(ROIMaskProcess.RASTER_STORE1, inputLyr.getDataStore());
220
                task.addParam(ROIMaskProcess.ROIS, getROIsSelected());
221
                task.addParam(ROIMaskProcess.ALPHA, data.getAlpha());
222
                task.addParam(ROIMaskProcess.INVERSE, data.isInverse());
223
                task.addParam(ROIMaskProcess.NODATA, getNoDataSelected());
224
                task.addParam(ROIMaskProcess.EXPORT, true);
225
        }
226
}