Statistics
| Revision:

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

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

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

    
93
        /**
94
         * Establecer la resolucion de salida al crear el recorte
95
         * @param width
96
         * @param height
97
         */
98
        public void setResolution(int width, int height) {
99
                resolutionWidth = width;
100
                resolutionHeight = height;
101
        }
102

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

    
155
        /**
156
         * Establece el <code>IncrementableTask</code>
157
         * @param value
158
         */
159
        public void setIncrementableTask(IncrementableTask value) {
160
                incrementableTask = value;
161
                incrementableTask.addIncrementableListener(this);
162
        }
163

    
164
        /*
165
         * (non-Javadoc)
166
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionCanceled(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
167
         */
168
        public void actionCanceled(IncrementableEvent e) {
169
                if(writerBufferServer != null)
170
                        writerBufferServer.setCanceled(true, 0);
171
                if(grw != null)
172
                        grw.writeCancel();
173
                cancel = true;
174
        }
175

    
176
        /*
177
         * (non-Javadoc)
178
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionResumed(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
179
         */
180
        public void actionResumed(IncrementableEvent e) {
181
        }
182

    
183
        /*
184
         * (non-Javadoc)
185
         * @see org.gvsig.gui.beans.incrementabletask.IncrementableListener#actionSuspended(org.gvsig.gui.beans.incrementabletask.IncrementableEvent)
186
         */
187
        public void actionSuspended(IncrementableEvent e) {
188
        }
189
}