Statistics
| Revision:

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

History | View | Annotate | Download (7.04 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.io.IOException;
22

    
23
import org.gvsig.gui.beans.incrementabletask.IncrementableEvent;
24
import org.gvsig.gui.beans.incrementabletask.IncrementableListener;
25
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
26
import org.gvsig.raster.buffer.BufferFactory;
27
import org.gvsig.raster.buffer.BufferInterpolation;
28
import org.gvsig.raster.buffer.RasterBuffer;
29
import org.gvsig.raster.dataset.GeoRasterWriter;
30
import org.gvsig.raster.dataset.IBuffer;
31
import org.gvsig.raster.dataset.InvalidSetViewException;
32
import org.gvsig.raster.dataset.NotSupportedExtensionException;
33
import org.gvsig.raster.dataset.RasterDriverException;
34
import org.gvsig.raster.dataset.MultiRasterDataset;
35
import org.gvsig.raster.shared.Extent;
36
import org.gvsig.rastertools.cutting.ui.listener.CuttingPanelListener;
37
/**
38
 * <code>CuttingProcess</code> es un proceso que usa un <code>Thread</code>
39
 * para calcular el recorte de una capa.
40
 * 
41
 * @version 24/04/2007
42
 * @author Borja S?nchez Zamorano (borja.sanchez@iver.es)
43
 */
44
public class CuttingProcess implements Runnable, IncrementableListener {
45
        private String                                         fileName = "";
46
        private IncrementableTask                incrementableTask = null;
47
        private volatile Thread                        blinker = null;
48
        private WriterBufferServer                writerBufferServer = null;
49
        private MultiRasterDataset                rasterMultiDataset = null;
50
        private Extent                                        extent = null;
51
        private boolean                                        oneLayerPerBand = false;
52
        private int[]                                        drawableBands = null;
53
        private CuttingPanelListener        cuttingPanelListener = null;
54
        private int[]                                        dValues = null;
55
        private boolean                                        cancel = false;
56
        private GeoRasterWriter                 grw = null;
57
        private int                                                interpMethod = BufferInterpolation.INTERPOLATION_Undefined;
58
        
59
        /**
60
         * Variables de la resoluci?n de salida
61
         */
62
        private int                                                resolutionWidth = 0, resolutionHeight = 0;
63

    
64
        /**
65
         * Crea un <code>CuttingProcess</code> para generar un recorte
66
         * @param cuttingPanelListener
67
         * @param dValues
68
         * @param fileName
69
         * @param writerBufferServer
70
         * @param rasterMultiDataset
71
         * @param extent
72
         * @param drawableBands
73
         * @param oneLayerPerBand
74
         */
75
        public CuttingProcess(CuttingPanelListener cuttingPanelListener, int[] dValues, String fileName, 
76
                                                        WriterBufferServer writerBufferServer, MultiRasterDataset rasterMultiDataset, 
77
                                                        Extent extent, int[] drawableBands, boolean oneLayerPerBand, int interpMethod) {
78
                this.fileName = fileName;
79
                this.writerBufferServer = writerBufferServer;
80
                this.rasterMultiDataset = rasterMultiDataset;
81
                this.extent = extent;
82
                this.oneLayerPerBand = oneLayerPerBand;
83
                this.drawableBands = drawableBands;
84
                this.cuttingPanelListener = cuttingPanelListener;
85
                this.dValues = dValues;
86
                this.interpMethod = interpMethod;
87
        }
88
        
89
        /**
90
         * Arranca el proceso de recorte de un layer
91
         */
92
        public void start() {
93
                cancel = false;
94
                blinker = new Thread(this);
95
                blinker.start();
96
        }
97

    
98
        /**
99
         * Establecer la resolucion de salida al crear el recorte
100
         * @param width
101
         * @param height
102
         */
103
        public void setResolution(int width, int height) {
104
                resolutionWidth = width;
105
                resolutionHeight = height;
106
        }
107

    
108
        /**
109
         * M?todo donde se ejecutar? el Thread, aqu? se genera el recorte
110
         */
111
        public void run() {
112
                try {
113
                        BufferFactory bufferFactory = new BufferFactory(rasterMultiDataset);
114
                        bufferFactory.clearDrawableBand();
115
                        bufferFactory.addDrawableBands(drawableBands);
116
                        
117
                        if(cancel)
118
                                return;
119
                        
120
                        IBuffer buffer = null;
121
                                
122
                        if(        interpMethod != BufferInterpolation.INTERPOLATION_Undefined &&
123
                                interpMethod != BufferInterpolation.INTERPOLATION_NearestNeighbour) {
124
                                bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3]);
125
                                buffer = bufferFactory.getRasterBuf();
126
                                buffer = ((RasterBuffer)buffer).getAdjustedWindow(resolutionWidth, resolutionHeight, interpMethod);
127
                        } else {
128
                                try {
129
                                        bufferFactory.setAreaOfInterest(dValues[0], dValues[3], dValues[2] - dValues[0], dValues[1] - dValues[3], resolutionWidth, resolutionHeight);
130
                                        buffer = bufferFactory.getRasterBuf();
131
                                } catch (InvalidSetViewException e) {
132
                                        e.printStackTrace();
133
                                }
134
                        }
135
                        
136
                        if (oneLayerPerBand) {
137
                                for (int i = 0; i < drawableBands.length; i++) {
138
                                        if(cancel)
139
                                                return;
140
                                        String f = fileName + "_B" + drawableBands[i] + ".tif";
141
                                        writerBufferServer.setBuffer(buffer, i);
142
                                        grw = GeoRasterWriter.getWriter(writerBufferServer, f,
143
                                                        1, extent, buffer.getWidth(), buffer.getHeight(),
144
                                                        buffer.getDataType(), GeoRasterWriter.getWriter(f).getParams());
145
                                        grw.dataWrite();
146
                                        grw.writeClose();
147
                                        if(!cancel)
148
                                                cuttingPanelListener.cutFinalize(f);
149
                                }
150
                        } else {
151
                                writerBufferServer.setBuffer(buffer, -1);
152
                                grw = GeoRasterWriter.getWriter(writerBufferServer, fileName + ".tif",
153
                                                buffer.getBandCount(), extent, buffer.getWidth(), buffer.getHeight(),
154
                                                buffer.getDataType(), GeoRasterWriter.getWriter(fileName + ".tif").getParams());
155
                                grw.dataWrite();
156
                                grw.writeClose();
157
                                if(!cancel)
158
                                        cuttingPanelListener.cutFinalize(fileName + ".tif");
159
                        }
160
                } catch (NotSupportedExtensionException e) {
161
                        e.printStackTrace();
162
                } catch (RasterDriverException e) {
163
                        e.printStackTrace();
164
                } catch (IOException e) {
165
                        e.printStackTrace();
166
                }
167
                
168
                if (incrementableTask != null)
169
                        incrementableTask.processFinalize();
170
        }
171

    
172
        /**
173
         * Establece el <code>IncrementableTask</code>
174
         * @param value
175
         */
176
        public void setIncrementableTask(IncrementableTask value) {
177
                incrementableTask = value;
178
                incrementableTask.addIncrementableListener(this);
179
        }
180

    
181
        /*
182
         * (non-Javadoc)
183
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionCanceled(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
184
         */
185
        public void actionCanceled(IncrementableEvent e) {
186
                if(writerBufferServer != null)
187
                        writerBufferServer.setCanceled(true, 0);
188
                if(grw != null)
189
                        grw.writeCancel();
190
                cancel = true;
191
        }
192

    
193
        /*
194
         * (non-Javadoc)
195
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionResumed(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
196
         */
197
        public void actionResumed(IncrementableEvent e) {
198
        }
199

    
200
        /*
201
         * (non-Javadoc)
202
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionSuspended(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
203
         */
204
        public void actionSuspended(IncrementableEvent e) {
205
        }
206
}