Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / DefaultRasterStore.java @ 1793

History | View | Annotate | Download (57 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.impl.store;
23

    
24
import java.awt.Image;
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.Point2D;
27
import java.awt.geom.Rectangle2D;
28
import java.util.ArrayList;
29
import java.util.Collection;
30
import java.util.List;
31

    
32
import org.cresques.cts.IProjection;
33
import org.gvsig.compat.net.ICancellable;
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataStoreParameters;
36
import org.gvsig.fmap.dal.coverage.RasterLibrary;
37
import org.gvsig.fmap.dal.coverage.RasterLocator;
38
import org.gvsig.fmap.dal.coverage.RasterManager;
39
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
40
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
41
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
42
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
43
import org.gvsig.fmap.dal.coverage.datastruct.GeoPointList;
44
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
45
import org.gvsig.fmap.dal.coverage.datastruct.Params;
46
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
47
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
48
import org.gvsig.fmap.dal.coverage.exception.CloneException;
49
import org.gvsig.fmap.dal.coverage.exception.FileNotExistsException;
50
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
51
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
52
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
53
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
54
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
55
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
56
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
57
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
58
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
59
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
60
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
61
import org.gvsig.fmap.dal.coverage.exception.TimeException;
62
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
63
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
64
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
65
import org.gvsig.fmap.dal.coverage.grid.render.Render;
66
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
67
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
68
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
69
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
70
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
71
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
72
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
73
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
74
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
75
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
76
import org.gvsig.fmap.dal.exception.InitializeException;
77
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
78
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
79
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
80
import org.gvsig.fmap.dal.spi.DataStoreProvider;
81
import org.gvsig.raster.cache.tile.Tile;
82
import org.gvsig.raster.cache.tile.TileCacheLocator;
83
import org.gvsig.raster.cache.tile.TileCacheManager;
84
import org.gvsig.raster.cache.tile.exception.TileGettingException;
85
import org.gvsig.raster.impl.DefaultRasterManager;
86
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
87
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
88
import org.gvsig.raster.impl.datastruct.BandListImpl;
89
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
90
import org.gvsig.raster.impl.datastruct.ExtentImpl;
91
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
92
import org.gvsig.raster.impl.provider.RasterProvider;
93
import org.gvsig.raster.impl.provider.TiledRasterProvider;
94
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
95
import org.gvsig.raster.util.persistence.PersistencyFilterParam;
96
import org.gvsig.timesupport.Interval;
97
import org.gvsig.timesupport.Time;
98
import org.gvsig.tools.ToolsLocator;
99
import org.gvsig.tools.dynobject.DynStruct;
100
import org.gvsig.tools.persistence.PersistenceManager;
101
import org.gvsig.tools.persistence.PersistentState;
102
import org.gvsig.tools.persistence.exception.PersistenceException;
103

    
104
/**
105
 * Default data store for raster
106
 *
107
 * @author Nacho Brodin (nachobrodin@gmail.com)
108
 */
109
public class DefaultRasterStore extends AbstractRasterDataStore {
110
        public static final String              PERSISTENT_NAME        = "DefaultRasterStore_Persistent";
111
    public static final String              PERSISTENT_DESCRIPTION = "DefaultRasterStore Persistent";
112
    
113
        protected RasterProvider                provider               = null;
114
        protected BandListImpl                  bandList               = new BandListImpl();
115
        protected Metadata                      metadata               = null;
116
        private RasterManager                   rManager               = RasterLocator.getManager();
117
        
118
        /**
119
         * Flag que fuerza al buffer en memoria
120
         */
121
        protected boolean                       forceToMemory = false;
122
        
123
        public DefaultRasterStore() {
124
                super();
125
        }
126

    
127
        public void setProvider(RasterProvider provider) {
128
                this.provider = provider;
129
                parameters = (DataStoreParameters)provider.getDataParameters();
130
                bandList.clear();
131
                for(int i = 0; i < provider.getBandCount(); i++) {
132
                        try {
133
                                int dataType = provider.getDataType()[i];
134
                                DatasetBand band = new DatasetBandImpl(provider.getURIByBand(i), 
135
                                                                                                        provider.getBandPositionByProvider(i), 
136
                                                                                                        dataType, 
137
                                                                                                        provider.getBandCount());
138
                                bandList.addBand(band, i);
139
                        } catch(BandNotFoundInListException ex) {
140
                                //No a?adimos la banda
141
                        }
142
                }
143
        }
144
        
145
        /*
146
         * (non-Javadoc)
147
         * @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase2(org.gvsig.fmap.dal.spi.DataStoreProvider)
148
         */
149
        public void intializePhase2(DataStoreProvider provider)
150
                        throws InitializeException {
151
                setProvider((RasterProvider)provider);
152
        }
153
        
154
        /*
155
         * (non-Javadoc)
156
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setParameters(org.gvsig.fmap.dal.DataStoreParameters)
157
         */
158
        public void setParameters(DataStoreParameters p) {
159
                this.parameters = p;
160
        }
161
        
162
        /*
163
         * (non-Javadoc)
164
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setProvider(org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider)
165
         */
166
        public void setProvider(CoverageStoreProvider prov) {
167
                if(prov instanceof RasterProvider)
168
                        setProvider((RasterProvider)prov);
169
        }
170
        
171
        /*
172
         * (non-Javadoc)
173
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getName()
174
         */
175
        public String getName() {
176
                if(provider != null)
177
                        return provider.getURI();
178
                return null;
179
        }
180
        
181
        /*
182
         * (non-Javadoc)
183
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#needEnhanced()
184
         */
185
        public boolean needEnhanced() {
186
                if(provider != null)
187
                        return provider.needEnhanced();
188
                return false;
189
        }
190

    
191
        /**
192
         * Inicializa el buffer a valores NoData
193
         * @param raster Buffer a inicializar
194
         * @param bandList Lista de bandas
195
         */
196
        private void initBufferToNoData(Buffer buf, BandList bandList) {
197
                for(int i = 0; i < bandList.getDrawableBandsCount(); i++) {
198
                        switch(getDataType()[0]) {
199
                        case Buffer.TYPE_BYTE:buf.assign(i, 
200
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().byteValue() : RasterLibrary.defaultByteNoDataValue);
201
                        break;
202
                        case Buffer.TYPE_SHORT:buf.assign(i, 
203
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().shortValue() : RasterLibrary.defaultShortNoDataValue);
204
                        break;
205
                        case Buffer.TYPE_INT:buf.assign(i, 
206
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().intValue() : RasterLibrary.defaultIntegerNoDataValue);
207
                        break;
208
                        case Buffer.TYPE_FLOAT:buf.assign(i, 
209
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().floatValue() : RasterLibrary.defaultFloatNoDataValue);
210
                        break;
211
                        case Buffer.TYPE_DOUBLE:buf.assign(i, 
212
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().doubleValue() : RasterLibrary.defaultDoubleNoDataValue);
213
                        break;
214
                        }
215
                }
216
        }
217
        
218
        /*
219
         * (non-Javadoc)
220
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isTiled()
221
         */
222
        public boolean isTiled() {
223
                return provider.isTiled();
224
        }
225
        
226
        /*
227
         * (non-Javadoc)
228
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isMosaic()
229
         */
230
        public boolean isMosaic() {
231
                return provider.isMosaic();
232
        }
233
        
234
        /*
235
         * (non-Javadoc)
236
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, boolean)
237
         */
238
        public Buffer getWindowWithoutResampling(DefaultRasterQuery q)
239
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
240
                
241
                //El incremento o decremento de las X e Y depende de los signos de rotaci?n y escala en la matriz de transformaci?n. Por esto
242
                //tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
243
                Extent ext = getExtent();
244
                Point2D pInit = provider.rasterToWorld(new Point2D.Double(0, 0));
245
                Point2D pEnd = provider.rasterToWorld(new Point2D.Double((int)getWidth(), (int)getHeight()));
246
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
247
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
248
                double lrx = (((int)(ext.getULX() - wRaster)) == ((int)ext.getLRX())) ? (q.getX() - q.getW()) : (q.getX() + q.getW());
249
                double lry = (((int)(ext.getULY() - hRaster)) == ((int)ext.getLRY())) ? (q.getY() - q.getH()) : (q.getY() + q.getH());
250

    
251
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
252

    
253
                //Leemos pixels completos aunque el valor obtenido sea decimal. Esto se consigue redondeando
254
                //por arriba el m?s alto y por abajo el menor y luego restandolos
255

    
256
                Point2D p1 = provider.worldToRaster(new Point2D.Double(q.getX(), q.getY()));
257
                Point2D p2 = provider.worldToRaster(new Point2D.Double(lrx, lry));
258
                adjustPoints(p1, p2);
259
                int width = (int)Math.abs(Math.ceil(p2.getX()) - Math.floor(p1.getX()));
260
                int height = (int)Math.abs(Math.floor(p1.getY()) - Math.ceil(p2.getY()));
261

    
262
                //Ajustamos por si nos hemos salido del raster
263
                if(((int)(p1.getX() + width)) > getWidth())
264
                        width = (int)(getWidth() - p1.getX());
265
                if(((int)(p1.getY() + height)) > getHeight())
266
                        height = (int)(getHeight() - p1.getY());
267

    
268
                if (p1.getX() < 0)
269
                        p1.setLocation(0, p1.getY());
270
                if (p1.getY() < 0)
271
                        p1.setLocation(p1.getX(), 0);
272
                if (p2.getX() > getWidth())
273
                        p2.setLocation(getWidth(), p2.getY());
274
                if (p2.getY() > getHeight())
275
                        p2.setLocation(p2.getX(), getHeight());
276

    
277
                int mallocNBands = 0;
278
                if(bandList.getDrawableBands() != null)
279
                        mallocNBands = bandList.getDrawableBands().length;
280
                else
281
                        mallocNBands = bandList.getDrawableBandsCount();
282

    
283
                //Buffer ReadOnly
284

    
285
                if(isReadOnly()) {
286
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
287
                        if(rb instanceof RasterReadOnlyBuffer) {
288
                                try {
289
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, 
290
                                                        (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
291
                                } catch (FileNotExistsException e) {
292
                                        //Esto no debe darse ya que se comprueba al hacer el open.
293
                                        return null;
294
                                } catch (NotSupportedExtensionException e) {
295
                                        //Esto no debe darse ya que se comprueba al hacer el open
296
                                        return null;
297
                                }
298
                                return rb;
299
                        }
300
                }
301
                
302
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
303
                //equivalente a los pixeles redondeados.
304
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(Math.floor(p1.getX()), Math.floor(p1.getY())));
305
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(Math.ceil(p2.getX()), Math.ceil(p2.getY())));
306

    
307
                //Buffer RW
308
                Buffer raster = null;
309
                
310
                if(forceToMemory) //Fuerza siempre buffer en memoria
311
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
312
                else
313
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
314

    
315
                if(!q.isAdjustToExtent())
316
                         initBufferToNoData(raster, bandList);
317
                
318
                q.setAreaOfInterest(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()));
