Statistics
| Revision:

gvsig-raster / org.gvsig.raster.gdal / branches / org.gvsig.raster.gdal_dataaccess_refactoring / org.gvsig.raster.gdal.io / src / main / java / org / gvsig / raster / gdal / io / GdalWriter.java @ 2440

History | View | Annotate | Download (26.2 KB)

1 488 nbrodin
/* 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.gdal.io;
23
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.io.File;
27
import java.io.IOException;
28
import java.util.ArrayList;
29
30
import org.cresques.cts.IProjection;
31
import org.gvsig.fmap.dal.coverage.RasterLibrary;
32
import org.gvsig.fmap.dal.coverage.RasterLocator;
33 1073 nbrodin
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
34 488 nbrodin
import org.gvsig.fmap.dal.coverage.datastruct.Params;
35
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
36
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
37
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
38
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
39 805 nbrodin
import org.gvsig.jgdal.Gdal;
40
import org.gvsig.jgdal.GdalBuffer;
41
import org.gvsig.jgdal.GdalDriver;
42
import org.gvsig.jgdal.GdalException;
43
import org.gvsig.jgdal.GdalRasterBand;
44
import org.gvsig.jgdal.GeoTransform;
45 488 nbrodin
import org.gvsig.raster.gdal.io.features.BMPFeatures;
46
import org.gvsig.raster.gdal.io.features.GTiffFeatures;
47
import org.gvsig.raster.gdal.io.features.HFAFeatures;
48
import org.gvsig.raster.gdal.io.features.IDRISIFeatures;
49
import org.gvsig.raster.gdal.io.features.ILWIS_MprFeatures;
50 2012 nbrodin
import org.gvsig.raster.gdal.io.features.Jpeg2000Features;
51 488 nbrodin
import org.gvsig.raster.gdal.io.features.PNM_PgmFeatures;
52
import org.gvsig.raster.gdal.io.features.PNM_PpmFeatures;
53 1073 nbrodin
import org.gvsig.raster.impl.buffer.DefaultDataServerWriter;
54 488 nbrodin
import org.gvsig.raster.impl.buffer.RasterBuffer;
55
import org.gvsig.raster.impl.process.RasterTask;
56
import org.gvsig.raster.impl.process.RasterTaskQueue;
57 761 nbrodin
import org.gvsig.raster.impl.store.ParamImpl;
58 488 nbrodin
import org.gvsig.raster.impl.store.ParamsImpl;
59
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
60
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
61
import org.gvsig.raster.impl.store.writer.DefaultRasterWriter;
62
import org.gvsig.raster.util.DefaultProviderServices;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.extensionpoint.ExtensionPoint;
65
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
66
67
68
/**
69
 * Driver para la escritura a trav?s de Gdal.
70
 * Puede exportar un fichero de un formato a otro desde un GeoRasterFile
71
 * en cualquier formato soportado por la lectura a un formato que este incluido
72
 * en la lista supportedDrv.
73
 *
74
 * Puede salvar a disco en un formato que este incluido en la lista supportedDrv
75
 * obteniendo los datos que van siendo servidos desde el cliente. Este cliente
76
 * debe implementar un DataServerWriter o tener un objeto que lo implemente. Inicialmente
77
 * le pasar? los par?metros de la imagen de salida y cuando el driver comience a
78
 * escribir le ir? solicitando m?s a trav?s del m?todo readData de DataServerWriter.
79
 * El cliente ser? el que lleve el control de lo que va sirviendo y lo que le queda
80
 * por servir.
81
 * @author Nacho Brodin (nachobrodin@gmail.com)
82
 */
