Statistics
| Revision:

gvsig-raster / org.gvsig.raster.roimask / trunk / 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 @ 2333

History | View | Annotate | Download (7.34 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.render.ImageDrawer;
18
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
19
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
20
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
21
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
22
import org.gvsig.raster.algorithm.process.DataProcess;
23
import org.gvsig.raster.algorithm.process.ProcessException;
24
import org.gvsig.raster.fmap.layers.FLyrRaster;
25
import org.gvsig.raster.roi.ROI;
26
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
27
import org.gvsig.raster.roimask.app.ROIMaskExtension.LayerElement;
28
import org.gvsig.raster.roimask.swing.ROIMaskData;
29
import org.gvsig.raster.swing.preview.DataSourcePreview;
30
import org.gvsig.tools.task.Cancellable;
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33

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

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

    
71
        public void popStatus() {
72
        }
73

    
74
        public void pushStatus() {
75
        }
76
        
77
        public void draw(BufferedImage image, Graphics2D g, double[] coords, int w, int h, Cancellable cancel, double scale) throws ImageUnavailableException {
78
                //Posici?n de inicio dibujado dentro del Graphics
79
                int x = 0;
80
                int y = 0;
81
                //Coordenadas de la petici?n
82
                double iniX = coords[0];
83
                double iniY = coords[1];
84
                double endX = coords[2];
85
                double endY = coords[3];
86
                
87
                //Se ajustan las coordenadas de petici?n, ancho y alto en coordenadas p?xel, 
88
                //as? como la coordenada de inicio de dibujado 
89
                if(bbox.getULX() > coords[0]) {
90
                        iniX = bbox.getULX();
91
                        x = (int)(((iniX - coords[0]) * w) / Math.abs(coords[2] - coords[0]));
92
                }
93
                                
94
                if(bbox.getULY() < coords[1]) {
95
                        iniY = bbox.getULY();
96
                        y = (int)(((coords[1] - iniY) * h) / Math.abs(coords[3] - coords[1]));
97
                }
98
                
99
                if(bbox.getLRX() < coords[2]) 
100
                        endX = bbox.getLRX();
101
                
102
                if(bbox.getLRY() > coords[3]) 
103
                        endY = bbox.getLRY();
104
                
105
                if(iniX != coords[0] || endX != coords[2]) {
106
                        w = (int)((Math.abs(endX - iniX) * w) / Math.abs(coords[2] - coords[0]));
107
                }
108
                
109
                if(iniY != coords[1] || endY != coords[3]) {
110
                        h = (int)((Math.abs(iniY - endY) * h) / Math.abs(coords[3] - coords[1]));
111
                }
112
                
113
                Extent ext = RasterLocator.getManager().getDataStructFactory().createExtent(iniX, iniY, endX, endY);
114
                BufferedImage img = throwProcess(ext, w, h);
115
                g.drawImage(img, x, y, null);
116
        }
117
        
118
        /**
119
         * Throws the process sequentially. Since the preview is small,
120
         * it should not taken a lot of time
121
         * is small
122
         * @param ext
123
         * @param w
124
         * @param h
125
         * @return
126
         */
127
        private BufferedImage throwProcess(Extent ext, int w, int h) {
128
                loadLayers();
129
                
130
                DataProcess task;
131
                try {
132
                        task = RasterBaseAlgorithmLibrary.getManager().createRasterTask("ROIMaskProcess");
133
                        task.addParam(ROIMaskProcess.RASTER_STORE1, inputLyr.getDataStore());
134
                        task.addParam(ROIMaskProcess.TEST, true);
135
                        task.addParam(ROIMaskProcess.EXTENT, ext);
136
                        task.addParam(ROIMaskProcess.OUTPUT_WIDTH, w);
137
                        task.addParam(ROIMaskProcess.OUTPUT_HEIGHT, h);
138
                        task.addParam(ROIMaskProcess.ROIS, getROIsSelected());
139
                        task.addParam(ROIMaskProcess.ALPHA, data.getAlpha());
140
                        task.addParam(ROIMaskProcess.INVERSE, data.isInverse());
141
                        task.addParam(ROIMaskProcess.NODATA, getNoDataSelected());
142
                        task.addParam(ROIMaskProcess.EXPORT, false);
143
                } catch (ProcessException e1) {
144
                        e1.printStackTrace();
145
                        return null;
146
                } catch (ROIException e) {
147
                        e.printStackTrace();
148
                        return null;
149
                }
150
                
151
                task.init();
152
                try {
153
                        task.process();
154
                } catch (ProcessInterruptedException e1) {
155
                        return null;
156
                } catch (ProcessException e) {
157
                        logger.debug("Error in process");
158
                        return null;
159
                }
160
                
161
                HashMap<String, Object> map = (HashMap<String, Object>)task.getResult();
162
                Buffer buf = (Buffer)map.get(ROIMaskProcess.BUFFER);
163
                buf.setDataExtent(ext.toRectangle2D());
164
                
165
                ColorInterpretation ci = inputLyr.getDataStore().getColorInterpretation();
166
                Transparency transparency = null;
167
                if(ci.isRGB() || ci.isRGBA()) {
168
                        Integer alphaBandNumber = (Integer)map.get(ROIMaskProcess.ALPHA_BAND);
169
                        transparency = RasterLocator.getManager().getDataStructFactory().createTransparency(buf.getBandCount());
170
                        transparency.setTransparencyBand(alphaBandNumber);
171
                        transparency.activeTransparency();
172
                }
173
                
174
                ImageDrawer drawer = RasterLocator.getManager().createImageDrawerService();
175
                drawer.setBuffer(buf);
176
                drawer.setLastTransparency(transparency);
177
                try {
178
                        if(!ci.isRGB() && !ci.isRGBA() && !ci.isPalette())
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(DataProcess 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
}