Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / rastertools / cutting / CuttingProcess.java @ 13925

History | View | Annotate | Download (12.9 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.FileNotFoundException;
25
import java.io.IOException;
26

    
27
import javax.swing.JOptionPane;
28

    
29
import org.apache.log4j.Logger;
30
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
31
import org.gvsig.gui.beans.incrementabletask.IncrementableEvent;
32
import org.gvsig.gui.beans.incrementabletask.IncrementableListener;
33
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
34
import org.gvsig.raster.buffer.BufferFactory;
35
import org.gvsig.raster.buffer.BufferInterpolation;
36
import org.gvsig.raster.buffer.RasterBuffer;
37
import org.gvsig.raster.dataset.GeoRasterWriter;
38
import org.gvsig.raster.dataset.IBuffer;
39
import org.gvsig.raster.dataset.IRasterDataSource;
40
import org.gvsig.raster.dataset.InvalidSetViewException;
41
import org.gvsig.raster.dataset.NotSupportedExtensionException;
42
import org.gvsig.raster.dataset.Params;
43
import org.gvsig.raster.dataset.RasterDriverException;
44
import org.gvsig.raster.dataset.io.rmf.RmfBlocksManager;
45
import org.gvsig.raster.datastruct.ColorTable;
46
import org.gvsig.raster.datastruct.serializer.ColorTableRmfSerializer;
47
import org.gvsig.raster.grid.GridPalette;
48
import org.gvsig.raster.grid.filter.RasterFilterList;
49
import org.gvsig.raster.grid.filter.bands.ColorTableFilter;
50
import org.gvsig.raster.process.CancelEvent;
51
import org.gvsig.raster.process.RasterTask;
52
import org.gvsig.raster.process.RasterTaskQueue;
53
import org.gvsig.raster.util.RasterUtilities;
54

    
55
import com.iver.andami.PluginServices;
56
import com.iver.andami.ui.mdiManager.IWindow;
57
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
58
import com.iver.cit.gvsig.fmap.layers.FLayer;
59
import com.iver.cit.gvsig.project.documents.view.gui.View;
60
/**
61
 * <code>CuttingProcess</code> es un proceso que usa un <code>Thread</code>
62
 * para calcular el recorte de una capa.
63
 *
64
 * @version 24/04/2007
65
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
66
 */
67
public class CuttingProcess implements IncrementableListener, Runnable {
68
        private String             fileName            = "";
69
        private IncrementableTask  incrementableTask   = null;
70
        private volatile Thread    blinker             = null;
71
        private WriterBufferServer writerBufferServer  = null;
72
        private FLyrRasterSE       rasterSE            = null;
73
        private AffineTransform    affineTransform     = new AffineTransform();
74
        private boolean            oneLayerPerBand     = false;
75
        private int[]              drawableBands       = { 0, 1, 2 };
76
        private int[]              dValues             = null;
77
        private GeoRasterWriter    grw                 = null;
78
        private int                interpolationMethod = BufferInterpolation.INTERPOLATION_Undefined;
79
        private boolean            loadedInToc         = true;
80
        private String             viewName            = "";
81
        private Params             params              = null;
82
        private RasterTask         rasterTask          = new RasterTask(this);
83

    
84
        /**
85
         * Variables de la resoluci?n de salida
86
         */
87
        private int                                                                        resolutionWidth = 0, resolutionHeight = 0;
88

    
89
        /**
90
         * Crea un <code>CuttingProcess</code> para generar un recorte
91
         * @param dValues
92
         * @param fileName
93
         * @param writerBufferServer
94
         * @param rasterMultiDataset
95
         * @param extent
96
         * @param drawableBands
97
         * @param oneLayerPerBand
98
         */
99
        public CuttingProcess(String viewName, int[] dValues, String fileName,
100
                                                        WriterBufferServer writerBufferServer, FLyrRasterSE rasterSE) {
101
                this.fileName = fileName;
102
                this.writerBufferServer = writerBufferServer;
103
                this.rasterSE = rasterSE;
104
                this.dValues = dValues;
105
                this.viewName = viewName;
106
        }
107

    
108
        /**
109
         * Arranca el proceso de recorte de un layer
110
         */
111
        public void start() {
112
                blinker = new Thread(this);
113
                blinker.start();
114
        }
115

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

    
126
        /**
127
         * Salva la tabla de color al fichero rmf.
128
         * @param fName
129
         * @throws IOException  
130
         */
131
        private void saveToRmf(String fileName) {
132
                fileName = RasterUtilities.getNameWithoutExtension(fileName) + ".rmf";
133
                
134
                RmfBlocksManager manager = rasterSE.getDataSource().getDataset(0)[0].getRmfBlocksManager();
135
                
136
                RasterFilterList rasterFilterList = rasterSE.getRenderFilterList();
137

    
138
                ColorTableFilter colorTableFilter = (ColorTableFilter) rasterFilterList.getByName(ColorTableFilter.names[0]);
139
                if (colorTableFilter != null) {
140
                        GridPalette gridPalette = new GridPalette((ColorTable) colorTableFilter.getColorTable().clone());
141

    
142
                  ColorTableRmfSerializer ser = new ColorTableRmfSerializer(gridPalette);
143
                        manager.setPath(fileName);
144

    
145
                  if (!manager.checkRmf())
146
                          return;
147
                  manager.addClient(ser);
148
                  try {
149
                          RasterUtilities.copyFile(manager.getPath(), manager.getPath() + "~");
150
                          manager.write();
151
                  } catch (FileNotFoundException e) {
152
                          e.printStackTrace();
153
                  } catch (IOException e) {
154
                          e.printStackTrace();
155
                  }
156
                  manager.removeClient(ser.getClass());
157
                }
158
        }
159

    
160
        /**
161
         * M?todo donde se ejecutar? el Thread, aqu? se genera el recorte
162
         */
163
        public void run() {
164
                try {
165
                        RasterTaskQueue.register(rasterTask);
166
                        
167
                        IRasterDataSource d = rasterSE.getDataSource().copy();
168
                        BufferFactory bufferFactory = new BufferFactory(d);
169
                        bufferFactory.setDrawableBands(getDrawableBands());
170

    
171
                        IBuffer buffer = null;
172

    
173
                        if(        getInterpolationMethod() != BufferInterpolation.INTERPOLATION_Undefined &&
174
                                        getInterpolationMethod() != BufferInterpolation.INTERPOLATION_NearestNeighbour) {
175
                                try {
176
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3]);
177
                                } catch (InvalidSetViewException e) {
178
                                        Logger.getLogger(this.getClass().getName()).debug("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
179
                                }
180
                                buffer = bufferFactory.getRasterBuf();
181
                                buffer = ((RasterBuffer)buffer).getAdjustedWindow(resolutionWidth, resolutionHeight, getInterpolationMethod());
182
                        } else {
183
                                try {
184
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], Math.abs(dValues[2] - dValues[0]), Math.abs(dValues[1] - dValues[3]), resolutionWidth, resolutionHeight);
185
                                        buffer = bufferFactory.getRasterBuf();
186
                                } catch (InvalidSetViewException e) {
187
                                        Logger.getLogger(this.getClass().getName()).debug("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
188
                                }
189
                        }
190
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n del fichero fuente
191
                        String finalFileName = "";
192
                        if (isOneLayerPerBand()) {
193
                                for (int i = 0; i < drawableBands.length; i++) {
194
                                        finalFileName = fileName + "_B" + drawableBands[i] + ".tif";
195
                                        writerBufferServer.setBuffer(buffer, i);
196
                                        Params p = null;
197
                                        if (params == null)
198
                                                p = GeoRasterWriter.getWriter(finalFileName).getParams();
199
                                        else
200
                                                p = params;
201
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, finalFileName, 1,
202
                                                        getAffineTransform(), buffer.getWidth(), buffer.getHeight(),
203
                                                        buffer.getDataType(), p, null);
204
                                        grw.setWkt(d.getWktProjection());
205
                                        grw.dataWrite();
206
                                        grw.writeClose();
207
                                        saveToRmf(finalFileName);
208
                                        cutFinalize(finalFileName);
209
                                }
210
                        } else {
211
                                writerBufferServer.setBuffer(buffer, -1);
212
                                if (params == null) {
213
                                        finalFileName = fileName + ".tif";
214
                                        params = GeoRasterWriter.getWriter(finalFileName).getParams();
215
                                } else
216
                                        finalFileName = fileName;
217
                                grw = GeoRasterWriter.getWriter(writerBufferServer, finalFileName,
218
                                                buffer.getBandCount(), getAffineTransform(), buffer.getWidth(),
219
                                                buffer.getHeight(), buffer.getDataType(), params, null);
220
                                grw.setWkt(d.getWktProjection());
221
                                grw.dataWrite();
222
                                grw.writeClose();
223
                                saveToRmf(finalFileName);
224
                                cutFinalize(finalFileName);
225
                        }
226

    
227
                        d.close();
228
                } catch (NotSupportedExtensionException e) {
229
                        Logger.getLogger(this.getClass().getName()).debug("No se ha podido obtener el writer. Extensi?n no soportada", e);
230
                } catch (RasterDriverException e) {
231
                        Logger.getLogger(this.getClass().getName()).debug("No se ha podido obtener el writer.", e);
232
                } catch (IOException e) {
233
                        Logger.getLogger(this.getClass().getName()).debug("Error en la escritura en GeoRasterWriter.", e);
234
                } catch (InterruptedException e) {
235
                        Thread.currentThread().interrupt();
236
                } finally {
237
                        RasterTaskQueue.remove(rasterTask);
238
                        if (incrementableTask != null)
239
                                incrementableTask.processFinalize();
240
                }