319
                q.setBandList(bandList);
320
                q.setBuffer(raster);
321
                raster = ((DefaultRasterProvider)provider).getDataSet(q);
322

    
323
                return raster;
324
        }
325
        
326
        private void adjustPoints(Point2D ul, Point2D lr) {
327
                double a = (ul.getX() - (int)ul.getX());
328
                double b = (ul.getY() - (int)ul.getY());
329
                ul.setLocation(        (a > 0.99 || a < 0.005) ? Math.round(ul.getX()) : ul.getX(), 
330
                                                (b > 0.99 || b < 0.005) ? Math.round(ul.getY()) : ul.getY());
331
                lr.setLocation(        (a > 0.99 || a < 0.005) ? Math.round(lr.getX()) : lr.getX(), 
332
                                                (b > 0.99 || b < 0.005) ? Math.round(lr.getY()) : lr.getY());
333
        }
334
        
335
        /*
336
         * (non-Javadoc)
337
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getWindowWithResampling(org.gvsig.raster.impl.buffer.DefaultRasterQuery)
338
         */
339
        public Buffer getWindowWithResampling(DefaultRasterQuery q)
340
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
341

    
342
                Point2D p1 = worldToRaster(new Point2D.Double(q.getBBox().getULX(), q.getBBox().getULY()));
343
                Point2D p2 = worldToRaster(new Point2D.Double(q.getBBox().getLRX(), q.getBBox().getLRY()));;
344
                
345
                if(p1.getX() > p2.getX())
346
                        p1.setLocation(p1.getX() - 1, p1.getY());
347
                else
348
                        p2.setLocation(p2.getX() - 1, p2.getY());
349
                
350
                if(p1.getY() > p2.getY())
351
                        p1.setLocation(p1.getX(), p1.getY() - 1);
352
                else
353
                        p2.setLocation(p2.getX(), p2.getY() - 1);
354
                
355
                if(        ((int)p1.getX()) < 0 || ((int)p2.getX()) > getWidth() ||
356
                                ((int)p2.getY()) > getHeight() || ((int)p2.getY()) < 0)
357
                                throw new InvalidSetViewException("");
358

    
359
                int mallocNBands = 0;
360
                if(bandList.getDrawableBands() != null)
361
                        mallocNBands = bandList.getDrawableBands().length;
362
                else
363
                        mallocNBands = bandList.getDrawableBandsCount();
364

    
365
                //Buffer ReadOnly
366

    
367
                if(isReadOnly()) {
368
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], q.getBufWidth(), q.getBufHeight(), getBandCount());
369
                        if(rb instanceof RasterReadOnlyBuffer) {
370
                                try {
371
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, 
372
                                                        (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
373
                                } catch (FileNotExistsException e) {
374
                                        //Esto no debe darse ya que se comprueba al hacer el open.
375
                                        return null;
376
                                } catch (NotSupportedExtensionException e) {
377
                                        //Esto no debe darse ya que se comprueba al hacer el open
378
                                        return null;
379
                                }
380
                                return rb;
381
                        }
382
                }
383

    
384
                double ulx = q.getBBox().getULX();
385
                double uly = q.getBBox().getULY();
386
                double lrx = q.getBBox().getLRX();
387
                double lry = q.getBBox().getLRY();
388
                
389
                //Buffer RW
390
                Buffer raster = null;
391
                
392
                if(forceToMemory) //Fuerza siempre buffer en memoria
393
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], q.getBufWidth(), q.getBufHeight(), mallocNBands, true);
394
                else
395
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], q.getBufWidth(), q.getBufHeight(), mallocNBands, true);
396
                
397
                Extent ex = rManager.getDataStructFactory().createExtent(ulx, uly, lrx, lry);
398
                 
399
                q.setBBox(ex);
400
                q.setBandList(bandList);
401
                q.setBuffer(raster);
402
                raster = ((DefaultRasterProvider)provider).getDataSet(q);
403

    
404
                return raster;
405
        }
406

    
407
        /*
408
         * (non-Javadoc)
409
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double)
410
         */
411
        public Buffer getWindowWC(DefaultRasterQuery q)
412
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
413
                
414
                if(q.getBufWidth() > 0 && q.getBufHeight() > 0)
415
                        return getWindowWithResampling(q);
416
                
417
                //Leemos pixels completos aunque el valor obtenido sea decimal. Esto se consigue redondeando
418
                //por arriba el m?s alto y por abajo el menor y luego restandolos
419

    
420
                Point2D p1 = provider.worldToRaster(new Point2D.Double(q.getBBox().getULX(), q.getBBox().getULY()));
421
                Point2D p2 = provider.worldToRaster(new Point2D.Double(q.getBBox().getLRX(), q.getBBox().getLRY()));
422

    
423
                //Para el valor mayor redondeamos por arriba. Para el valor menor redondeamos por abajo.
424
                double p1X = (p1.getX() > p2.getX()) ? Math.ceil(p1.getX()) : Math.floor(p1.getX());
