Statistics
| Revision:

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

History | View | Annotate | Download (9.84 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.raster.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.datastruct.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 BorSanZa - 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
                        MultiRasterDataset d = rasterMultiDataset.copyDataset();
128
                        BufferFactory bufferFactory = new BufferFactory(d);
129
                        bufferFactory.setDrawableBands(drawableBands);
130

    
131
                        if(cancel)
132
                                return;
133

    
134
                        IBuffer buffer = null;
135

    
136
                        if(        interpMethod != BufferInterpolation.INTERPOLATION_Undefined &&
137
                                interpMethod != BufferInterpolation.INTERPOLATION_NearestNeighbour) {
138
                                bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3]);
139
                                buffer = bufferFactory.getRasterBuf();
140
                                buffer = ((RasterBuffer)buffer).getAdjustedWindow(resolutionWidth, resolutionHeight, interpMethod);
141
                        } else {
142
                                try {
143
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], Math.abs(dValues[2] - dValues[0]), Math.abs(dValues[1] - dValues[3]), resolutionWidth, resolutionHeight);
144
                                        buffer = bufferFactory.getRasterBuf();
145
                                } catch (InvalidSetViewException e) {
146
                                        e.printStackTrace();
147
                                }
148
                        }
149

    
150
                        if (oneLayerPerBand) {
151
                                for (int i = 0; i < drawableBands.length; i++) {
152
                                        if(cancel)
153
                                                return;
154
                                        String f = fileName + "_B" + drawableBands[i] + ".tif";
155
                                        writerBufferServer.setBuffer(buffer, i);
156
                                        Params p = null;
157
                                        if(params == null)
158
                                                p = GeoRasterWriter.getWriter(f).getParams();
159
                                        else
160
                                                p = params;
161
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, f,
162
                                                        1, extent, buffer.getWidth(), buffer.getHeight(),
163
                                                        buffer.getDataType(), p);
164
                                        grw.dataWrite();
165
                                        grw.writeClose();
166
                                        if(!cancel)
167
                                                cutFinalize(f);
168
                                }
169
                        } else {
170
                                writerBufferServer.setBuffer(buffer, -1);
171
                                if(params == null) {
172
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName + ".tif",
173
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
174
                                                        buffer.getDataType(), GeoRasterWriter.getWriter(fileName + ".tif").getParams());
175
                                } else
176
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName,
177
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
178
                                                        buffer.getDataType(), params);
179

    
180
                                grw.dataWrite();
181
                                grw.writeClose();
182
                                if(!cancel) {
183
                                        if(params == null)
184
                                                cutFinalize(fileName + ".tif");
185
                                        else
186
                                                cutFinalize(fileName);
187
                                }
188
                        }
189
                        d.close();
190
                        //TODO: EXCEPCIONES: Eliminar printStackTRace
191
                } catch (NotSupportedExtensionException e) {
192
                        e.printStackTrace();
193
                } catch (RasterDriverException e) {
194
                        e.printStackTrace();
195
                } catch (IOException e) {
196
                        e.printStackTrace();
197
                }
198

    
199
                if (incrementableTask != null)
200
                        incrementableTask.processFinalize();
201
        }
202

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

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

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

    
231
        /*
232
         * (non-Javadoc)
233
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionSuspended(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
234
         */
235
        public void actionSuspended(IncrementableEvent e) {
236
        }
237

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

    
263
                // Cargamos las capas
264
                theView.getMapControl().getMapContext().beginAtomicEvent();
265

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

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

    
285
        }
286

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