Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.algorithm / org.gvsig.raster.tools.algorithm.saveraster / src / main / java / org / gvsig / raster / tools / algorithm / saveraster / SaveRasterProcess.java @ 1791

History | View | Annotate | Download (10.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.algorithm.saveraster;
23

    
24
import java.awt.Dimension;
25
import java.awt.geom.AffineTransform;
26
import java.io.File;
27
import java.io.IOException;
28
import java.util.Date;
29

    
30
import org.gvsig.fmap.dal.coverage.RasterLocator;
31
import org.gvsig.fmap.dal.coverage.RasterManager;
32
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
33
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
34
import org.gvsig.fmap.dal.coverage.datastruct.Params;
35
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
36
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
37
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
38
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
39
import org.gvsig.fmap.dal.coverage.process.TaskEventManager;
40
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
41
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
42
import org.gvsig.fmap.geom.primitive.Envelope;
43
import org.gvsig.fmap.mapcontext.ViewPort;
44
import org.gvsig.fmap.mapcontext.layers.FLayers;
45
import org.gvsig.raster.tools.algorithm.base.RasterBaseAlgorithmLibrary;
46
import org.gvsig.raster.tools.algorithm.base.process.ProcessException;
47
import org.gvsig.raster.tools.algorithm.base.process.RasterProcess;
48

    
49
/**
50
 * Thread que se encarga de llamar a los writer para realizar la tarea de
51
 * salvado y/p compresi?n
52
 *
53
 * @author Nacho Brodin (nachobrodin@gmail.com)
54
 */
55
public class SaveRasterProcess extends RasterProcess {
56
        public static String      VIEWPORT        = "ViewPort";
57
        public static String      PATH            = "Path";
58
        public static String      DIMENSION       = "Dimension";
59
        public static String      BLOCKSIZE       = "Blocksize";
60
        public static String      FILENAME        = "FileName";
61
        public static String      PARAMS          = "WriterParams";
62
        public static String      FLYRS           = "FLyrs";
63
        public static String      TIME            = "Time";
64
        
65
        private ViewPort          viewPort          = null;
66
        private Dimension         dimension         = null;
67
        private RasterizeFLayers  rasterizerLayer   = null;
68
        private String            fileName          = "";
69
        private Params            writerParams      = null;
70
        //private CopyDataset       jp2Copy           = null;
71
        private boolean           supportImage      = false;
72
        private RasterManager     rManager          = RasterLocator.getManager();
73
        //private Logger            logger            = LoggerFactory.getLogger(RasterProcess.class.toString());
74
        
75
        public static void registerParameters() {
76
                VIEWPORT = RasterBaseAlgorithmLibrary.registerInputParameter(VIEWPORT, ViewPort.class);
77
                PATH = RasterBaseAlgorithmLibrary.registerInputParameter(PATH, String.class);
78
                DIMENSION = RasterBaseAlgorithmLibrary.registerInputParameter(DIMENSION, Dimension.class);
79
                FLYRS = RasterBaseAlgorithmLibrary.registerInputParameter(FLYRS, FLayers.class);
80
                PARAMS = RasterBaseAlgorithmLibrary.registerInputParameter(PARAMS, Params.class);
81
                
82
                FILENAME = RasterBaseAlgorithmLibrary.registerOutputParameter(FILENAME, String.class);
83
                TIME = RasterBaseAlgorithmLibrary.registerOutputParameter(TIME, Long.class);
84
        }
85
        
86
        public void init() {
87
                viewPort =  getParam(VIEWPORT) != null ? (ViewPort)getParam(VIEWPORT) : null;
88
                dimension = getParam(DIMENSION) != null ? (Dimension) getParam(DIMENSION) : null;
89
                FLayers flyrs = getParam(FLYRS) != null ? (FLayers) getParam(FLYRS) : null;
90
                int blockSize = getIntParam(BLOCKSIZE);
91
                rasterizerLayer = new RasterizeFLayers(flyrs, viewPort, blockSize);
92
                fileName = getStringParam(FILENAME);
93
                writerParams = getParam(PARAMS) != null ? (Params) getParam(PARAMS) : null;
94
                //supportImage = getBooleanParam("remotelayers") && fileName.endsWith(".jp2");
95
        }
96

    
97
        /**
98
         * Procesos de escritura de una porci?n de la vista.
99
         */
100
        public void process() throws ProcessInterruptedException, ProcessException {
101
                TaskEventManager task = rManager.getRasterTask();
102
                
103
                //jp2Copy = null;
104
                long t2;
105
                long t1 = new java.util.Date().getTime();
106
                
107
                //Creamos el driver
108
                Envelope env = viewPort.getAdjustedEnvelope();
109
                Extent ex = rManager.getDataStructFactory().createExtent(env.getMinimum(0), env.getMaximum(1), env.getMaximum(0), env.getMinimum(1));
110
                Dimension imgSz = viewPort.getImageSize();
111
                ViewPortData vpData = rManager.createViewPortData(viewPort.getProjection(), ex, imgSz );
112
                AffineTransform at = new AffineTransform(vpData.getExtent().width() / imgSz.width,
113
                                                                                                 0, 0,
114
                                                                                                 -(vpData.getExtent().height() / imgSz.height),
115
                                                                                                 vpData.getExtent().getULX(),
116
                                                                                                 vpData.getExtent().getULY());
117
                String oldFileName = fileName;
118
                if(supportImage) {
119
                        fileName = fileName.substring(0, Math.min(fileName.lastIndexOf(File.separator) + 1, fileName.length() - 1));
120
                        fileName += rManager.getFileUtils().usesOnlyLayerName() + ".tif";
121
                        writerParams = getWriterParams(fileName);
122
                }
123

    
124
                //Ejecutamos el driver con los datos pasados
125
                try {
126
                        write(fileName, at, writerParams, rasterizerLayer);
127

    
128
                        if(task.getEvent() != null)
129
                                task.manageEvent(task.getEvent());
130
                        
131
                        /*if(supportImage) {
132
                                try {
133
                                        insertLineLog(Messages.getText("saving_jp2"));
134
                                        jp2Copy = new CopyDataset(fileName, oldFileName, incrementableTask);
135
                                        jp2Copy.copy();
136
                                        new File(fileName).delete();
137
                                        new File(rManager.getFileUtils().getRMFNameFromFileName(fileName)).delete();
138
                                } catch (LoadLayerException e) {
139
                                        throw new ProcessException("error_processing", e);
140
                                } 
141
                                jp2Copy = null;
142
                        } */
143
                        t2 = new Date().getTime();
144
                        try {
145
                                saveRasterFinalize(oldFileName, (t2 - t1));
146
                        } catch(ArrayIndexOutOfBoundsException exc) {
147
                                //Si la ventana se ha cerrado ya es porque ha sido cancelada por lo que
148
                                //producir? esta excepci?n. En este caso no se lanza la ventana de informaci?n
149
                                //de finalizaci?n.
150
                        }
151

    
152
                } catch(IOException ev) {
153
                        throw new ProcessException("error_processing", ev);
154
                } catch(OutOfMemoryError ev) {
155
                        throw new ProcessException("memoria_excedida", ev);
156
                } finally {
157
                        if (incrementableTask != null) {
158
                                incrementableTask.processFinalize();
159
                                incrementableTask = null;
160
                        }
161
                }
162
        }
163
        
164
        /**
165
         * 
166
         * @param name
167
         * @param at
168
         * @throws IOException
169
         * @throws ProcessException 
170
         * @throws InterruptedException
171
         */
172
        private void write(String name, AffineTransform at, Params writerParams, DataServerWriter rasterizerLayer) throws IOException, ProcessInterruptedException, ProcessException {
173
                //TODO: Usar el nuevo API basado en NewRasterStoreParameters y DataServerExplorer. Ejemplo en ClippingProcess
174
                
175
                TaskEventManager task = rManager.getRasterTask();
176
                RasterWriter geoRasterWriter = null;
177
                try {
178
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n de la vista
179
                        geoRasterWriter = rManager.createWriter(rasterizerLayer, name,
180
                                                                                                3, at, dimension.width,
181
                                                                                                dimension.height, Buffer.TYPE_IMAGE, writerParams, null);
182
                } catch (NotSupportedExtensionException e) {
183
                        throw new ProcessException("extension_no_soportada", e);
184
                } catch (RasterDriverException e) {
185
                        throw new ProcessException("no_driver_escritura", e);
186
                }
187
                
188
                if(task.getEvent() != null)
189
                        task.manageEvent(task.getEvent());
190
                
191
                geoRasterWriter.setCancellableRasterDriver(new ExternalCancellable(incrementableTask));
192
                geoRasterWriter.dataWrite();
193
                geoRasterWriter.writeClose();
194
        }
195
        
196
        /**
197
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
198
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
199
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
200
         * como si fuera la primera vez que se abre.
201
         * @param name Nombre del fichero sobre el que se salva.
202
         * @return WriterParams
203
         */
204
        private Params getWriterParams(String name) throws ProcessException {
205
                RasterWriter writer = null;
206
                String ext = rManager.getFileUtils().getExtensionFromFileName(name);
207
                try {
208
                        if(writer == null) //La primera vez que se obtiene el driver
209
                                writer = rManager.createWriter(name);
210
                        else {
211
                                String newType = rManager.getProviderServices().getWriteDriverType(ext);
212
                                String oldType = writer.getDriverName();
213
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
214
                                        writer = rManager.createWriter(name);
215
                        }
216

    
217
                        if(writer == null)
218
                                throw new ProcessException("no_driver_escritura");
219

    
220
                        return writer.getParams();
221

    
222
                } catch (NotSupportedExtensionException e1) {
223
                        throw new ProcessException("no_driver_escritura", e1);
224
                } catch (RasterDriverException e1) {
225
                        throw new ProcessException("no_driver_escritura", e1);
226
                }
227
        }
228

    
229
        /**
230
         * Acciones que se realizan al finalizar de salvar a raster.
231
         * @param fileName Nombre del fichero
232
         * @param milis Tiempo que ha tardado en ejecutarse
233
         */
234
        private void saveRasterFinalize(String fileName, long milis) {
235
                if (incrementableTask != null)
236
                        incrementableTask.hideWindow();
237
                externalActions.end(new Object[]{fileName, new Long(milis)});
238
        }
239

    
240
        /*
241
         * (non-Javadoc)
242
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getPercent()
243
         */
244
        public int getPercent() {
245
                if(rasterizerLayer != null)
246
                        return rasterizerLayer.getPercent();
247
                return 0;
248
        }
249

    
250
        /*
251
         * (non-Javadoc)
252
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getTitle()
253
         */
254
        public String getTitle() {
255
                if(rasterizerLayer != null)
256
                        return rasterizerLayer.getTitle();
257
                return null;
258
        }
259
        
260
        /*
261
         * (non-Javadoc)
262
         * @see org.gvsig.rastertools.RasterProcess#getLog()
263
         */
264
        public String getLog() {
265
                if(rasterizerLayer != null)
266
                        return rasterizerLayer.getLog();
267
                return null;
268
        }
269
        
270
        /*
271
         * (non-Javadoc)
272
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getLabel()
273
         */
274
        public String getLabel() {
275
                if(rasterizerLayer != null)
276
                        return rasterizerLayer.getLabel();
277
                return null;
278
        }
279
}