425
                double p1Y = (p1.getY() > p2.getY()) ? Math.ceil(p1.getY()) : Math.floor(p1.getY());
426
                double p2X = (p2.getX() > p1.getX()) ? Math.ceil(p2.getX()) : Math.floor(p2.getX());
427
                double p2Y = (p2.getY() > p1.getY()) ? Math.ceil(p2.getY()) : Math.floor(p2.getY());
428

    
429
                int width = (int)Math.abs(p1X - p2X);
430
                int height = (int)Math.abs(p1Y - p2Y);
431

    
432
                //Ajustamos por si nos hemos salido del raster
433
                if(((int)(Math.min(p1X, p2X) + width)) > getWidth())
434
                        width = (int)(getWidth() - Math.min(p1X, p2X));
435
                if(((int)(Math.min(p1Y, p2Y) + height)) > getHeight())
436
                        height = (int)(getHeight() - Math.min(p1Y, p2Y));
437

    
438
                if (p1X < 0)
439
                        p1X = 0;
440
                if (p1Y < 0)
441
                        p1Y = 0;
442
                if (p2X > getWidth())
443
                        p2X = getWidth();
444
                if (p2Y > getHeight())
445
                        p2Y = getHeight();
446

    
447
                int mallocNBands = 0;
448
                if(bandList.getDrawableBands() != null)
449
                        mallocNBands = bandList.getDrawableBands().length;
450
                else
451
                        mallocNBands = bandList.getDrawableBandsCount();
452

    
453
                //Buffer ReadOnly
454

    
455
                if(isReadOnly()) {
456
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
457
                        if(rb instanceof RasterReadOnlyBuffer) {
458
                                try {
459
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, 
460
                                                        (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
461
                                } catch (FileNotExistsException e) {
462
                                        //Esto no debe darse ya que se comprueba al hacer el open.
463
                                        return null;
464
                                } catch (NotSupportedExtensionException e) {
465
                                        //Esto no debe darse ya que se comprueba al hacer el open
466
                                        return null;
467
                                }
468
                                return rb;
469
                        }
470
                }
471

    
472
                //Buffer RW
473
                Buffer raster = null;
474
                
475
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
476
                //equivalente a los pixeles redondeados.
477
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(p1X, p1Y));
478
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(p2X, p2Y));
479
                
480
                if(forceToMemory) //Fuerza siempre buffer en memoria
481
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
482
                else
483
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
484
                
485
                Extent ex = rManager.getDataStructFactory().createExtent(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY());
486
                q.setType(DefaultRasterQuery.TYPE_COORDS);
487
                q.setBBox(ex);
488
                q.setBandList(bandList);
489
                q.setBuffer(raster);
490
                raster = ((DefaultRasterProvider)provider).getDataSet(q);
491
                //raster = ((DefaultRasterProvider)provider).getWindow(ex, bandList, raster);
492

    
493
                return raster;
494
        }
495

    
496
        /*
497
         * (non-Javadoc)
498
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.grid.render.TileListener, int)
499
         */
500
        public void getWindowTiled(DefaultRasterQuery q)
501
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
502
                if(isTiled()) { 
503
                        //Extent ex = q.getBBox();//new ExtentImpl(ulx, uly, lrx, lry);
504
                        q.setBandList(bandList);
505
                        ((DefaultRasterProvider)provider).getDataSet(q);
506
                        //((DefaultRasterProvider)provider).getWindow(ex, q.getBufWidth(), q.getBufHeight(), bandList, listener);
507
                        return;
508
                }
509
                                
510
                double[] step = null;
511
                Buffer buf = null;
512
                
513
                double ulx = q.getBBox().getULX();
514
                double uly = q.getBBox().getULY();
515
                double lrx = q.getBBox().getLRX();
516
                double lry = q.getBBox().getLRY();
517
                
518
                //Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
519
                if(!currentQuery.isSupersamplingLoadingBuffer()) {
520
                        //nWidth = ((adjustedDataExtent.width() * mDataset.getDataset(0).getWidth()) / mDataset.getExtentForRequest().width());
521
                        //nHeight = ((adjustedDataExtent.height() * mDataset.getDataset(0).getHeight()) / mDataset.getExtentForRequest().height());
522
                        Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
523
                        Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
524
                        nWidth = Math.abs(p1.getX() - p2.getX());
525
                        nHeight = Math.abs(p1.getY() - p2.getY());
526

    
527
                        if(q.getBufWidth() > Math.ceil(nWidth) && q.getBufHeight() > Math.ceil(nHeight)) {
528
                                step = calcSteps(ulx, uly, lrx, lry, nWidth, nHeight, q.getBufWidth(), q.getBufHeight());
529
                                buf = getWindowWC(q);
530
                        }
531
                } 
532
                
533
                if(buf == null) {
534
                        q.setAdjustToExtent(true);
535
                        buf = getWindowWithResampling(q);
536
                }
537
                
538
                buf.setDataExtent(new Rectangle2D.Double(ulx, uly, Math.abs(ulx - lrx), Math.abs(uly - lry)));
539
                
540
                Buffer alphaBand = null;
541
                if(currentQuery.getAlphaBandNumber() != -1) {
542
                        int[] drawableBands = bandList.getDrawableBands();
543
                        bandList.setDrawableBands(new int[]{currentQuery.getAlphaBandNumber(), -1, -1});
544
                        for(int i = 0; i < provider.getInternalProviderCount(); i++)
545
                                ((AbstractRasterDataParameters)((DefaultRasterProvider)provider.getInternalProvider(i)).getDataParameters()).setAlphaBand(currentQuery.getAlphaBandNumber());
546
                        q.setAdjustToExtent(true);
547
                        alphaBand = getWindowWithResampling(q);
548
                        bandList.setDrawableBands(drawableBands);
549
                }
550
                
551
                TileCacheManager m = TileCacheLocator.getManager();
552
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
553
                t.setData(new Object[]{buf, alphaBand});
554
                t.setUl(new Point2D.Double(ulx, uly));
555
                t.setLr(new Point2D.Double(lrx, lry));
556
                if(provider.getDataParameters() instanceof MultiDimensionalStoreParameters) {
557
                        MultiDimensionalStoreParameters par = (MultiDimensionalStoreParameters)provider.getDataParameters();
558
                        t.setVariable(par.getStringVariable());
559
                        t.setZ(par.getStringLevel());
560
                        t.setTimeInstant(par.getStringTime());
561
                }
562
                t.setDownloaderParams("AffineTransform", getAffineTransform());
563
                t.setDownloaderParams("Tiling", new Boolean(true));
564
                t.setDownloaderParams("Step", step);
565
                try {
566
                        q.getTileListener().tileReady(t);
567
                } catch (TileGettingException e) {
568
                        throw new RasterDriverException("Error getting a tile", e);
569
                }
570
                
571
                //listener.nextBuffer(buf, alphaBand, new ExtentImpl(ulx, uly, lrx, lry), this.getAffineTransform(), step, false);
572
                q.getTileListener().endReading();
573
        }
574
        
575
        /*
576
         * (non-Javadoc)
577
         * @see org.gvsig.raster.impl.store.QueryableRaster#getTile(int, int, int, org.gvsig.fmap.dal.coverage.datastruct.Extent)
578
         */
579
        public Tile getTile(DefaultRasterQuery q) throws TileGettingException {
580
                TiledRasterProvider tiledProv = ((TiledRasterProvider)provider);
581
                return tiledProv.getTile(q);
582
        }
583

    
584
        /*
585
         * (non-Javadoc)
586
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int, int, int)
587
         */
588
        public Buffer getWindowPx(DefaultRasterQuery q)
589
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
590
                step = null;
591
                if(q.getPixelX() < 0 || q.getPixelY() < 0 || q.getPixelW() > getWidth() || q.getPixelH() > getHeight())
592
                        throw new InvalidSetViewException("Out of image");
593
                
594
                q.setPixelX((q.getPixelX() < 0) ? 0 : q.getPixelX());
595
                q.setPixelY((q.getPixelY() < 0) ? 0 : q.getPixelY());