83
public class GdalWriter extends DefaultRasterWriter {
84
85
        public static void register() {
86
                DefaultProviderServices pInfo = (DefaultProviderServices)RasterLocator.getManager().getProviderServices();
87
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
88
                ExtensionPoint point = extensionPoints.get("RasterWriter");
89
90
                point.append("tif", "", GdalWriter.class);
91
                pInfo.getFileFeature().put("tif", new GTiffFeatures());
92
93
                point.append("img", "", GdalWriter.class);
94
                pInfo.getFileFeature().put("img", new HFAFeatures());
95
96
                point.append("bmp", "", GdalWriter.class);
97
                pInfo.getFileFeature().put("bmp", new BMPFeatures());
98
99
                point.append("pgm", "", GdalWriter.class);
100
                pInfo.getFileFeature().put("pgm", new PNM_PgmFeatures());
101
102
                point.append("ppm", "", GdalWriter.class);
103
                pInfo.getFileFeature().put("ppm", new PNM_PpmFeatures());
104
105
                point.append("mpl", "", GdalWriter.class);
106
                pInfo.getFileFeature().put("mpl", new ILWIS_MprFeatures());
107
108
                point.append("rst", "", GdalWriter.class);
109
                pInfo.getFileFeature().put("rst", new IDRISIFeatures());
110 2012 nbrodin
111 2013 nbrodin
                /*point.append("jp2", "", GdalWriter.class);
112
                pInfo.getFileFeature().put("jp2", new Jpeg2000Features());*/
113 488 nbrodin
114
                //La exportaci?n no es correcta del todo
115
                //point.register("rmf", GdalWriter.class);
116
                //fileFeature.put("rmf", new RMFFeatures());
117
118
                //No salva datos. Siempre sale negra la imagen
119
                //point.register("aux", GdalWriter.class);
120
                //fileFeature.put("aux", new PAuxFeatures());
121
        }
122
123 805 nbrodin
        private GdalDriver                                 drv;
124 488 nbrodin
        private Gdal                                                         dstDataset = null;
125
        private GdalRasterBand                                         rband = null;
126
        private GeoTransform                                         geot = null; //Datos de georeferenciaci?n
127
        //private OGRSpatialReference                         oSRS; //Datos de proyecci?n
128
        private GdalBuffer[]                                        bufBands = null;
129
        private int                                                         nBlocks = 0; //N?mero de bloques en Y en el que se divide la imagen para escribir
130
        private int                                                         anchoResto = 0; //Tama?o del ?ltimo bloque de la imagen.
131
        private boolean                                                        write = true; //Cuando est? a true se puede escribir en la imagen de salida. Si est? a false el proceso es interrumpido
132
        private int                                                         dataType = RasterBuffer.TYPE_UNDEFINED;
133
134
        /**
135
         * Carga los par?metros de este driver.
136
         */
137
        public void loadParams(String ident) {
138
                WriteFileFormatFeatures wfff = (WriteFileFormatFeatures)pInfo.getFileFeature().get(ident);
139
                wfff.loadParams();
140
                driverParams = (ParamsImpl)wfff.getParams();
141
        }
142 1036 nbrodin
143
        public String getProviderName() {
144
                return GdalProvider.NAME;
145
        }
146 488 nbrodin
147
        /**
148
         * Constructor para la obtenci?n de par?metros del driver
149
         * @param drvType        Tipo de driver
150
         */
151
        public GdalWriter(String fileName) {
152
                ident = fileUtil.getExtensionFromFileName(fileName);
153
                driver = ((WriteFileFormatFeatures)pInfo.getFileFeature().get(ident)).getDriverName();
154
155
                loadParams(ident);
156
        }
157
158
        /**
159
         * Constructor para salvar datos servidos por el cliente
160
         * @param dataWriter               Objeto servidor de datos para el driver de escritura
161
         * @param outFilename              Fichero de salida
162
         * @param blockSize                Tama?o de bloque
163
         * @param Extent                   extent
164
         * @param compresion                   Compresi?n si la tiene
165
         * @param outSizeX                          Tama?o de salida en X
166
         * @param outSizeY                        Tama?o de salida en Y
167
         * @param dataType                        Tipo de dato
168
         * @throws GdalException
169
         * @throws IOException
170
         */
171
        public GdalWriter(        DataServerWriter dataWriter,
172
                        String outFileName,
173
                        Integer nBands,
174
                        AffineTransform at,
175
                        Integer outSizeX,
176
                        Integer outSizeY,
177
                        Integer dataType,
178
                        Params params,
179
                        IProjection proj) throws GdalException, IOException {
180
                this(dataWriter, outFileName, nBands, at, outSizeX, outSizeY, dataType, params, proj, new Boolean(true));
181
        }
182
183
        /**
184
         * Constructor para salvar datos servidos por el cliente
185
         * @param dataWriter               Objeto servidor de datos para el driver de escritura
186
         * @param outFilename              Fichero de salida
187
         * @param blockSize                Tama?o de bloque
188
         * @param Extent                   extent
189
         * @param compresion                   Compresi?n si la tiene
190
         * @param outSizeX                          Tama?o de salida en X
191
         * @param outSizeY                        Tama?o de salida en Y
192
         * @param dataType                        Tipo de dato
193
         * @param geo                                Flag que dice si se salva con georreferenciaci?n o sin ella
194
         * @throws GdalException
195
         * @throws IOException
196
         */
197
        public GdalWriter(        DataServerWriter dataWriter,
198
                        String outFileName,
199
                        Integer nBands,
200
                        AffineTransform at,
201
                        Integer outSizeX,
202
                        Integer outSizeY,
203
                        Integer dataType,
204
                        Params params,
205
                        IProjection proj,
206
                        Boolean geo)throws GdalException, IOException {
207
208
                this.proj = proj;
209
                ident = outFileName.toLowerCase().substring(outFileName.lastIndexOf(".") + 1);
210
                driver = ((WriteFileFormatFeatures)pInfo.getFileFeature().get(ident)).getDriverName();
211
                this.dataType = dataType.intValue();
212
                this.at = at;
213
                percent = 0;
214
215
                this.dataWriter = dataWriter;
216
                this.outFileName = outFileName;
217
218
                this.sizeWindowX = outSizeX.intValue();
219
                this.sizeWindowY = outSizeY.intValue();
220
221
                if ((sizeWindowX < 0) || (sizeWindowY < 0))
222
                        throw new IOException("Tama?o del fichero de salida erroneo.");
223
224
                this.nBands = nBands.intValue();
225
226
                //Calculamos la georeferenciaci?n a partir del extend pasado por el cliente.
227
228
                geot = new GeoTransform();
229
                geot.adfgeotransform[0] = at.getTranslateX();
230
                geot.adfgeotransform[3] = at.getTranslateY();
231
                geot.adfgeotransform[1] = at.getScaleX();
232
                geot.adfgeotransform[5] = at.getScaleY();
233
                geot.adfgeotransform[2] = at.getShearX();
234
                geot.adfgeotransform[4] = at.getShearY();
235
236
                String outRmf = outFileName.substring(0, outFileName.lastIndexOf("."));
237
                if(geo.booleanValue())
238
                        rasterUtil.saveGeoInfo(outRmf, at, new Point2D.Double(sizeWindowX, sizeWindowY));
239
240
                if(params == null)
241
                        loadParams(ident);
242
                else
243
                        if(params instanceof ParamsImpl)
244
                                this.driverParams = (ParamsImpl)params;
245
246
                init();
247
        }
248
249
        /**
250
         * A?ade la proyecci?n Wkt con la que salvar.
251
         * @param wkt
252
         * @throws GdalException
253
         */
254
        public void setWkt(String wkt) {
255
                if(dstDataset != null && wkt != null && wkt.compareTo("unknown") != 0)
256
                        try {
257
                                dstDataset.setProjection(wkt);
258
                        } catch (GdalException e) {
259
                                System.err.println("Proyecci?n Wkt no asignada en GdalWriter");
260
                                return;
261
                        }
262
        }
263
264
        /**
265
         * Asigna el tipo de driver con el que se salvar? la imagen
266
         * @param drvType        Tipo de driver
267
         */
268
        public void setDriverType(String drvType) {
269
                this.driver = drvType;
270
        }
271
272
        /**
273
         * Creaci?n del dataset de destino.
274
         * @throws EcwException
275
         */
276
        private void init() throws GdalException {
277
                //Controlamos que el tipo de driver sea correcto
278
                if (driver == null)
279
                        throw new GdalException("Tipo de driver sin especificar.");
280
281
                boolean okdrvtype = false;
282
283
                String[] types = pInfo.getWriteDriversType();
284
                for (int i = 0; i < pInfo.getWriteNTypes(); i++)
285
                        if (driver.equals(types[i]))
286
                                okdrvtype = true;
287
288
                if (okdrvtype == false)
289
                        throw new GdalException("El tipo de driver " + driver + " no est? soportado por GdalWriter.");
290
291
                //Obtenemos el driver y creamos el dataset del destino
292
                drv = Gdal.getDriverByName(driver);
293
294
                if (dstDataset != null) {
295
                        dstDataset.close();
296
                        dstDataset = null;
297
                }
298
299
                dstDataset = drv.create(outFileName, sizeWindowX, sizeWindowY,
300 1749 nbrodin
                                nBands, GdalNative.getGdalTypeFromRasterBufType(dataType), gdalParamsFromRasterParams(driverParams));
301 488 nbrodin
302
                dstDataset.setGeoTransform(geot);
303
304
                int blockSize = RasterLibrary.blockHeight;
305 1150 nbrodin
                if(dataWriter.getBuffer() != null && dataWriter.getBuffer().isCached())
306
                        blockSize = dataWriter.getBuffer().getBlockHeight();
307 488 nbrodin
308
                nBlocks = (sizeWindowY / blockSize);
309
                anchoResto = sizeWindowY - (nBlocks * blockSize);
310
        }
311
312
        public void anotherFile(String fileName)throws GdalException {
313
                dstDataset = drv.create(fileName, sizeWindowX, sizeWindowY,
314 1749 nbrodin
                                nBands, GdalNative.getGdalTypeFromRasterBufType(dataType), gdalParamsFromRasterParams(driverParams));
315 488 nbrodin
        }
316
317
        /**
318
         * Convierte los par?metros obtenidos desde el objeto params a parametros
319
         * comprensibles por la librer?a gdal
320
         * @param p Params
321
         * @return Array de par?metros
322
         */
323
        public String[] gdalParamsFromRasterParams(Params p) {
324
                if (p == null)
325
                        return null;
326
                ArrayList<String> paramList = new ArrayList<String>();
327
                ParamImpl phot = (ParamImpl)p.getParamById("photometric");
328
                if (phot != null)
329
                        paramList.add("PHOTOMETRIC=" + phot.getList()[((Integer) phot.getDefaultValue()).intValue()]);
330
                ParamImpl inter = (ParamImpl)p.getParamById("interleave");
331
                if (inter != null)
332
                        paramList.add("INTERLEAVE=" + inter.getList()[((Integer) inter.getDefaultValue()).intValue()]);
333
                ParamImpl comp = (ParamImpl)p.getParamById("compression");// GIF LZW, ...
334
                if (comp != null)
335
                        paramList.add("COMPRESS=" + comp.getList()[((Integer) comp.getDefaultValue()).intValue()]);
336
                ParamImpl comp1 = (ParamImpl)p.getParamById("compress"); // HFA (YES, NO)
337
                if (comp1 != null)
338
                        paramList.add("COMPRESS=" + comp1.getList()[((Integer) comp1.getDefaultValue()).intValue()]);
339
                ParamImpl rrd = (ParamImpl)p.getParamById("rrd");
340
                if (rrd != null)
341
                        paramList.add("HFA_USE_RRD=" + rrd.getList()[((Integer) rrd.getDefaultValue()).intValue()]);
342
                ParamImpl mtw = (ParamImpl)p.getParamById("Mtw");
343
                if (mtw != null)
344
                        paramList.add("MTW=" + mtw.getList()[((Integer) mtw.getDefaultValue()).intValue()]);
345
                ParamImpl tw = (ParamImpl)p.getParamById("Tile Width");
346
                if (tw != null)
347
                        paramList.add("BLOCKXSIZE=" + tw.getList()[((Integer) tw.getDefaultValue()).intValue()]);
348
                ParamImpl th = (ParamImpl)p.getParamById("Tile Height");
349
                if (th != null)
350
                        paramList.add("BLOCKYSIZE=" + th.getList()[((Integer) th.getDefaultValue()).intValue()]);
351
                ParamImpl qt = (ParamImpl)p.getParamById("quality");
352
                if (qt != null)
353
                        paramList.add("QUALITY=" + qt.getDefaultValue());
354
                ParamImpl prog = (ParamImpl)p.getParamById("progressive");
355
                if (prog != null)
356
                        paramList.add("PROGRESSIVE=" + prog.getDefaultValue());
357
358
                if (paramList.size() == 0)
359
                        return null;
360
361
                String[] result = new String[paramList.size()];
362
                for (int i = 0; i < result.length; i++)
363
                        result[i] = (String) paramList.get(i);
364
                return result;
365
        }
366
367
        /**
368
         * Escritura de datos tipo Byte.
369
         * @param sizeY Alto del bloque que se escribe.
370
         * @param posicionY Posici?ny a partir desde donde se comienza.
371
         */
372
        public void writeByteBand(int sizeY, int posicionY) {
373
                byte[][] buftmp = dataWriter.readByteData(sizeWindowX, sizeY);
374
                for(int iBand = 0; iBand < nBands; iBand ++)
375
                        bufBands[iBand].buffByte = new byte[buftmp[iBand].length];
376
377
                //Escribimos el bloque destino
378
                for (int iBand = 0; iBand < buftmp.length; iBand++)
379
                        for (int i = 0; i < buftmp[iBand].length; i++)
380
                                bufBands[iBand].buffByte[i] = buftmp[iBand][i];
381
382
                for (int iBand = 0; iBand < buftmp.length; iBand++)
383
                        try {
384
                                rband = dstDataset.getRasterBand(iBand + 1);
385
                                rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[iBand], Gdal.GDT_Byte);
386 1054 nbrodin
                                bufBands[iBand].buffByte = null;
387 488 nbrodin
                        } catch (GdalException e) {
388
                                //No se est? escribiendo ...
389
                        }
390 1054 nbrodin
                buftmp = null;
391
392 488 nbrodin
        }