241
        }
242

    
243
        /**
244
         * Establece el <code>IncrementableTask</code>
245
         * @param value
246
         */
247
        public void setIncrementableTask(IncrementableTask value) {
248
                incrementableTask = value;
249
                incrementableTask.addIncrementableListener(this);
250
        }
251

    
252
        /*
253
         * (non-Javadoc)
254
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionCanceled(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
255
         */
256
        public void actionCanceled(IncrementableEvent e) {
257
                rasterTask.setEvent(new CancelEvent(this));
258
        }
259

    
260
        /*
261
         * (non-Javadoc)
262
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionResumed(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
263
         */
264
        public void actionResumed(IncrementableEvent e) {
265
        }
266

    
267
        /*
268
         * (non-Javadoc)
269
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionSuspended(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
270
         */
271
        public void actionSuspended(IncrementableEvent e) {
272
        }
273

    
274
        /**
275
         * Acciones que se realizan al finalizar de crear los recortes de imagen.
276
         * Este m?todo es llamado por el thread TailRasterProcess al finalizar.
277
         */
278
        private void cutFinalize(String fileName) {
279
                if (!isLoadedInToc())
280
                        return;
281
                if(!new File(fileName).exists())
282
                        return;
283
                // seleccionamos la vista de gvSIG
284
                com.iver.cit.gvsig.project.documents.view.gui.View theView = null;
285
                try {
286
                        IWindow[] allViews = PluginServices.getMDIManager().getAllWindows();
287
                        for (int i = 0; i < allViews.length; i++) {
288
                                if (allViews[i] instanceof com.iver.cit.gvsig.project.documents.view.gui.View
289
                                        && PluginServices.getMDIManager().getWindowInfo((View) allViews[i]).getTitle().equals(viewName))
290
                                        theView = (com.iver.cit.gvsig.project.documents.view.gui.View) allViews[i];
291
                        }
292
                        if (theView == null)
293
                                return;
294
                } catch (ClassCastException ex) {
295
                        // logger.error(PluginServices.getText(this,"cant_get_view "), ex);
296
                        return;
297
                }
298

    
299
                // Cargamos las capas
300
                theView.getMapControl().getMapContext().beginAtomicEvent();
301

    
302
                //Driver driver = LayerFactory.getDM().getDriver("gvSIG Raster Driver");
303
                int endIndex = fileName.lastIndexOf(".");
304
                if (endIndex < 0)
305
                        endIndex = fileName.length();
306
                FLayer lyr = null;
307
                try {
308
                        lyr = FLyrRasterSE.createLayer(fileName.substring(
309
                                        fileName.lastIndexOf(File.separator) + 1, endIndex),
310
                                        new File(fileName), theView.getMapControl().getProjection());
311
                } catch (LoadLayerException e) {
312
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
313
                                        PluginServices.getText(this, "error_cargar_capa"));
314
                }