596
                q.setPixelW((q.getPixelW() > getWidth()) ? (int)getWidth() : q.getPixelW());
597
                q.setPixelH((q.getPixelH() > getHeight()) ? (int)getHeight() : q.getPixelH());
598

    
599
                dataExtent = new ExtentImpl(rasterToWorld(new Point2D.Double(q.getPixelX(), q.getPixelY())),
600
                                rasterToWorld(new Point2D.Double(q.getPixelX() + q.getPixelW(), q.getPixelY() + q.getPixelH())));
601
                
602
                if(        q.getType() == DefaultRasterQuery.TYPE_PX || 
603
                        q.getType() == DefaultRasterQuery.TYPE_ENTIRE || 
604
                        q.getBufWidth() <= 0 || q.getBufHeight() <= 0) {
605
                        q.setBufWidth(q.getPixelW());
606
                        q.setBufHeight(q.getPixelH());
607
                }
608

    
609
                //Buffer ReadOnly
610

    
611
                if(isReadOnly()) {
612
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], 
613
                                        q.getBufWidth(), q.getBufHeight(), getBandCount());
614
                        if(rb instanceof RasterReadOnlyBuffer) {
615
                                try {
616
                                        ((RasterReadOnlyBuffer)rb).setBufferParams((QueryableRaster)this, 
617
                                                        q.getPixelX(), 
618
                                                        q.getPixelY(), 
619
                                                        q.getPixelX() + q.getPixelW() - 1, 
620
                                                        q.getPixelY() + q.getPixelH() - 1, 
621
                                                        bandList);
622
                                } catch (FileNotExistsException e) {
623
                                        //Esto no debe darse ya que se comprueba al hacer el open.
624
                                        return null;
625
                                } catch (NotSupportedExtensionException e) {
626
                                        //Esto no debe darse ya que se comprueba al hacer el open
627
                                        return null;
628
                                }
629
                                return rb;
630
                        }
631
                }
632

    
633
                //Buffer RW
634
                Buffer raster = null;
635
                
636
                if(forceToMemory) //Fuerza siempre buffer en memoria
637
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], q.getBufWidth(), q.getBufHeight(), bandList.getDrawableBandsCount(), true);
638
                else
639
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], q.getBufWidth(), q.getBufHeight(), bandList.getDrawableBandsCount(), true);
640
                
641
                q.setBandList(bandList);
642
                q.setBuffer(raster);
643
                raster = ((DefaultRasterProvider)provider).getDataSet(q);
644
                //raster = ((DefaultRasterProvider)provider).getWindow(q.getPixelX(), q.getPixelY(), q.getPixelW(), q.getPixelH(), bandList, raster);
645

    
646
                return raster;
647
        }
648

    
649
        //******************************
650
        //Setters and Getters
651
        //******************************
652

    
653
        /**
654
         * Calcula el tama?o de los ficheros en disco
655
         * @return tama?o en bytes de todos los ficheros de la lista
656
         */
657
        public long getFileSize() {
658
                if(provider != null) {
659
                        long size = 0;
660
                        long[] fSize = provider.getFileSizeByProvider();
661
                        if(fSize != null && fSize.length > 0) {
662
                                for (int j = 0; j < fSize.length; j++) {
663
                                        size += fSize[j];        
664
                                }
665
                        }
666
                        return size;
667
                }
668
                return 0;
669
        }
670

    
671
        /*
672
         * (non-Javadoc)
673
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeight()
674
         */
675
        public double getHeight() {
676
                return provider.getHeight();
677
        }
678

    
679
        /*
680
         * (non-Javadoc)
681
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidth()
682
         */
683
        public double getWidth() {
684
                return provider.getWidth();
685
        }
686

    
687
        /*
688
         * (non-Javadoc)
689
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getCellSize()
690
         */
691
        public double getCellSize() {
692
                try {
693
                        Extent e = getExtent();
694
                        double dCellsize = (e.getMax().getX() - e.getMin().getX() ) / getWidth();
695
                        return dCellsize;
696
                } catch (NullPointerException e) {
697
                        return 1;
698
                }
699
        }
700

    
701
        /*
702
         * (non-Javadoc)
703
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCount()
704
         */
705
        public int getBandCount() {
706
                return provider.getBandCount();
707
        }
708

    
709
        /*
710
         * (non-Javadoc)
711
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataType()
712
         */
713
        public int[] getDataType() {
714
                return provider.getDataType();
715
        }
716

    
717
        /*
718
         * (non-Javadoc)
719
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBands()
720
         */
721
        public BandList getBands() {
722
                return bandList;
723
        }
724

    
725
        /**
726
         * Obtiene la coordenada X m?nima de toda la lista
727
         * @return Coordenada X m?nima
728
         */
729
        public double getMinX() {
730
                return provider.getExtent().getMin().getX();
731
        }
732

    
733
        /**
734
         * Obtiene la coordenada Y m?nima de toda la lista
735
         * @return Coordenada Y m?nima
736
         */
737
        public double getMinY() {
738
                return provider.getExtent().getMin().getY();
739
        }
740

    
741
        /**
742
         * Obtiene la coordenada Y m?xima de toda la lista
743
         * @return Coordenada Y m?xima
744
         */
745
        public double getMaxX() {
746
                return provider.getExtent().getMax().getX();        }
747

    
748
        /**
749
         * Obtiene la coordenada Y m?xima de toda la lista
750
         * @return Coordenada Y m?xima
751
         */
752
        public double getMaxY() {
753
                return provider.getExtent().getMax().getY();
754
        }
755

    
756
        /*
757
         * (non-Javadoc)
758
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getNoDataValue()
759
         */
760
        public NoData getNoDataValue() {
761
                return provider.getNoDataValue();
762
        }
763

    
764
        /*
765
         * (non-Javadoc)
766
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setNoDataValue(double)
767
         */
768
        public void setNoDataValue(NoData value) {
769
                provider.setNoDataValue(value);
770
        }
771

    
772
        /*
773
         * (non-Javadoc)
774
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtent()
775
         */
776
        public Extent getExtent() {
777
                Extent e = provider.getExtent();
778
                if (coordTrans != null) {
779
                        e = e.convert(coordTrans);
780
                }
781
                return e;
782
        }
783

    
784
        /**
785
         * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
786
         * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
787
         * pero para un raster rotado ser? igual al extent del raster como si no
788
         * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
789
         * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
790
         * aplicado.
791
         * @return Extent
792
         */
793
        public Extent getExtentForRequest() {
794
                return provider.getExtentWithoutRot();
795
        }
796

    
797
        /**
798
         * 
799
         * @return
800
         */
801
        public Extent getLastSelectedView(){
802
                return provider.getView();
803
        }
804

    
805
        /*
806
         * (non-Javadoc)
807
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(int)
808
         */
809
        public ColorTable getColorTable(int i){
810
                return provider.getColorTable();
811
        }
812

    
813
        /**
814
         * Obtiene la lista de paletas correspondiente a todos los ficheros que forman el GeoMultiRasterFile
815
         * @return Paleta asociada a este o null si no tiene. Una posici?n null en el array tambi?n indica que
816
         * para ese fichero no hay paletas asociadas.
817
         */
818
        public ColorTable getColorTables() {
819
                return provider.getColorTable();
820
        }
821
        
822
        /*
823
         * (non-Javadoc)
824
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorTable()
825
         */
826
        public ColorTable getColorTable() {
827
                //Solo tiene sentido si tiene un fichero y ese fichero tiene una sola banda
828
                if(provider != null)
829
                        return provider.getColorTable();
830
                return null;
831
        }
832
        
833
        /**
834
         * Sets the color table
835
         * @param colorTable
836
         */
837
        public void setColorTable(ColorTable colorTable) {
838
                provider.setColorTable(colorTable);
839
        }
840

    
841
        /*
842
         * (non-Javadoc)
843
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(java.lang.String)
844
         */
845
        public ColorTable getColorTable(String fileName){
846
                return provider.getColorTable();
847
        }
848

    
849
        /*
850
         * (non-Javadoc)
851
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#rasterToWorld(java.awt.geom.Point2D)
852
         */
