Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / cutting / CuttingProcess.java @ 12152

History | View | Annotate | Download (9.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
*
3
* Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
*/
19
package org.gvsig.rastertools.cutting;
20

    
21
import java.awt.Component;
22
import java.io.File;
23
import java.io.IOException;
24

    
25
import javax.swing.JOptionPane;
26

    
27
import org.gvsig.fmap.layers.FLyrRasterSE;
28
import org.gvsig.gui.beans.incrementabletask.IncrementableEvent;
29
import org.gvsig.gui.beans.incrementabletask.IncrementableListener;
30
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
31
import org.gvsig.raster.buffer.BufferFactory;
32
import org.gvsig.raster.buffer.BufferInterpolation;
33
import org.gvsig.raster.buffer.RasterBuffer;
34
import org.gvsig.raster.dataset.GeoRasterWriter;
35
import org.gvsig.raster.dataset.IBuffer;
36
import org.gvsig.raster.dataset.InvalidSetViewException;
37
import org.gvsig.raster.dataset.MultiRasterDataset;
38
import org.gvsig.raster.dataset.NotSupportedExtensionException;
39
import org.gvsig.raster.dataset.Params;
40
import org.gvsig.raster.dataset.RasterDriverException;
41
import org.gvsig.raster.shared.Extent;
42

    
43
import com.iver.andami.PluginServices;
44
import com.iver.andami.ui.mdiManager.IWindow;
45
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
46
import com.iver.cit.gvsig.fmap.layers.FLayer;
47
import com.iver.cit.gvsig.project.documents.view.gui.View;
48
/**
49
 * <code>CuttingProcess</code> es un proceso que usa un <code>Thread</code>
50
 * para calcular el recorte de una capa.
51
 * 
52
 * @version 24/04/2007
53
 * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
54
 */
55
public class CuttingProcess implements Runnable, IncrementableListener {
56
        private String                                         fileName = "";
57
        private IncrementableTask                incrementableTask = null;
58
        private volatile Thread                        blinker = null;
59
        private WriterBufferServer                writerBufferServer = null;
60
        private MultiRasterDataset                rasterMultiDataset = null;
61
        private Extent                                        extent = null;
62
        private boolean                                        oneLayerPerBand = false;
63
        private int[]                                        drawableBands = null;
64
        private int[]                                        dValues = null;
65
        private boolean                                        cancel = false;
66
        private GeoRasterWriter                 grw = null;
67
        private int                                                interpMethod = BufferInterpolation.INTERPOLATION_Undefined;
68
        private boolean                                 loadToc = false;
69
        private String                                        viewName = "";
70
        private Params                                        params = null;
71
        
72
        /**
73
         * Variables de la resoluci?n de salida
74
         */
75
        private int                                                                        resolutionWidth = 0, resolutionHeight = 0;
76

    
77
        /**
78
         * Crea un <code>CuttingProcess</code> para generar un recorte
79
         * @param loadToc
80
         * @param dValues
81
         * @param fileName
82
         * @param writerBufferServer
83
         * @param rasterMultiDataset
84
         * @param extent
85
         * @param drawableBands
86
         * @param oneLayerPerBand
87
         */
88
        public CuttingProcess(boolean loadToc, String viewName, int[] dValues, String fileName, 
89
                                                        WriterBufferServer writerBufferServer, MultiRasterDataset rasterMultiDataset, 
90
                                                        Extent extent, int[] drawableBands, boolean oneLayerPerBand, int interpMethod) {
91
                this.fileName = fileName;
92
                this.writerBufferServer = writerBufferServer;
93
                this.rasterMultiDataset = rasterMultiDataset;
94
                this.extent = extent;
95
                this.oneLayerPerBand = oneLayerPerBand;
96
                this.drawableBands = drawableBands;
97
                this.loadToc = loadToc;
98
                this.dValues = dValues;
99
                this.viewName = viewName;
100
                this.interpMethod = interpMethod;
101
        }
102
        
103
        /**
104
         * Arranca el proceso de recorte de un layer
105
         */
106
        public void start() {
107
                cancel = false;
108
                blinker = new Thread(this);
109
                blinker.start();
110
        }
111

    
112
        /**
113
         * Establecer la resolucion de salida al crear el recorte
114
         * @param width
115
         * @param height
116
         */
117
        public void setResolution(int width, int height) {
118
                resolutionWidth = width;
119
                resolutionHeight = height;
120
        }
121

    
122
        /**
123
         * M?todo donde se ejecutar? el Thread, aqu? se genera el recorte
124
         */
125
        public void run() {
126
                try {
127
                        BufferFactory bufferFactory = new BufferFactory(rasterMultiDataset);
128
                        bufferFactory.setDrawableBands(drawableBands);
129
                        
130
                        if(cancel)
131
                                return;
132
                        
133
                        IBuffer buffer = null;
134
                                
135
                        if(        interpMethod != BufferInterpolation.INTERPOLATION_Undefined &&
136
                                interpMethod != BufferInterpolation.INTERPOLATION_NearestNeighbour) {
137
                                bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3]);
138
                                buffer = bufferFactory.getRasterBuf();
139
                                buffer = ((RasterBuffer)buffer).getAdjustedWindow(resolutionWidth, resolutionHeight, interpMethod);
140
                        } else {
141
                                try {
142
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], Math.abs(dValues[2] - dValues[0]), Math.abs(dValues[1] - dValues[3]), resolutionWidth, resolutionHeight);
143
                                        buffer = bufferFactory.getRasterBuf();
144
                                } catch (InvalidSetViewException e) {
145
                                        e.printStackTrace();
146
                                }
147
                        }