393
394
        /**
395
         * Escritura de datos tipo Short.
396
         * @param sizeY Alto del bloque que se escribe.
397
         * @param posicionY Posici?ny a partir desde donde se comienza.
398
         */
399
        public void writeShortBand(int sizeY, int posicionY) {
400
                short[][] buftmp = dataWriter.readShortData(sizeWindowX, sizeY);
401
                for(int iBand = 0; iBand < nBands; iBand ++)
402
                        bufBands[iBand].buffShort = new short[buftmp[iBand].length];
403
404
                //Escribimos el bloque destino
405
                for (int iBand = 0; iBand < nBands; iBand++)
406
                        for (int i = 0; i < buftmp[iBand].length; i++)
407
                                bufBands[iBand].buffShort[i] = buftmp[iBand][i];
408
409
                for (int iBand = 0; iBand < nBands; iBand++)
410
                        try {
411
                                rband = dstDataset.getRasterBand(iBand + 1);
412
                                rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[iBand], Gdal.GDT_Int16);
413 1054 nbrodin
                                bufBands[iBand].buffShort = null;
414 488 nbrodin
                        } catch (GdalException e) {
415
                                //No se est? escribiendo ...
416
                        }
417 1054 nbrodin
                buftmp = null;
418 488 nbrodin
        }