853
        public Point2D rasterToWorld(Point2D pt) {
854
                return provider.rasterToWorld(pt);
855
        }
856

    
857
        /*
858
         * (non-Javadoc)
859
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#worldToRaster(java.awt.geom.Point2D)
860
         */
861
        public Point2D worldToRaster(Point2D pt) {
862
                return provider.worldToRaster(pt);
863
        }
864

    
865
        /*
866
         * (non-Javadoc)
867
         * @see org.gvsig.raster.impl.store.QueryableRaster#calcSteps(double, double, double, double, double, double, int, int)
868
         */
869
        public double[] calcSteps(double dWorldTLX, double dWorldTLY, double dWorldBRX, double dWorldBRY,
870
                        double nWidth, double nHeight, int bufWidth, int bufHeight){
871
                return provider.calcSteps(dWorldTLX, dWorldTLY, dWorldBRX, dWorldBRY, nWidth, nHeight, bufWidth, bufHeight);
872
        }
873

    
874
        /*
875
         * (non-Javadoc)
876
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isGeoreferenced()
877
         */
878
        public boolean isGeoreferenced() {
879
                return provider.isGeoreferenced();
880
        }
881

    
882
        /*
883
         * (non-Javadoc)
884
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeX()
885
         */
886
        public double getPixelSizeX() {
887
                return provider.getPixelSizeX();
888
        }
889

    
890
        /*
891
         * (non-Javadoc)
892
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeY()
893
         */
894
        public double getPixelSizeY() {
895
                return provider.getPixelSizeY();
896
        }
897

    
898
        /*
899
         * (non-Javadoc)
900
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getData(int, int, int)
901
         */
902
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
903
                return provider.getData(x, y, band);
904
        }
905

    
906
        /*
907
         * (non-Javadoc)
908
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWktProjection()
909
         */
910
        public String getWktProjection() throws RasterDriverException {
911
                if(provider != null)
912
                        return provider.getWktProjection();
913
                return null;
914
        }
915

    
916
        /*
917
         * (non-Javadoc)
918
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isInside(java.awt.geom.Point2D)
919
         */
920
        public boolean isInside(Point2D p) {
921
                if(provider != null)
922
                        return provider.isInside(p);
923
                return false;
924
        }
925
        
926
        /*
927
         * (non-Javadoc)
928
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDataStore()
929
         */
930
        public RasterDataStore getDataStore() {
931
                return this;
932
        }
933

    
934
        /**
935
         * 
936
         * @param band
937
         * @return
938
         */
939
        public AffineTransform getAffineTransform(int band){
940
                return provider.getAffineTransform();
941
        }
942

    
943

    
944
        /*
945
         * (non-Javadoc)
946
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setAffineTransform(java.awt.geom.AffineTransform)
947
         */
948
        public void setAffineTransform(AffineTransform transf) {
949
                provider.setAffineTransform(transf);
950
        }
951

    
952
        /**
953
         * Obtiene la matriz de transformaci?n del propio raster. Esta matriz es la encargada
954
         * de convertir las coordenadas de la petici?n en coordenadas a las que se pide a la libreria.
955
         * En gdal, por ejemplo, se piden las coordenadas a la libreria en coordenadas pixel por lo que
956
         * esta matriz tendr? la georreferenciaci?n asociada en el worldfile o cabecera. Otras librerias como
957
         * ermapper la petici?n a la libreria se hace en coordenadas geograficas que son las mismas en las
958
         * que pide el usuario de gvSIG por lo que esta matriz en este caso se inicializa con la identidad.
959
         * @return
960
         */
961
        public AffineTransform getOwnTransformation() {
962
                return provider.getOwnAffineTransform();
963
        }
964

    
965
        /*
966
         * (non-Javadoc)
967
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRotated()
968
         */
969
        public boolean isRotated() {
970
                if(provider != null)
971
                        return provider.isRotated();
972
                return false;
973
        }
974

    
975
        /*
976
         * (non-Javadoc)
977
         * @see org.gvsig.raster.impl.store.QueryableRaster#setDrawableBands(int[])
978
         */
979
        public void setDrawableBands(int[] db) {
980
                getBands().setDrawableBands(db);
981
        }
982
        
983
        /*
984
         * (non-Javadoc)
985
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDrawableBands()
986
         */
987
        public int[] getDrawableBands() {
988
                return getBands().getDrawableBands();
989
        }
990

    
991
        /*
992
         * (non-Javadoc)
993
         * @see org.gvsig.raster.impl.store.QueryableRaster#clearDrawableBands()
994
         */
995
        public void clearDrawableBands() {
996
                getBands().clearDrawableBands();
997
        }
998

    
999
        /*
1000
         * (non-Javadoc)
1001
         * @see org.gvsig.raster.impl.store.QueryableRaster#addDrawableBand(int, int)
1002
         */
1003
        public void addDrawableBand(int posRasterBuf, int imageBand) {
1004
                getBands().addDrawableBand(posRasterBuf, imageBand);
1005
        }
1006

    
1007
        /**
1008
         * 
1009
         * @return
1010
         */
1011
        public boolean isReadOnly() {
1012
                return readOnly;
1013
        }
1014

    
1015
        /**
1016
         * 
1017
         * @param readOnly
1018
         */
1019
        public void setReadOnly(boolean readOnly) {
1020
                this.readOnly = readOnly;
1021
                if(readOnly)
1022
                        this.forceToMemory = false;
1023
        }
1024

    
1025
        /*
1026
         * (non-Javadoc)
1027
         * @see org.gvsig.raster.impl.store.QueryableRaster#setMemoryBuffer(boolean)
1028
         */
1029
        public void setMemoryBuffer(boolean memory) {
1030
                this.forceToMemory = memory;
1031
                if(memory)
1032
                        this.readOnly = false;
1033
        }
1034

    
1035
        /**
1036
         * 
1037
         * @return
1038
         */
1039
        public boolean isMemoryBuffer() {
1040
                return forceToMemory;
1041
        }
1042
        
1043
        public void deleteLayerFromCache() {
1044
                provider.deleteLayerFromCache();
1045
        }
1046
        
1047
        public boolean isMultiFile() {
1048
                return provider.isMultiFile();
1049
        }
1050
        
1051
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1052
                return provider.getOverviewWidth(band, overview);
1053
        }
1054

    
1055
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1056
                return provider.getOverviewHeight(band, overview);
1057
        }
1058

    
1059
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1060
                if(band >= getBandCount())
1061
                        throw new BandAccessException("Wrong band");
1062
                return provider.getOverviewCount(band);
1063
        }
1064

    
1065
        public boolean overviewsSupport() {
1066
                if(provider != null)
1067
                        return provider.isOverviewsSupported();
1068
                return false;
1069
        }
1070
        
1071
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
1072
                provider.saveObjectToRmf(DefaultRasterProvider.class, provider);
1073
        }
1074
        
1075
        public void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException {
1076
                provider.saveObjectToRmf(TimeSeries.class, serialInfo);
1077
        }
1078

    
1079
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
1080
                provider.saveObjectToRmf(ColorTable.class, table);
1081
        }
1082
        
1083
        public void saveGeoPointListToRmf(GeoPointList pointList) throws RmfSerializerException {
1084
                provider.saveObjectToRmf(GeoPointList.class, pointList);
1085
        }
1086

    
1087
        public boolean loadSerialInfoFromRmf(TimeSeries serialInfo) {
1088
                try {
1089
                        provider.loadObjectFromRmf(TimeSeries.class, serialInfo);
1090
                        return true;
1091
                } catch (RmfSerializerException e) {
1092
                        //Prueba hasta que alguno tiene la informaci?n
1093
                }
1094
                return false;
1095
        }
1096

    
1097
        /*
1098
         * (non-Javadoc)
1099
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getView()
1100
         */
1101
        public Extent getView() {
1102
                if(provider != null)
1103
                        return provider.getView();
1104
                return null;
1105
        }
1106
        
1107
        /*
1108
         * (non-Javadoc)
1109
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtentWithoutRot()
1110
         */