148
                                                
149
                        if (oneLayerPerBand) {
150
                                for (int i = 0; i < drawableBands.length; i++) {
151
                                        if(cancel)
152
                                                return;
153
                                        String f = fileName + "_B" + drawableBands[i] + ".tif";
154
                                        writerBufferServer.setBuffer(buffer, i);
155
                                        Params p = null;
156
                                        if(params == null)
157
                                                p = GeoRasterWriter.getWriter(f).getParams();
158
                                        else 
159
                                                p = params;
160
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, f,
161
                                                        1, extent, buffer.getWidth(), buffer.getHeight(),
162
                                                        buffer.getDataType(), p);
163
                                        grw.dataWrite();
164
                                        grw.writeClose();
165
                                        if(!cancel)
166
                                                cutFinalize(f);
167
                                }
168
                        } else {
169
                                writerBufferServer.setBuffer(buffer, -1);
170
                                if(params == null) {
171
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName + ".tif",
172
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
173
                                                        buffer.getDataType(), GeoRasterWriter.getWriter(fileName + ".tif").getParams());
174
                                } else 
175
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName,
176
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
177
                                                        buffer.getDataType(), params);
178
                                
179
                                grw.dataWrite();
180
                                grw.writeClose();
181
                                if(!cancel) {
182
                                        if(params == null)
183
                                                cutFinalize(fileName + ".tif");
184
                                        else
185
                                                cutFinalize(fileName);
186
                                }
187
                        }
188
                        //TODO: EXCEPCIONES: Eliminar printStackTRace
189
                } catch (NotSupportedExtensionException e) {
190
                        e.printStackTrace();
191
                } catch (RasterDriverException e) {
192
                        e.printStackTrace();
193
                } catch (IOException e) {
194
                        e.printStackTrace();
195
                }
196
                
197
                if (incrementableTask != null)
198
                        incrementableTask.processFinalize();
199
        }
200

    
201
        /**
202
         * Establece el <code>IncrementableTask</code>
203
         * @param value
204
         */
205
        public void setIncrementableTask(IncrementableTask value) {
206
                incrementableTask = value;
207
                incrementableTask.addIncrementableListener(this);
208
        }
209

    
210
        /*
211
         * (non-Javadoc)
212
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionCanceled(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
213
         */
214
        public void actionCanceled(IncrementableEvent e) {
215
                if(writerBufferServer != null)
216
                        writerBufferServer.setCanceled(true, 0);
217
                if(grw != null)
218
                        grw.writeCancel();
219
                cancel = true;
220
        }
221

    
222
        /*
223
         * (non-Javadoc)
224
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionResumed(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
225
         */
226
        public void actionResumed(IncrementableEvent e) {
227
        }
228

    
229
        /*
230
         * (non-Javadoc)
231
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionSuspended(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
232
         */
233
        public void actionSuspended(IncrementableEvent e) {
234
        }
235
        
236
        /**
237
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
238
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
239
         */
240
        private void cutFinalize(String fileName) {
241
                if (!loadToc)
242
                        return;
243
                if(!new File(fileName).exists())
244
                        return;
245
                // seleccionamos la vista de gvSIG
246
                com.iver.cit.gvsig.project.documents.view.gui.View theView = null;
247
                try {
248
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
249
                        for (int i = 0; i < allViews.length; i++) {
250
                                if (allViews[i] instanceof com.iver.cit.gvsig.project.documents.view.gui.View
251
                                        && PluginServices.getMDIManager().getWindowInfo((View) allViews[i]).getTitle().equals(viewName))
252
                                        theView = (com.iver.cit.gvsig.project.documents.view.gui.View) allViews[i];
253
                        }
254
                        if (theView == null)
255
                                return;
256
                } catch (ClassCastException ex) {
257
                        // logger.error(PluginServices.getText(this,"cant_get_view "), ex);
258
                        return;
259
                }
260

    
261
                // Cargamos las capas
262
                theView.getMapControl().getMapContext().beginAtomicEvent();
263
                
264
                //Driver driver = LayerFactory.getDM().getDriver("gvSIG Raster Driver");
265
                int endIndex = fileName.lastIndexOf(".");
266
                if (endIndex < 0)
267
                        endIndex = fileName.length();
268
                FLayer lyr = null;
269
                try {
270
                        lyr = FLyrRasterSE.createLayer(fileName.substring(
271
                                        fileName.lastIndexOf(File.separator) + 1, endIndex),
272
                                        new File(fileName), theView.getMapControl().getProjection());
273
                } catch (LoadLayerException e) {
274
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
275
                                        PluginServices.getText(this, "error_cargar_capa"));
276
                }
277
                theView.getMapControl().getMapContext().getLayers().addLayer(lyr);
278
                theView.getMapControl().getMapContext().endAtomicEvent();
279

    
280
                theView.getMapControl().getMapContext().invalidate();
281
//                        grid.free();
282
                
283
        }
284

    
285
        /**
286
         * Asigna los par?metros si estos han de ser cambiados. En caso de 
287
         * que no se asignen se usaran los que tiene el driver por defecto.
288
         * @param params Par?metros del driver de escritura.
289
         */
290
        public void setParams(Params params) {
291
                this.params = params;
292
        }
293
}