419
420
        /**
421
         * Escritura de datos tipo Int.
422
         * @param sizeY Alto del bloque que se escribe.
423
         * @param posicionY Posici?ny a partir desde donde se comienza.
424
         */
425
        public void writeIntBand(int sizeY, int posicionY) {
426
                int[][] buftmp = dataWriter.readIntData(sizeWindowX, sizeY);
427
                for(int iBand = 0; iBand < nBands; iBand ++)
428
                        bufBands[iBand].buffInt = new int[buftmp[iBand].length];
429
430
                //Escribimos el bloque destino
431
                for (int iBand = 0; iBand < buftmp.length; iBand++)
432
                        for (int i = 0; i < buftmp[iBand].length; i++)
433
                                bufBands[iBand].buffInt[i] = buftmp[iBand][i];
434
435
                for (int iBand = 0; iBand < buftmp.length; iBand++)
436
                        try {
437
                                rband = dstDataset.getRasterBand(iBand + 1);
438
                                rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[iBand], Gdal.GDT_Int32);
439 1054 nbrodin
                                bufBands[iBand].buffInt = null;
440 488 nbrodin
                        } catch (GdalException e) {
441
                                //No se est? escribiendo ...
442
                        }
443 1054 nbrodin
                buftmp = null;
444 488 nbrodin
        }