315
                theView.getMapControl().getMapContext().getLayers().addLayer(lyr);
316

    
317
                theView.getMapControl().getMapContext().invalidate();
318
                theView.getMapControl().getMapContext().endAtomicEvent();
319
                //grid.free();
320

    
321
        }
322

    
323
        /**
324
         * Asigna los par?metros si estos han de ser cambiados. En caso de
325
         * que no se asignen se usaran los que tiene el driver por defecto.
326
         * @param params Par?metros del driver de escritura.
327
         */
328
        public void setParams(Params params) {
329
                this.params = params;
330
        }
331

    
332
        public boolean isLoadedInToc() {
333
          return loadedInToc;
334
  }
335

    
336
        public void setLoadedInToc(boolean loadedInToc) {
337
          this.loadedInToc = loadedInToc;
338
  }
339

    
340
        public int[] getDrawableBands() {
341
          return drawableBands;
342
  }
343

    
344
        public void setDrawableBands(int[] drawableBands) {
345
          this.drawableBands = drawableBands;
346
  }
347

    
348
        public boolean isOneLayerPerBand() {
349
          return oneLayerPerBand;
350
  }
351

    
352
        public void setOneLayerPerBand(boolean oneLayerPerBand) {
353
          this.oneLayerPerBand = oneLayerPerBand;
354
  }
355

    
356
        public int getInterpolationMethod() {
357
          return interpolationMethod;
358
  }
359

    
360
        public void setInterpolationMethod(int interpolationMethod) {
361
          this.interpolationMethod = interpolationMethod;
362
  }
363

    
364
        public AffineTransform getAffineTransform() {
365
          return affineTransform;
366
  }
367

    
368
        public void setAffineTransform(AffineTransform affineTransform) {
369
          this.affineTransform = affineTransform;
370
  }
371
}