1111
        public Extent getExtentWithoutRot() {
1112
                if(provider != null)
1113
                        return provider.getExtentWithoutRot();
1114
                return null;
1115
        }
1116
        
1117
        /*
1118
         * (non-Javadoc)
1119
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOwnAffineTransform()
1120
         */
1121
        public AffineTransform getOwnAffineTransform() {
1122
                if(provider != null)
1123
                        return provider.getOwnAffineTransform();
1124
                return null;
1125
        }
1126
        
1127
        /*
1128
         * (non-Javadoc)
1129
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransform()
1130
         */
1131
        public AffineTransform getAffineTransform() {
1132
                if(provider != null) {
1133
                        AffineTransform at = provider.getAffineTransform();
1134
                        /*if (coordTrans != null) {
1135
                                Point2D scale = new Point2D.Double(at.getTranslateX() + at.getScaleX(), at.getTranslateY() + at.getScaleY());
1136
                                Point2D translate = new Point2D.Double(at.getTranslateX(), at.getTranslateY());
1137
                                scale = coordTrans.convert(scale, scale);
1138
                                translate = coordTrans.convert(translate, translate);
1139
                                double sX = scale.getX() - translate.getX();
1140
                                double sY = scale.getY() - translate.getY();
1141
                                at = new AffineTransform(
1142
                                                sX, 
1143
                                                at.getShearY(), 
1144
                                                at.getShearX(), 
1145
                                                sY, 
1146
                                                translate.getX(), 
1147
                                                translate.getY());
1148
                        }*/
1149
                        return at;
1150
                }
1151
                return null;
1152
        }
1153
        
1154
        /*
1155
         * (non-Javadoc)
1156
         * @see org.gvsig.fmap.dal.coverage.store.RasterStoreProperties#getProjection()
1157
         */
1158
        public IProjection getProjection() {
1159
                if(provider != null)
1160
                        return provider.getProjection();
1161
                return null;
1162
        }
1163
        
1164
        public void setProjection(IProjection proj) throws RmfSerializerException {
1165
                if(provider != null)
1166
                        provider.setProjection(proj);
1167
        }
1168
        
1169
        public Statistics getStatistics() {
1170
                if(provider != null)
1171
                        return provider.getStatistics();
1172
                return null;
1173
        }
1174
        
1175
        public void setStatistics(Statistics stats) throws RmfSerializerException {
1176
                if(provider != null)
1177
                        provider.setStatistics(stats);
1178
        }
1179
        
1180
        /*
1181
         * (non-Javadoc)
1182
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHistogram()
1183
         */
1184
        public HistogramComputer getHistogramComputer() {
1185
                if(provider != null)
1186
                        return provider.getHistogramComputer();
1187
                return null;
1188
        }
1189
        
1190
        /*
1191
         * (non-Javadoc)
1192
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadata()
1193
         */
1194
        public Metadata getMetadata() {
1195
                if(provider != null)
1196
                        return provider.getMetadata();
1197
                return null;
1198
        }
1199
        
1200
        /*
1201
         * (non-Javadoc)
1202
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparency()
1203
         */
1204
        public Transparency getTransparency() {
1205
                if(provider != null) {
1206
                        provider.getTransparency().setNoData(getNoDataValue());
1207
                        return provider.getTransparency();
1208
                }
1209
                return null;
1210
        }
1211
        
1212
        /*
1213
         * (non-Javadoc)
1214
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorInterpretation()
1215
         */
1216
        public ColorInterpretation getColorInterpretation() {
1217
                return provider.getColorInterpretation();
1218
        }
1219

    
1220
        /*
1221
         * (non-Javadoc)
1222
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isReproyectable()
1223
         */
1224
        public boolean isReproyectable() {
1225
                if(provider != null)
1226
                        return (provider.isReproyectable());
1227
                return false;
1228
        }
1229
        
1230
        /*
1231
         * (non-Javadoc)
1232
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1233
         */
1234
        public String getMetadataName() {
1235
                if(provider != null)
1236
                        return provider.getName();
1237
                return null;
1238
        }
1239
        
1240
        /*
1241
         * (non-Javadoc)
1242
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#cloneDataStore()
1243
         */
1244
        public RasterDataStore cloneDataStore() throws CloneException {
1245
                DefaultRasterStore ds = new DefaultRasterStore();
1246
                ds.parameters = getParameters();
1247
                ds.provider = provider.cloneProvider();
1248
                
1249
                int[] bands = new int[1];
1250
                bands[0] = provider.getBandCount();
1251
                ds.metadata = new MultiDataStoreMetadata(bands);
1252
                ((MultiDataStoreMetadata)ds.metadata).add(provider.getMetadata());
1253
                
1254
                ds.bandList = (BandListImpl)bandList.clone();
1255
                return ds;
1256
        }
1257
        
1258
        /*
1259
         * (non-Javadoc)
1260
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isOpen()
1261
         */
1262
        public boolean isOpen() {
1263
                if(provider == null)
1264
                        return false;
1265
                return provider.isOpen();
1266
        }
1267

    
1268
        /*
1269
         * (non-Javadoc)
1270
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getProvider()
1271
         */
1272
        public CoverageStoreProvider getProvider() {
1273
                return provider;
1274
        }
1275
        
1276
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws InfoByPointException {
1277
                return ((RasterProvider)getProvider()).getInfoByPoint(x, y, cancellable);
1278
        }
1279
        
1280
        public String getInfoByPoint(double x, double y, Extent bbox, int w, int h, ICancellable cancellable) throws InfoByPointException {
1281
                return ((RasterProvider)getProvider()).getInfoByPoint((int)x, (int)y, bbox, w, h, cancellable);
1282
        }
1283

    
1284
        /*
1285
         * (non-Javadoc)
1286
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#goTo(int)
1287
         */
1288
        public void goTo(int position) throws OperationNotSupportedException {
1289
                if(!isTimeSupportedByTheProvider())
1290
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1291
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1292
                        ((MultiDimensionalStoreParameters)getParameters()).goTo(position);
1293
                }
1294
        }
1295

    
1296
        /*
1297
         * (non-Javadoc)
1298
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectNext()
1299
         */
1300
        public void selectNext() throws OperationNotSupportedException {
1301
                if(!isTimeSupportedByTheProvider())
1302
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1303
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1304
                        ((MultiDimensionalStoreParameters)getParameters()).selectNextInstant();
1305
                }
1306
        }
1307

    
1308
        /*
1309
         * (non-Javadoc)
1310
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectPrev()
1311
         */
1312
        public void selectPrev() throws OperationNotSupportedException {
1313
                if(!isTimeSupportedByTheProvider())
1314
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1315
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1316
                        ((MultiDimensionalStoreParameters)getParameters()).selectPrevInstant();
1317
                }
1318
        }
1319
        
1320
        /*
1321
         * (non-Javadoc)
1322
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#setTime(org.gvsig.timesupport.Time)
1323
         */
1324
        public void setTime(Time time) throws TimeException, OperationNotSupportedException {
1325
                if(!isTimeSupportedByTheProvider())
1326
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1327
                
1328
        }
1329
        
1330
        /**
1331
         * Returns true whether all providers support time
1332
         * @return
1333
         */
1334
        private boolean isTimeSupportedByTheProvider() {
1335
                if(provider != null)
1336
                        return provider.isTimeSupported();
1337
                return false;
1338
        }
1339
        
1340
        /*
1341
         * (non-Javadoc)
1342
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRasterEnclosed()
1343
         */
1344
        public boolean isRasterEnclosed() {
1345
                if(provider != null)
1346
                        return provider.isRasterEnclosed();
1347
                return false;
1348
        }
1349

    
1350
        /*
1351
         * (non-Javadoc)
1352
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
1353
         */
1354
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
1355
                try {
1356
                        return ((TiledRasterProvider)provider).getCoordsInLevel(viewCenter, level, w, h);
1357
                } catch (ClassCastException e) {
1358
                        return null;
1359
                }
1360
        }
