Statistics
| Revision:

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

History | View | Annotate | Download (10.2 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.awt.geom.AffineTransform;
23
import java.io.File;
24
import java.io.IOException;
25

    
26
import javax.swing.JOptionPane;
27

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

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

    
73
        /**
74
         * Variables de la resoluci?n de salida
75
         */
76
        private int                                                                        resolutionWidth = 0, resolutionHeight = 0;
77

    
78
        /**
79
         * Crea un <code>CuttingProcess</code> para generar un recorte
80
         * @param loadToc
81
         * @param dValues
82
         * @param fileName
83
         * @param writerBufferServer
84
         * @param rasterMultiDataset
85
         * @param extent
86
         * @param drawableBands
87
         * @param oneLayerPerBand
88
         */
89
        public CuttingProcess(boolean loadToc, String viewName, int[] dValues, String fileName,
90
                                                        WriterBufferServer writerBufferServer, IRasterDataSource raster,
91
                                                        AffineTransform at, int[] drawableBands, boolean oneLayerPerBand, int interpMethod) {
92
                this.fileName = fileName;
93
                this.writerBufferServer = writerBufferServer;
94
                this.raster = raster;
95
                this.at = at;
96
                this.oneLayerPerBand = oneLayerPerBand;
97
                this.drawableBands = drawableBands;
98
                this.loadToc = loadToc;
99
                this.dValues = dValues;
100
                this.viewName = viewName;
101
                this.interpMethod = interpMethod;
102
        }
103

    
104
        /**
105
         * Arranca el proceso de recorte de un layer
106
         */
107
        public void start() {
108
                cancel = false;
109
                blinker = new Thread(this);
110
                blinker.start();
111
        }
112

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

    
123
        /**
124
         * M?todo donde se ejecutar? el Thread, aqu? se genera el recorte
125
         */
126
        public void run() {
127
                try {
128
                        IRasterDataSource d = raster.copy();
129
                        BufferFactory bufferFactory = new BufferFactory(d);
130
                        bufferFactory.setDrawableBands(drawableBands);
131

    
132
                        if(cancel)
133
                                return;
134

    
135
                        IBuffer buffer = null;
136

    
137
                        if(        interpMethod != BufferInterpolation.INTERPOLATION_Undefined &&
138
                                interpMethod != BufferInterpolation.INTERPOLATION_NearestNeighbour) {
139
                                bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3]);
140
                                buffer = bufferFactory.getRasterBuf();
141
                                buffer = ((RasterBuffer)buffer).getAdjustedWindow(resolutionWidth, resolutionHeight, interpMethod);
142
                        } else {
143
                                try {
144
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], Math.abs(dValues[2] - dValues[0]), Math.abs(dValues[1] - dValues[3]), resolutionWidth, resolutionHeight);
145
                                        buffer = bufferFactory.getRasterBuf();
146
                                } catch (InvalidSetViewException e) {
147
                                        NotificationManager.addError("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
148
                                }
149
                        }
150
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n del fichero fuente
151
                        if (oneLayerPerBand) {
152
                                for (int i = 0; i < drawableBands.length; i++) {
153
                                        if(cancel)
154
                                                return;
155
                                        String f = fileName + "_B" + drawableBands[i] + ".tif";
156
                                        writerBufferServer.setBuffer(buffer, i);
157
                                        Params p = null;
158
                                        if(params == null)
159
                                                p = GeoRasterWriter.getWriter(f).getParams();
160
                                        else
161
                                                p = params;
162
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, f,
163
                                                        1, at, buffer.getWidth(), buffer.getHeight(),
164
                                                        buffer.getDataType(), p, null);
165
                                        grw.setWkt(d.getWktProjection());
166
                                        grw.dataWrite();
167
                                        grw.writeClose();
168
                                        if(!cancel)
169
                                                cutFinalize(f);
170
                                }
171
                        } else {
172
                                writerBufferServer.setBuffer(buffer, -1);
173
                                if(params == null) {
174
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName + ".tif",
175
                                                        buffer.getBandCount(), at, buffer.getWidth(), buffer.getHeight(),
176
                                                        buffer.getDataType(), GeoRasterWriter.getWriter(fileName + ".tif").getParams(), null);
177
                                } else
178
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, fileName,
179
                                                        buffer.getBandCount(), at, buffer.getWidth(), buffer.getHeight(),
180
                                                        buffer.getDataType(), params, null);
181
                                grw.setWkt(d.getWktProjection());
182
                                grw.dataWrite();
183
                                grw.writeClose();
184
                                if(!cancel) {
185
                                        if(params == null)
186
                                                cutFinalize(fileName + ".tif");
187
                                        else
188
                                                cutFinalize(fileName);
189
                                }
190
                        }
191
                        d.close();
192
                } catch (NotSupportedExtensionException e) {
193
                        NotificationManager.addError("No se ha podido obtener el writer. Extensi?n no soportada", e);
194
                } catch (RasterDriverException e) {
195
                        NotificationManager.addError("No se ha podido obtener el writer.", e);
196
                } catch (IOException e) {
197
                        NotificationManager.addError("Error en la escritura en GeoRasterWriter.", e);
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
}