445
446
        /**
447
         * Escritura de datos tipo Float.
448
         * @param sizeY Alto del bloque que se escribe.
449
         * @param posicionY Posici?ny a partir desde donde se comienza.
450
         */
451
        public void writeFloatBand(int sizeY, int posicionY) {
452
                float[][] buftmp = dataWriter.readFloatData(sizeWindowX, sizeY);
453
                for(int iBand = 0; iBand < nBands; iBand ++)
454
                        bufBands[iBand].buffFloat = new float[buftmp[iBand].length];
455
456
                //Escribimos el bloque destino
457
                for (int iBand = 0; iBand < buftmp.length; iBand++)
458
                        for (int i = 0; i < buftmp[iBand].length; i++)
459
                                bufBands[iBand].buffFloat[i] = buftmp[iBand][i];
460
461
                for (int iBand = 0; iBand < buftmp.length; iBand++)
462
                        try {
463
                                rband = dstDataset.getRasterBand(iBand + 1);
464
                                rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[iBand], Gdal.GDT_Float32);
465 1054 nbrodin
                                bufBands[iBand].buffFloat = null;
466 488 nbrodin
                        } catch (GdalException e) {
467
                                //No se est? escribiendo ...
468
                        }
469 1054 nbrodin
                buftmp = null;
470 488 nbrodin
        }