1361

    
1362
        /*
1363
         * (non-Javadoc)
1364
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
1365
         */
1366
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
1367
                try {
1368
                        return ((TiledRasterProvider)provider).getCoordsInTheNearestLevel(extent, w, h);
1369
                } catch (ClassCastException e) {
1370
                        return null;
1371
                }
1372
        }
1373

    
1374
        /*
1375
         * (non-Javadoc)
1376
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getZoomLevels()
1377
         */
1378
        public int getZoomLevels() {
1379
                try {
1380
                        return ((TiledRasterProvider)provider).getZoomLevels();
1381
                } catch (ClassCastException e) {
1382
                        return -1;
1383
                }
1384
        }
1385

    
1386
        /*
1387
         * (non-Javadoc)
1388
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getNearestLevel(double)
1389
         */
1390
        public int getNearestLevel(double pixelSize) {
1391
                try {
1392
                        return ((TiledRasterProvider)provider).getNearestLevel(pixelSize);
1393
                } catch (ClassCastException e) {
1394
                        return -1;
1395
                }
1396
        }
1397
        
1398
        /*
1399
         * (non-Javadoc)
1400
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setTileServer(java.lang.Class)
1401
         */
1402
        public void setTileServer(Class<?> tileServer) throws InitializeException {
1403
                if(provider instanceof TiledRasterProvider) {
1404
                        ((TiledRasterProvider)provider).setTileServer(tileServer);
1405
                }
1406
        }
1407

    
1408
        /*
1409
         * (non-Javadoc)
1410
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getInternalParameters()
1411
         */
1412
        public RasterDataParameters getInternalParameters() {
1413
                if(provider instanceof TiledRasterProvider) {
1414
                        DefaultRasterProvider prov = (DefaultRasterProvider)((TiledRasterProvider)provider).getInternalProvider();
1415
                        return prov.getDataParameters();
1416
                }
1417
                return (RasterDataParameters)getParameters();
1418
        }
1419

    
1420
        /*
1421
         * (non-Javadoc)
1422
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#newDataStore()
1423
         */
1424
        public RasterDataStore newDataStore() {
1425
                if(provider != null) {
1426
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
1427
                        RasterDataStore newDataStore = null;
1428
                        try {
1429
                                newDataStore = manager.open((DataStoreParameters)parameters);
1430
                                if(newDataStore instanceof DefaultRasterStore) {
1431
                                        ((DefaultRasterStore)newDataStore).setStatistics(getStatistics());
1432
                                }
1433
                                return newDataStore;
1434
                        } catch (NotSupportedExtensionException e) {
1435
                                return null;
1436
                        } catch (RasterDriverException e) {
1437
                                return null;
1438
                        } catch (RmfSerializerException e) {
1439
                                return newDataStore;
1440
                        }
1441
                }
1442
                return null;
1443
        }
1444

    
1445
        /*
1446
         * (non-Javadoc)
1447
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileNameByProvider()
1448
         */
1449
        public String[] getURIByProvider() {
1450
                return provider.getURIByProvider();
1451
        }
1452

    
1453
        /*
1454
         * (non-Javadoc)
1455
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileSizeByProvider()
1456
         */
1457
        public long[] getFileSizeByProvider() {
1458
                return provider.getFileSizeByProvider();
1459
        }
1460

    
1461
        /*
1462
         * (non-Javadoc)
1463
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getProviderCount()
1464
         */
1465
        public int getProviderCount() {
1466
                return provider.getInternalProviderCount();
1467
        }
1468
        
1469
        /*
1470
         * (non-Javadoc)
1471
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCountByProvider()
1472
         */
1473
        public int[] getBandCountByProvider() {
1474
                return provider.getBandCountByProvider();
1475
        }
1476
        
1477
        /*
1478
         * (non-Javadoc)
1479
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataParametersByProvider()
1480
         */
1481
        public RasterDataParameters[] getDataParametersByProvider() {
1482
                RasterDataParameters[] res = new RasterDataParameters[getProviderCount()];
1483
                for (int i = 0; i < res.length; i++) {
1484
                        res[i] = (RasterDataParameters)provider.getInternalProvider(i).getDataParameters();                        
1485
                }
1486
                return res;
1487
        }
1488
        
1489
        /*
1490
         * (non-Javadoc)
1491
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadataByProvider()
1492
         */
1493
        public Metadata[] getMetadataByProvider() {
1494
                Metadata[] res = new Metadata[getProviderCount()];
1495
                for (int i = 0; i < res.length; i++) {
1496
                        res[i] = provider.getInternalProvider(i).getMetadata();                        
1497
                }
1498
                return res;
1499
        }
1500
        
1501
        /*
1502
         * (non-Javadoc)
1503
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCountByProvider()
1504
         */
1505
        public int[] getOverviewCountByProvider(int band) throws BandAccessException {
1506
                int[] res = new int[getProviderCount()];
1507
                for (int i = 0; i < res.length; i++) {
1508
                        try {
1509
                                res[i] = provider.getInternalProvider(i).getOverviewCount(band);
1510
                        } catch (RasterDriverException e) {
1511
                                throw new BandAccessException("", e);
1512
                        }                        
1513
                }
1514
                return res;
1515
        }
1516
        
1517
        /*
1518
         * (non-Javadoc)
1519
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewSizeByProvider(int, int)
1520
         */
1521
        public String[] getOverviewSizeByProvider(int band, int overview) throws BandAccessException {
1522
                String[] res = new String[getProviderCount()];
1523
                for (int i = 0; i < res.length; i++) {
1524
                        try {
1525
                                res[i] = provider.getInternalProvider(i).getOverviewWidth(band, overview) + 
1526
                                                 "x" + 
1527
                                                 provider.getInternalProvider(i).getOverviewHeight(band, overview);
1528
                        } catch (RasterDriverException e) {
1529
                                throw new BandAccessException("", e);
1530
                        }                        
1531
                }
1532
                return res;
1533
        }
1534
        
1535
        /*
1536
         * (non-Javadoc)
1537
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransformByProvider()
1538
         */
1539
        public AffineTransform[] getAffineTransformByProvider() {
1540
                AffineTransform[] res = new AffineTransform[getProviderCount()];
1541
                for (int i = 0; i < res.length; i++) {
1542
                        res[i] = provider.getInternalProvider(i).getAffineTransform();
1543
                }
1544
                return res;
1545
        }
1546
        
1547
        /*
1548
         * (non-Javadoc)
1549
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeightByProvider()
1550
         */
1551
        public double[] getHeightByProvider() {
1552
                double[] res = new double[getProviderCount()];
1553
                for (int i = 0; i < res.length; i++) {
1554
                        res[i] = provider.getInternalProvider(i).getHeight();
1555
                }
1556
                return res;
1557
        }
1558
        
1559
        /*
1560
         * (non-Javadoc)
1561
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidthByProvider()
1562
         */
1563
        public double[] getWidthByProvider() {
1564
                double[] res = new double[getProviderCount()];
1565
                for (int i = 0; i < res.length; i++) {
1566
                        res[i] = provider.getInternalProvider(i).getWidth();
1567
                }
1568
                return res;
1569
        }
1570
        
1571
        /*
1572
         * (non-Javadoc)
1573
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#addFile(java.lang.String)
1574
         */
1575
        public void addFile(String file) throws InvalidSourceException {
1576
                provider.addFile(file);
1577
        }
1578
        
1579
        /*
1580
         * (non-Javadoc)
1581
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#removeFile(java.lang.String)
1582
         */
1583
        public void removeFile(String file) {
1584
                provider.removeFile(file);
1585
                bandList.removeBands(file);
1586
        }
1587
        
1588
        /*
1589
         * (non-Javadoc)
1590
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getURIByBand(int)
1591
         */
1592
        public String getURIByBand(int band) {
1593
                return provider.getURIByBand(band);
1594
        }
1595
        
1596
        /**
1597
         * Gets the {@link Interval} of the store, that means the temporal
1598
         * interval where the store has valid data.
1599
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1600
         * by the provider.
1601
         * @return
1602
         *         a time interval or null if there is not time support
1603
         */
