Statistics
| Revision:

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

History | View | Annotate | Download (10 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
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n del fichero fuente
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, null);                                        
164
                                        grw.setWkt(d.getWktProjection());
165
                                        grw.dataWrite();
166
                                        grw.writeClose();
167
                                        if(!cancel)
168
                                                cutFinalize(f);
169
                                }
170
                        } else {
171
                                writerBufferServer.setBuffer(buffer, -1);
172
                                if(params == null) {
173
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName + ".tif",
174
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
175
                                                        buffer.getDataType(), GeoRasterWriter.getWriter(fileName + ".tif").getParams(), null);
176
                                } else
177
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName,
178
                                                        buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
179
                                                        buffer.getDataType(), params, null);
180
                                grw.setWkt(d.getWktProjection());
181
                                grw.dataWrite();
182
                                grw.writeClose();
183
                                if(!cancel) {
184
                                        if(params == null)
185
                                                cutFinalize(fileName + ".tif");
186
                                        else
187
                                                cutFinalize(fileName);
188
                                }
189
                        }
190
                        d.close();
191
                        //TODO: EXCEPCIONES: Eliminar printStackTRace
192
                } catch (NotSupportedExtensionException e) {
193
                        e.printStackTrace();
194
                } catch (RasterDriverException e) {
195
                        e.printStackTrace();
196
                } catch (IOException e) {
197
                        e.printStackTrace();
198
                }
199

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

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

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

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

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

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

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

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

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

    
286
        }
287

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