471
472
        /**
473
         * Escritura de datos tipo Double.
474
         * @param sizeY Alto del bloque que se escribe.
475
         * @param posicionY Posici?ny a partir desde donde se comienza.
476
         */
477
        public void writeDoubleBand(int sizeY, int posicionY) {
478
                double[][] buftmp = dataWriter.readDoubleData(sizeWindowX, sizeY);
479
                for(int iBand = 0; iBand < nBands; iBand ++)
480
                        bufBands[iBand].buffDouble = new double[buftmp[iBand].length];
481
482
                //Escribimos el bloque destino
483
                for (int iBand = 0; iBand < buftmp.length; iBand++)
484
                        for (int i = 0; i < buftmp[iBand].length; i++)
485
                                bufBands[iBand].buffDouble[i] = buftmp[iBand][i];
486
487
                for (int iBand = 0; iBand < buftmp.length; iBand++)
488
                        try {
489
                                rband = dstDataset.getRasterBand(iBand + 1);
490
                                rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[iBand], Gdal.GDT_Float64);
491 1054 nbrodin
                                bufBands[iBand].buffDouble = null;
492 488 nbrodin
                        } catch (GdalException e) {
493
                                //No se est? escribiendo ...
494
                        }
495 1054 nbrodin
                buftmp = null;
496 488 nbrodin
        }
497
        /**
498
         * Escritura para tipo de dato ARGB.
499
         * @param sizeY Alto del bloque que se escribe.
500
         * @param posicionY Posici?ny a partir desde donde se comienza.
501
         */
502
        public void writeARGBBand(int sizeY, int posicionY)
503
                        throws ProcessInterruptedException, OutOfMemoryError {
504
                int[] buftmp = dataWriter.readARGBData(sizeWindowX, sizeY, 0);
505
                for(int iBand = 0; iBand < nBands; iBand ++)
506
                        bufBands[iBand].buffByte = new byte[buftmp.length];
507
508
                //Escribimos el bloque destino
509
                for (int i = 0; i < buftmp.length; i++) {
510
                        bufBands[0].buffByte[i] = (byte) (((buftmp[i] & 0xff0000) >> 16) &
511
                                        0xff);
512
                        bufBands[1].buffByte[i] = (byte) (((buftmp[i] & 0xff00) >> 8) & 0xff);
513
                        bufBands[2].buffByte[i] = (byte) ((buftmp[i] & 0xff) & 0xff);
514
                }
515
516
                try {
517
                        rband = dstDataset.getRasterBand(1);
518
                        rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[0],
519
                                        Gdal.GDT_Byte);
520
                        rband = dstDataset.getRasterBand(2);
521
                        rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[1],
522
                                        Gdal.GDT_Byte);
523
                        rband = dstDataset.getRasterBand(3);
524
                        rband.writeRaster(0, posicionY, sizeWindowX, sizeY, bufBands[2],
525
                                        Gdal.GDT_Byte);
526
                } catch (GdalException e) {
527
                        e.printStackTrace();
528
                }
529 1054 nbrodin
530
                bufBands[0].buffByte = null;
531
                bufBands[1].buffByte = null;
532
                bufBands[2].buffByte = null;
533 488 nbrodin
        }
534
535
        /**
536
         * Escribe tres bandas en el GDALRasterBand desde el DataServerWriter con una
537
         * altura definida por sizeY.
538
         * @param buftmp        Buffer
539
         * @param sizeY        Altura en pixels del bloque leido
540
         * @param posicionY        Posici?n y a partir de la cual se escribe en el GDALRasterBand destino
541
         */
542
        private void writeBands(int sizeY, int posicionY)
543
                        throws ProcessInterruptedException, OutOfMemoryError {
544
                //leemos el bloque origen
545
546
                switch(dataType){
547
                case RasterBuffer.TYPE_IMAGE:
548
                        writeARGBBand(sizeY, posicionY);
549
                        break;
550
                case RasterBuffer.TYPE_BYTE:
551
                        writeByteBand(sizeY, posicionY);
552
                        break;
553
                case RasterBuffer.TYPE_SHORT:
554
                        writeShortBand(sizeY, posicionY);
555
                        break;
556
                case RasterBuffer.TYPE_INT:
557
                        writeIntBand(sizeY, posicionY);
558
                        break;
559
                case RasterBuffer.TYPE_FLOAT:
560
                        writeFloatBand(sizeY, posicionY);
561
                        break;
562
                case RasterBuffer.TYPE_DOUBLE:
563
                        writeDoubleBand(sizeY, posicionY);
564
                        break;
565
                }
566
        }
