Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extRasterTools-SE / src / org / gvsig / rastertools / saveraster / operations / SaveRasterProcess.java @ 30008

History | View | Annotate | Download (9.62 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
*
3
* Copyright (C) 2007 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.saveraster.operations;
20

    
21
import java.awt.Component;
22
import java.awt.Dimension;
23
import java.awt.geom.AffineTransform;
24
import java.io.File;
25
import java.io.IOException;
26
import java.util.ArrayList;
27
import java.util.Date;
28

    
29
import javax.swing.JOptionPane;
30

    
31
import org.gvsig.andami.PluginServices;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.fmap.mapcontext.ViewPort;
34
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
35
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
36
import org.gvsig.raster.RasterLibrary;
37
import org.gvsig.raster.RasterProcess;
38
import org.gvsig.raster.dataset.GeoRasterWriter;
39
import org.gvsig.raster.dataset.IBuffer;
40
import org.gvsig.raster.dataset.IDataWriter;
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.datastruct.Extent;
45
import org.gvsig.raster.datastruct.ViewPortData;
46
import org.gvsig.raster.process.RasterTask;
47
import org.gvsig.raster.process.RasterTaskQueue;
48
import org.gvsig.raster.util.RasterToolsUtil;
49
import org.gvsig.raster.util.RasterUtilities;
50

    
51
/**
52
 * Thread que se encarga de llamar a los writer para realizar la tarea de
53
 * salvado y/p compresi?n
54
 *
55
 * @author Nacho Brodin (nachobrodin@gmail.com)
56
 */
57
public class SaveRasterProcess extends RasterProcess {
58
        private ViewPort          viewPort          = null;
59
        private Dimension         dimension         = null;
60
        private RasterizerLayer   rasterizerLayer   = null;
61
        private String            fileName          = "";
62
        private Params            writerParams      = null;
63
        private CopyDataset       jp2Copy           = null;
64
        private boolean           supportImage      = false;
65
        private ArrayList<FLyrRasterSE>
66
                              layers            = null;
67
        /*
68
         * (non-Javadoc)
69
         * @see org.gvsig.rastertools.RasterProcess#init()
70
         */
71
        @SuppressWarnings("unchecked")
72
        public void init() {
73
                viewPort = (ViewPort) getParam("viewport");
74
                dimension = (Dimension) getParam("dimension");
75
                rasterizerLayer = (RasterizerLayer) getParam("rasterizerlayer");
76
                fileName = getStringParam("filename");
77
                writerParams = (Params) getParam("writerparams");
78
                supportImage = getBooleanParam("remotelayers") && fileName.endsWith(".jp2");
79
                layers = (ArrayList<FLyrRasterSE>) getParam("layers");
80
        }
81

    
82
        /**
83
         * Procesos de escritura de una porci?n de la vista.
84
         */
85
        public void process() throws InterruptedException {
86
                RasterTask task = RasterTaskQueue.get(Thread.currentThread().toString());
87
                if(layers != null) {
88
                        for (int i = 0; i < layers.size(); i++) 
89
                                layers.get(i).setReadingData(Thread.currentThread().toString());
90
                }
91
                
92
                jp2Copy = null;
93
                long t2;
94
                long t1 = new java.util.Date().getTime();
95
                
96
                //Creamos el driver
97
                Envelope env = viewPort.getAdjustedExtent();
98
                Extent ex = new Extent(env.getMinimum(0), env.getMaximum(1), env.getMaximum(0), env.getMinimum(1));
99
                Dimension imgSz = viewPort.getImageSize();
100
                ViewPortData vpData = new ViewPortData(viewPort.getProjection(), ex, imgSz );
101
                AffineTransform at = new AffineTransform(vpData.getExtent().width() / imgSz.width,
102
                                                                                                 0, 0,
103
                                                                                                 -(vpData.getExtent().height() / imgSz.height),
104
                                                                                                 vpData.getExtent().getULX(),
105
                                                                                                 vpData.getExtent().getULY());
106
                String oldFileName = fileName;
107
                if(supportImage) {
108
                        fileName = fileName.substring(0, Math.min(fileName.lastIndexOf(File.separator) + 1, fileName.length() - 1));
109
                        fileName += RasterLibrary.usesOnlyLayerName() + ".tif";
110
                        writerParams = getWriterParams(fileName);
111
                }
112

    
113
                //Ejecutamos el driver con los datos pasados
114
                try {
115
                        write(fileName, at, writerParams, rasterizerLayer);
116

    
117
                        if(task.getEvent() != null)
118
                                task.manageEvent(task.getEvent());
119
                        
120
                        if(supportImage) {
121
                                try {
122
                                        insertLineLog(RasterToolsUtil.getText(this, "saving_jp2"));
123
                                        jp2Copy = new CopyDataset(fileName, oldFileName, incrementableTask);
124
                                        jp2Copy.copy();
125
                                        new File(fileName).delete();
126
                                        new File(RasterUtilities.getRMFNameFromFileName(fileName)).delete();
127
                                } catch (LoadLayerException e) {
128
                                }
129
                                jp2Copy = null;
130
                        } 
131
                        t2 = new Date().getTime();
132
                        try {
133
                                saveRasterFinalize(oldFileName, (t2 - t1));
134
                        } catch(ArrayIndexOutOfBoundsException exc) {
135
                                //Si la ventana se ha cerrado ya es porque ha sido cancelada por lo que
136
                                //producir? esta excepci?n. En este caso no se lanza la ventana de informaci?n
137
                                //de finalizaci?n.
138
                        }
139

    
140
                } catch(IOException ev) {
141
                        if (incrementableTask != null) {
142
                                incrementableTask.processFinalize();
143
                                incrementableTask = null;
144
                        }
145
                        RasterToolsUtil.messageBoxError("error_processing", this, ev);
146
                        return;
147
                } catch(OutOfMemoryError ev) {
148
                        if (incrementableTask != null) {
149
                                incrementableTask.processFinalize();
150
                                incrementableTask = null;
151
                        }
152
                        RasterToolsUtil.messageBoxError("memoria_excedida", this, new IOException("Out of memory en salvar a raster"));
153
                } finally {
154
                        if(layers != null) {
155
                                for (int i = 0; i < layers.size(); i++) 
156
                                        layers.get(i).setReadingData(null);
157
                        }
158
                }
159
        }
160
        
161
        /**
162
         * 
163
         * @param name
164
         * @param at
165
         * @throws IOException
166
         * @throws InterruptedException
167
         */
168
        private void write(String name, AffineTransform at, Params writerParams, IDataWriter rasterizerLayer) throws IOException, InterruptedException {
169
                RasterTask task = RasterTaskQueue.get(Thread.currentThread().toString());
170
                GeoRasterWriter geoRasterWriter = null;
171
                try {
172
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n de la vista
173
                        geoRasterWriter = GeoRasterWriter.getWriter(rasterizerLayer, name,
174
                                                                                                3, at, dimension.width,
175
                                                                                                dimension.height, IBuffer.TYPE_IMAGE, writerParams, null);
176
                } catch (NotSupportedExtensionException e) {
177
                        RasterToolsUtil.messageBoxError("extension_no_soportada", (Component)PluginServices.getMainFrame(), e);
178
                } catch (RasterDriverException e) {
179
                        RasterToolsUtil.messageBoxError("no_driver_escritura", (Component)PluginServices.getMainFrame(), e);
180
                }
181
                
182
                if(task.getEvent() != null)
183
                        task.manageEvent(task.getEvent());
184
                
185
                geoRasterWriter.setCancellableRasterDriver(new ExternalCancellable(incrementableTask));
186
                geoRasterWriter.dataWrite();
187
                geoRasterWriter.writeClose();
188
        }
189
        
190
        /**
191
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
192
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
193
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
194
         * como si fuera la primera vez que se abre.
195
         * @param name Nombre del fichero sobre el que se salva.
196
         * @return WriterParams
197
         */
198
        private Params getWriterParams(String name) {
199
                GeoRasterWriter writer = null;
200
                String ext = RasterUtilities.getExtensionFromFileName(name);
201
                try {
202
                        if(writer == null) //La primera vez que se obtiene el driver
203
                                writer = GeoRasterWriter.getWriter(name);
204
                        else {
205
                                String newType = GeoRasterWriter.getDriverType(ext);
206
                                String oldType = writer.getDriverName();
207
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
208
                                        writer = GeoRasterWriter.getWriter(name);
209
                        }
210

    
211
                        if(writer == null)
212
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
213

    
214
                        return writer.getParams();
215

    
216
                } catch (NotSupportedExtensionException e1) {
217
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
218
                        return null;
219
                } catch (RasterDriverException e1) {
220
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
221
                        return null;
222
                }
223
        }
224

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

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

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