1604
        public Interval getInterval() {
1605
                return provider.getInterval();
1606
        }
1607
        
1608
        /**
1609
         * Gets all the possible values of time for which the store has data.  
1610
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1611
         * by the provider.
1612
         * @return
1613
         *         a collection of {@link Time} objects.
1614
         */
1615
        @SuppressWarnings("unchecked")
1616
        public Collection getTimes() {
1617
                return provider.getTimes();
1618
        }
1619
        
1620
        /**
1621
         * Gets all the possible values of time for which the store has data
1622
         * and intersects with an interval.
1623
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1624
         * by the provider.
1625
         * @param interval
1626
         *         the interval of time
1627
         * @return
1628
         *         a collection of {@link Time} objects.
1629
         */
1630
        @SuppressWarnings("unchecked")
1631
        public Collection getTimes(Interval interval) {
1632
                return provider.getTimes(interval);
1633
        }
1634
        
1635
        /*
1636
         * (non-Javadoc)
1637
         * @see org.gvsig.fmap.dal.coverage.store.RasterStoreProperties#getImageLegend()
1638
         */
1639
        public Image getImageLegend() {
1640
                return provider.getImageLegend();
1641
        }
1642
        
1643
        /**
1644
         * Gets the list of geo points associated to this provider
1645
         * @return
1646
         */
1647
        public GeoPointList getGeoPointList() {
1648
                return provider.getGeoPointList();
1649
        }
1650
        
1651
        /**
1652
         * Sets the list of geo points associated to this provider
1653
         */
1654
        public void setGeoPointList(GeoPointList geoPointList) {
1655
                provider.setGeoPointList(geoPointList);
1656
        }
1657

    
1658
        /*
1659
         * (non-Javadoc)
1660
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadFromState(org.gvsig.tools.persistence.PersistentState)
1661
         */
1662
        @SuppressWarnings("unchecked")
1663
        public void loadFromState(PersistentState state)
1664
                        throws PersistenceException {
1665
                if(parameters == null)
1666
                        this.parameters = (RasterDataParameters)state.get("parameters");
1667
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
1668
                try {
1669
                        this.provider = (DefaultRasterProvider)dataManager.createProvider(this, this.parameters);
1670
                } catch (InitializeException e) {
1671
                        //throw new PersistenceException(e);
1672
                } catch (ProviderNotRegisteredException e) {
1673
                        throw new PersistenceException(e);
1674
                }
1675
                this.bandList = (BandListImpl)state.get("bandList");
1676
                if(parameters instanceof AbstractRasterFileDataParameters && !this.provider.isMultiFile()) {
1677
                        //Esto solo es por si al cargar un proyecto se ha cambiado el fichero de sitio y el usuario
1678
                        //lo introduce manualmente. En ese caso el bandList debe contener la misma ruta al fichero que el 
1679
                        //provider y no la que se grab? inicialmente
1680
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1681
                                bandList.getBand(i).setFileName(provider.getURI());                                
1682
                        }
1683
                }
1684
                this.metadata = (Metadata)state.get("metadata");
1685
                setRender((Render)state.get("render"));
1686
                int[] rb = getRender().getRenderBands(); //Evitamos que las bandas que fueron cargadas se machaquen ahora
1687
                getRender().setDataStore(this);
1688
                getRender().setRenderBands(rb);
1689
                if(getRender().getLastTransparency() != null)
1690
                        getRender().getLastTransparency().setNoData(getNoDataValue());
1691
                
1692
                RasterFilterList fList = (RasterFilterList)state.get("filterList");
1693
                fList.addEnvParam("IStatistics", getStatistics());
1694
                fList.addEnvParam("MultiRasterDataset", this);
1695
                getRender().setFilterList(fList);
1696
                
1697
                //Gets the filter parameters and loads the filters
1698
                List<PersistencyFilterParam> listFilterUsed = state.getList("paramlist");
1699
                
1700
                ArrayList<Exception> exc = new ArrayList<Exception>();
1701
                for (int i = 0; i < listFilterUsed.size(); i++) {
1702
                        try {
1703
                                PersistencyFilterParam pfp = (PersistencyFilterParam) listFilterUsed.get(i);
1704
                                if(pfp != null && pfp.getFilterClass() != null && pfp.getFilterParam() != null) {
1705
                                        RasterFilterListManager filterManager = fList.getManagerByFilterClass(pfp.getFilterClass());
1706
                                        filterManager.setFilterList(fList);
1707
                                        if(filterManager != null)
1708
                                                filterManager.addFilter(pfp.getFilterClass(), pfp.getFilterParam());
1709
                                }
1710
                        } catch (FilterTypeException e) {
1711
                                exc.add(e);
1712
                        } catch (FilterManagerException e) {
1713
                                exc.add(e);
1714
                        }
1715
                }
1716
                
1717
                if(exc.size() != 0) {
1718
                        throw new PersistenceException("error_adding_filters", exc.get(0));
1719
                }
1720
        }
1721

    
1722
        /*
1723
         * (non-Javadoc)
1724
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveToState(org.gvsig.tools.persistence.PersistentState)
1725
         */
1726
        public void saveToState(PersistentState state) throws PersistenceException {
1727
                state.set("parameters", provider.getDataParameters());                
1728
                state.set("bandList", bandList);
1729
                state.set("metadata", metadata);
1730
                state.set("render", getRender());
1731
                state.set("filterList", getRender().getFilterList());
1732
                
1733
                RasterFilterList list = getRender().getFilterList();
1734
                ArrayList<PersistencyFilterParam> filters = new ArrayList<PersistencyFilterParam>();
1735
                for (int i = 0; i < list.lenght(); i++) {
1736
                        RasterFilter f = list.get(i);
1737
                        Params uipar = f.getUIParams(f.getName());
1738
                        PersistencyFilterParam param = new PersistencyFilterParam();
1739
                        param.setFilterParam(uipar);
1740
                        param.setFilterClass(f.getClass());
1741
                        param.setFilterName(f.getName());
1742
                        filters.add(param);
1743
                }
1744
                state.set("paramlist", filters);
1745
                
1746
        }        
1747
        
1748
        public static void registerPersistence() {
1749
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
1750
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
1751
                if( definition == null ) {
1752
                        definition = manager.addDefinition(
1753
                                        DefaultRasterStore.class,
1754
                                        PERSISTENT_NAME,
1755
                                        PERSISTENT_DESCRIPTION,
1756
                                        null, 
1757
                                        null
1758
                        );
1759
                        
1760
                        definition.addDynFieldObject("parameters").setClassOfValue(RasterDataParameters.class).setMandatory(true);
1761
                        definition.addDynFieldObject("bandList").setClassOfValue(BandList.class).setMandatory(false);
1762
                        definition.addDynFieldObject("metadata").setClassOfValue(Metadata.class).setMandatory(false);
1763
                        definition.addDynFieldObject("render").setClassOfValue(Render.class).setMandatory(true);
1764
                        
1765
                        definition.addDynFieldObject("filterList").setClassOfValue(RasterFilterList.class).setMandatory(false);
1766
                        definition.addDynFieldList("paramlist").setClassOfItems(PersistencyFilterParam.class).setMandatory(false);
1767
                }
1768
        }
1769
        
1770
        /*
1771
         * (non-Javadoc)
1772
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#close()
1773
         */
1774
        public void close() {
1775
                if(provider != null)
1776
                        provider.close();
1777
                if(bandList != null)
1778
                        bandList.clear();
1779
                provider = null;
1780
                bandList = null;
1781
                super.close();
1782
                try {
1783
                        finalize();
1784
                } catch (Throwable e) {
1785
                }
1786
        }
1787
        
1788
        /*
1789
         * (non-Javadoc)
1790
         * @see java.lang.Object#finalize()
1791
         */
1792
        protected void finalize() throws Throwable {
1793
                provider               = null;
1794
                bandList               = null;
1795
                metadata               = null;
1796
                rManager               = null;
1797
                super.finalize();
1798
        }
1799
}