567
568
        /**
569
         * Funci?n que gestiona la lectura desde el origen y la escritura
570
         * de Gdal sobre el fichero destino.
571
         * @param mode        Modo de escritura
572
         * @throws IOException
573
         */
574
        private void write(int mode) throws IOException, ProcessInterruptedException,
575
                        OutOfMemoryError {
576 1419 nbrodin
                RasterTask task = RasterTaskQueue.get(Thread.currentThread().getId() + "");
577 488 nbrodin
                bufBands = new GdalBuffer[nBands];
578
                for(int iBand = 0; iBand < nBands; iBand ++)
579
                        bufBands[iBand] = new GdalBuffer();
580
581
                int blockSize = RasterLibrary.blockHeight;
582 1073 nbrodin
                if(dataWriter instanceof DefaultDataServerWriter) {
583
                        Buffer source = ((DefaultDataServerWriter)dataWriter).getSource();
584
                        if(source.isCached()) {
585
                                blockSize = source.getBlockHeight();
586
                        }
587
                }
588 488 nbrodin
589
                percent = 0;
590
                nBlocks = (sizeWindowY / blockSize);
591 1739 nbrodin
                double increment = (blockSize * 100) / (double)sizeWindowY;
592 488 nbrodin
593
                if (mode == DefaultRasterWriter.MODE_DATAWRITE)
594
                        for (int iBlock = 0; iBlock < nBlocks; iBlock++) {
595
                                if(task.getEvent() != null)
596
                                        task.manageEvent(task.getEvent());
597
                                int posicionY = iBlock * blockSize;
598
                                if(write)
599
                                        writeBands( blockSize, posicionY);
600 1739 nbrodin
                                percent = (int)((iBlock + 1) * increment);
601 488 nbrodin
                        }
602
603
                if (anchoResto != 0)
604
                        if (mode == DefaultRasterWriter.MODE_DATAWRITE) {
605
                                if(task.getEvent() != null)
606
                                        task.manageEvent(task.getEvent());
607
                                int posicionY = nBlocks * blockSize;
608
                                if(write)
609
                                        writeBands(anchoResto, posicionY);
610 1739 nbrodin
                                percent = (int)(nBlocks * increment);
611 488 nbrodin
                        }
612
613
        }
614
615
        /**
616
         * Realiza la funci?n de compresi?n a partir de un GeoRasterFile.
617
         * @throws IOException
618
         */
619
        public void fileWrite() throws IOException, ProcessInterruptedException {
620
                write(DefaultRasterWriter.MODE_FILEWRITE);
621
        }
622
623
        /**
624
         * Realiza una copia en el formato especificado.
625
         * @throws IOException
626
         */
627 805 nbrodin
        public static void createCopy(GdalDriver driverDst, String dst, String src,
628 488 nbrodin
                        boolean bstrict, String[] params) throws IOException, GdalException {
629
                if (dst == null || src == null)
630
                        throw new IOException("No se ha asignado un fichero de entrada.");
631
632
                GdalProvider gdalFile;
633
                try {
634
                        GdalDataParameters par = new GdalDataParameters();
635
                        par.setFile(new File(src));
636
                        gdalFile = new GdalProvider(par, null);
637
                        Gdal dstDataset = driverDst.createCopy(dst, gdalFile.getNative(), bstrict, params);
638
                        if(        dst.endsWith(".jpg") ||
639
                                dst.endsWith(".jpeg") ||
640
                                dst.endsWith(".png"))
641
                                RasterLocator.getManager().getFileUtils().createWorldFile(dst, gdalFile.getExtent(), (int)gdalFile.getWidth(), (int)gdalFile.getHeight());
642
                        gdalFile.close();
643
                        dstDataset.close();
644
                } catch (NotSupportedExtensionException e) {
645
                        e.printStackTrace();
646
                }
647
        }
648
649
        /**
650
         * Realiza la escritura de datos con los datos que le pasa el cliente.
651
         * @throws IOException
652
         * @throws RmfSerializerException
653
         */
654
        public void dataWrite() throws IOException, ProcessInterruptedException,
655
                        OutOfMemoryError {
656
                if (dataWriter == null)
657
                        throw new IOException("No se ha obtenido un objeto de entrada para la escritura valido.");
658
659
                write(DefaultRasterWriter.MODE_DATAWRITE);
660
661
                if (driverParams.getParamById("tfw") != null &&
662
                                ((ParamImpl)driverParams.getParamById("tfw")).getDefaultValue() instanceof Boolean &&
663
                                ((Boolean) ((ParamImpl)driverParams.getParamById("tfw")).getDefaultValue()).booleanValue() == true)
664
                        if (at != null)
665
                                fileUtil.createWorldFile(this.outFileName, at, sizeWindowX, sizeWindowY);
666
667
                if (colorInterp != null)
668
                        try {
669
                                RasterLocator.getManager().getProviderServices().saveObjectToRmfFile(outFileName, DataStoreColorInterpretation.class, colorInterp);
670
                        } catch (RmfSerializerException e) {
671
                                throw new IOException("No se ha podido guardar la interpretacion de color");
672
                        }
673
        }
674
675
        /**
676
         * Cancela el salvado de datos.
677
         * @throws GdalException
678
         */
679
        public void writeClose() {
680
                try {
681 1054 nbrodin
                        if(bufBands != null) {
682
                                for (int i = 0; i < bufBands.length; i++) {
683
                                        bufBands[i].buffAPalette = null;
684
                                        bufBands[i].buffBPalette = null;
685
                                        bufBands[i].buffByte = null;
686
                                        bufBands[i].buffShort = null;
687
                                        bufBands[i].buffInt = null;
688
                                        bufBands[i].buffFloat = null;
689
                                        bufBands[i].buffDouble = null;
690
                                }
691
                        }
692
693 488 nbrodin
                        if(dstDataset != null)
694
                                dstDataset.close();
695
                } catch (GdalException e) {
696
                        e.printStackTrace();
697
                }
698
        }
699 1054 nbrodin
700 488 nbrodin
        /**
701
         * Cancela el salvado de datos.
702
         */
703
        public void writeCancel() {
704
                write = false;
705
        }
706
707
        /**
708
         * Obtiene el valor a la variable write que estar? a true cuando se est? escribiendo
709
         *  o puede escribirse la imagen de salida. El cancelar la operaci?n de escritura
710
         * pondr? esta variable a false deteniendose la escritura y cerrandose el dataset
711
         * de salida.
712
         * @return True si puede escribirse y false si no puede
713
         */
714
        public boolean isWrite() {
715
                return write;
716
        }
717
718
        /**
719
         * Asigna el valor a la variable write que estar? a true cuando se est? escribiendo
720
         *  o puede escribirse la imagen de salida. El cancelar la operaci?n de escritura
721
         * pondr? esta variable a false deteniendose la escritura y cerrandose el dataset
722
         * de salida.
723
         * @param write Variable booleana. True si puede escribirse y false si no puede
724
         */
725
        public void setWrite(boolean write) {
726
                this.write = write;
727
        }
728
729
        /**
730
         * Asigna los par?metros del driver modificados por el cliente.
731
         * @param Params
732
         */
733
        public void setParams(Params params) {
734
                if(params instanceof ParamsImpl)
735
                        this.driverParams = (ParamsImpl)params;
736
                else
737
                        return;
738
739
                int blockSize = 256;
740
                try {
741
                        ParamImpl param = (ParamImpl)driverParams.getParamById("blocksize");
742
                        blockSize = Integer.parseInt(param.getList()[((Integer)param.getDefaultValue()).intValue()]);
743
                        nBlocks = (sizeWindowY / blockSize);
744
                        anchoResto = sizeWindowY - (nBlocks * blockSize);
745
                }catch(NumberFormatException e) {
746
                        //Se queda con el valor de inicializaci?n
747
                }
748
        }
749 1054 nbrodin
750
        /*
751
         * (non-Javadoc)
752
         * @see java.lang.Object#finalize()
753
         */
754
        protected void finalize() throws Throwable {
755
                drv        = null;
756
                dstDataset = null;
757
                rband      = null;
758
                geot       = null;
759
                if(bufBands != null) {
760
                        for (int i = 0; i < bufBands.length; i++) {
761
                                bufBands[i].buffAPalette = null;
762
                                bufBands[i].buffBPalette = null;
763
                                bufBands[i].buffByte = null;
764
                                bufBands[i].buffShort = null;
765
                                bufBands[i].buffInt = null;
766
                                bufBands[i].buffFloat = null;
767
                                bufBands[i].buffDouble = null;
768
                        }
769
                }
770
                super.finalize();
771
        }
772 488 nbrodin
}