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 @ 1401

History | View | Annotate | Download (57.6 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.NoData;
44
import org.gvsig.fmap.dal.coverage.datastruct.Params;
45
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
46
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
47
import org.gvsig.fmap.dal.coverage.exception.CloneException;
48
import org.gvsig.fmap.dal.coverage.exception.FileNotExistsException;
49
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
50
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
51
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
52
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
53
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
54
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
55
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
56
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
57
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
58
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
59
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
60
import org.gvsig.fmap.dal.coverage.exception.TimeException;
61
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
62
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
63
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
64
import org.gvsig.fmap.dal.coverage.grid.render.Render;
65
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
66
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
67
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
68
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
69
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
70
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
71
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
72
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
73
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
74
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
75
import org.gvsig.fmap.dal.exception.InitializeException;
76
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
77
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
78
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
79
import org.gvsig.fmap.dal.spi.DataStoreProvider;
80
import org.gvsig.raster.cache.tile.Tile;
81
import org.gvsig.raster.cache.tile.TileCacheLocator;
82
import org.gvsig.raster.cache.tile.TileCacheManager;
83
import org.gvsig.raster.cache.tile.exception.TileGettingException;
84
import org.gvsig.raster.impl.DefaultRasterManager;
85
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
86
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
87
import org.gvsig.raster.impl.datastruct.BandListImpl;
88
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
89
import org.gvsig.raster.impl.datastruct.ExtentImpl;
90
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
91
import org.gvsig.raster.impl.provider.RasterProvider;
92
import org.gvsig.raster.impl.provider.TiledRasterProvider;
93
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
94
import org.gvsig.raster.util.persistence.PersistencyFilterParam;
95
import org.gvsig.timesupport.Interval;
96
import org.gvsig.timesupport.Time;
97
import org.gvsig.tools.ToolsLocator;
98
import org.gvsig.tools.dynobject.DynStruct;
99
import org.gvsig.tools.persistence.PersistenceManager;
100
import org.gvsig.tools.persistence.PersistentState;
101
import org.gvsig.tools.persistence.exception.PersistenceException;
102

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

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

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

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

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

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

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

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

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

    
282
                //Buffer ReadOnly
283

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

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

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

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

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

    
362
                int mallocNBands = 0;
363
                if(bandList.getDrawableBands() != null)
364
                        mallocNBands = bandList.getDrawableBands().length;
365
                else
366
                        mallocNBands = bandList.getDrawableBandsCount();
367

    
368
                //Buffer ReadOnly
369

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

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

    
406
                return raster;
407
        }
408

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

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

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

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

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

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

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

    
455
                //Buffer ReadOnly
456

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

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

    
494
                return raster;
495
        }
496

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

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

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

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

    
610
                //Buffer ReadOnly
611

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

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

    
643
                return raster;
644
        }
645

    
646
        //******************************
647
        //Setters and Getters
648
        //******************************
649

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
794
        /**
795
         * 
796
         * @return
797
         */
798
        public Extent getLastSelectedView(){
799
                return provider.getView();
800
        }
801

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

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

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

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

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

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

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

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

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

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

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

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

    
931
        /**
932
         * 
933
         * @param band
934
         * @return
935
         */
936
        public AffineTransform getAffineTransform(int band){
937
                return provider.getAffineTransform();
938
        }
939

    
940

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

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

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

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

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

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

    
1004
        /**
1005
         * 
1006
         * @return
1007
         */
1008
        public boolean isReadOnly() {
1009
                return readOnly;
1010
        }
1011

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

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

    
1032
        /**
1033
         * 
1034
         * @return
1035
         */
1036
        public boolean isMemoryBuffer() {
1037
                return forceToMemory;
1038
        }
1039
        
1040
        /*
1041
         * (non-Javadoc)
1042
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#deleteLayerFromCache()
1043
         */
1044
        public void deleteLayerFromCache() {
1045
                provider.deleteLayerFromCache();
1046
        }
1047
        
1048
        /*
1049
         * (non-Javadoc)
1050
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isMultiFile()
1051
         */
1052
        public boolean isMultiFile() {
1053
                return provider.isMultiFile();
1054
        }
1055
        
1056
        /*
1057
         * (non-Javadoc)
1058
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewWidth(int, int)
1059
         */
1060
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1061
                return provider.getOverviewWidth(band, overview);
1062
        }
1063

    
1064
        /*
1065
         * (non-Javadoc)
1066
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewHeight(int, int)
1067
         */
1068
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1069
                return provider.getOverviewHeight(band, overview);
1070
        }
1071

    
1072
        /*
1073
         * (non-Javadoc)
1074
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCount(int)
1075
         */
1076
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1077
                if(band >= getBandCount())
1078
                        throw new BandAccessException("Wrong band");
1079
                return provider.getOverviewCount(band);
1080
        }
1081

    
1082
        /*
1083
         * (non-Javadoc)
1084
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#overviewsSupport()
1085
         */
1086
        public boolean overviewsSupport() {
1087
                if(provider != null)
1088
                        return provider.isOverviewsSupported();
1089
                return false;
1090
        }
1091
        
1092
        /*
1093
         * (non-Javadoc)
1094
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#saveGeoreferencingToRmf()
1095
         */
1096
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
1097
                provider.saveObjectToRmf(DefaultRasterProvider.class, provider);
1098
        }
1099
        
1100
        /*
1101
         * (non-Javadoc)
1102
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveSerialInfoToRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1103
         */
1104
        public void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException {
1105
                provider.saveObjectToRmf(TimeSeries.class, serialInfo);
1106
        }
1107
        
1108
        /*
1109
         * (non-Javadoc)
1110
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveColorTableToRmf(org.gvsig.fmap.dal.coverage.store.props.ColorTable)
1111
         */
1112
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
1113
                provider.saveObjectToRmf(ColorTable.class, table);
1114
        }
1115
        
1116
        /*
1117
         * (non-Javadoc)
1118
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadSerialInfoFromRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1119
         */
1120
        public boolean loadSerialInfoFromRmf(TimeSeries serialInfo) {
1121
                try {
1122
                        provider.loadObjectFromRmf(TimeSeries.class, serialInfo);
1123
                        return true;
1124
                } catch (RmfSerializerException e) {
1125
                        //Prueba hasta que alguno tiene la informaci?n
1126
                }
1127
                return false;
1128
        }
1129

    
1130
        /*
1131
         * (non-Javadoc)
1132
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getView()
1133
         */
1134
        public Extent getView() {
1135
                if(provider != null)
1136
                        return provider.getView();
1137
                return null;
1138
        }
1139
        
1140
        /*
1141
         * (non-Javadoc)
1142
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtentWithoutRot()
1143
         */
1144
        public Extent getExtentWithoutRot() {
1145
                if(provider != null)
1146
                        return provider.getExtentWithoutRot();
1147
                return null;
1148
        }
1149
        
1150
        /*
1151
         * (non-Javadoc)
1152
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOwnAffineTransform()
1153
         */
1154
        public AffineTransform getOwnAffineTransform() {
1155
                if(provider != null)
1156
                        return provider.getOwnAffineTransform();
1157
                return null;
1158
        }
1159
        
1160
        /*
1161
         * (non-Javadoc)
1162
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransform()
1163
         */
1164
        public AffineTransform getAffineTransform() {
1165
                if(provider != null) {
1166
                        AffineTransform at = provider.getAffineTransform();
1167
                        /*if (coordTrans != null) {
1168
                                Point2D scale = new Point2D.Double(at.getTranslateX() + at.getScaleX(), at.getTranslateY() + at.getScaleY());
1169
                                Point2D translate = new Point2D.Double(at.getTranslateX(), at.getTranslateY());
1170
                                scale = coordTrans.convert(scale, scale);
1171
                                translate = coordTrans.convert(translate, translate);
1172
                                double sX = scale.getX() - translate.getX();
1173
                                double sY = scale.getY() - translate.getY();
1174
                                at = new AffineTransform(
1175
                                                sX, 
1176
                                                at.getShearY(), 
1177
                                                at.getShearX(), 
1178
                                                sY, 
1179
                                                translate.getX(), 
1180
                                                translate.getY());
1181
                        }*/
1182
                        return at;
1183
                }
1184
                return null;
1185
        }
1186
        
1187
        /*
1188
         * (non-Javadoc)
1189
         * @see org.gvsig.fmap.dal.coverage.store.RasterStoreProperties#getProjection()
1190
         */
1191
        public IProjection getProjection() {
1192
                if(provider != null)
1193
                        return provider.getProjection();
1194
                return null;
1195
        }
1196
        
1197
        public void setProjection(IProjection proj) {
1198
                if(provider != null)
1199
                        provider.setProjection(proj);
1200
        }
1201
        
1202
        /*
1203
         * (non-Javadoc)
1204
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getStatistics()
1205
         */
1206
        public Statistics getStatistics() {
1207
                if(provider != null)
1208
                        return provider.getStatistics();
1209
                return null;
1210
        }
1211
        
1212
        private void setStatistics(Statistics stats) {
1213
                if(provider != null)
1214
                        provider.setStatistics(stats);
1215
        }
1216
        
1217
        /*
1218
         * (non-Javadoc)
1219
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHistogram()
1220
         */
1221
        public HistogramComputer getHistogramComputer() {
1222
                if(provider != null)
1223
                        return provider.getHistogramComputer();
1224
                return null;
1225
        }
1226
        
1227
        /*
1228
         * (non-Javadoc)
1229
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadata()
1230
         */
1231
        public Metadata getMetadata() {
1232
                if(provider != null)
1233
                        return provider.getMetadata();
1234
                return null;
1235
        }
1236
        
1237
        /*
1238
         * (non-Javadoc)
1239
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparency()
1240
         */
1241
        public Transparency getTransparency() {
1242
                if(provider != null) {
1243
                        provider.getTransparency().setNoData(getNoDataValue());
1244
                        return provider.getTransparency();
1245
                }
1246
                return null;
1247
        }
1248
        
1249
        /*
1250
         * (non-Javadoc)
1251
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorInterpretation()
1252
         */
1253
        public ColorInterpretation getColorInterpretation() {
1254
                return provider.getColorInterpretation();
1255
        }
1256

    
1257
        /*
1258
         * (non-Javadoc)
1259
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isReproyectable()
1260
         */
1261
        public boolean isReproyectable() {
1262
                if(provider != null)
1263
                        return (provider.isReproyectable());
1264
                return false;
1265
        }
1266
        
1267
        /*
1268
         * (non-Javadoc)
1269
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1270
         */
1271
        public String getMetadataName() {
1272
                if(provider != null)
1273
                        return provider.getName();
1274
                return null;
1275
        }
1276
        
1277
        /*
1278
         * (non-Javadoc)
1279
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#cloneDataStore()
1280
         */
1281
        public RasterDataStore cloneDataStore() throws CloneException {
1282
                DefaultRasterStore ds = new DefaultRasterStore();
1283
                ds.parameters = getParameters();
1284
                ds.provider = provider.cloneProvider();
1285
                
1286
                int[] bands = new int[1];
1287
                bands[0] = provider.getBandCount();
1288
                ds.metadata = new MultiDataStoreMetadata(bands);
1289
                ((MultiDataStoreMetadata)ds.metadata).add(provider.getMetadata());
1290
                
1291
                ds.bandList = (BandListImpl)bandList.clone();
1292
                return ds;
1293
        }
1294
        
1295
        /*
1296
         * (non-Javadoc)
1297
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isOpen()
1298
         */
1299
        public boolean isOpen() {
1300
                if(provider == null)
1301
                        return false;
1302
                return provider.isOpen();
1303
        }
1304

    
1305
        /*
1306
         * (non-Javadoc)
1307
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getProvider()
1308
         */
1309
        public CoverageStoreProvider getProvider() {
1310
                return provider;
1311
        }
1312
        
1313
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws InfoByPointException {
1314
                return ((RasterProvider)getProvider()).getInfoByPoint(x, y, cancellable);
1315
        }
1316
        
1317
        public String getInfoByPoint(double x, double y, Extent bbox, int w, int h, ICancellable cancellable) throws InfoByPointException {
1318
                return ((RasterProvider)getProvider()).getInfoByPoint((int)x, (int)y, bbox, w, h, cancellable);
1319
        }
1320

    
1321
        /*
1322
         * (non-Javadoc)
1323
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#goTo(int)
1324
         */
1325
        public void goTo(int position) throws OperationNotSupportedException {
1326
                if(!isTimeSupportedByTheProvider())
1327
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1328
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1329
                        ((MultiDimensionalStoreParameters)getParameters()).goTo(position);
1330
                }
1331
        }
1332

    
1333
        /*
1334
         * (non-Javadoc)
1335
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectNext()
1336
         */
1337
        public void selectNext() throws OperationNotSupportedException {
1338
                if(!isTimeSupportedByTheProvider())
1339
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1340
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1341
                        ((MultiDimensionalStoreParameters)getParameters()).selectNextInstant();
1342
                }
1343
        }
1344

    
1345
        /*
1346
         * (non-Javadoc)
1347
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectPrev()
1348
         */
1349
        public void selectPrev() throws OperationNotSupportedException {
1350
                if(!isTimeSupportedByTheProvider())
1351
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1352
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1353
                        ((MultiDimensionalStoreParameters)getParameters()).selectPrevInstant();
1354
                }
1355
        }
1356
        
1357
        /*
1358
         * (non-Javadoc)
1359
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#setTime(org.gvsig.timesupport.Time)
1360
         */
1361
        public void setTime(Time time) throws TimeException, OperationNotSupportedException {
1362
                if(!isTimeSupportedByTheProvider())
1363
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1364
                
1365
        }
1366
        
1367
        /**
1368
         * Returns true whether all providers support time
1369
         * @return
1370
         */
1371
        private boolean isTimeSupportedByTheProvider() {
1372
                if(provider != null)
1373
                        return provider.isTimeSupported();
1374
                return false;
1375
        }
1376
        
1377
        /*
1378
         * (non-Javadoc)
1379
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRasterEnclosed()
1380
         */
1381
        public boolean isRasterEnclosed() {
1382
                if(provider != null)
1383
                        return provider.isRasterEnclosed();
1384
                return false;
1385
        }
1386

    
1387
        /*
1388
         * (non-Javadoc)
1389
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
1390
         */
1391
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
1392
                try {
1393
                        return ((TiledRasterProvider)provider).getCoordsInLevel(viewCenter, level, w, h);
1394
                } catch (ClassCastException e) {
1395
                        return null;
1396
                }
1397
        }
1398

    
1399
        /*
1400
         * (non-Javadoc)
1401
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
1402
         */
1403
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
1404
                try {
1405
                        return ((TiledRasterProvider)provider).getCoordsInTheNearestLevel(extent, w, h);
1406
                } catch (ClassCastException e) {
1407
                        return null;
1408
                }
1409
        }
1410

    
1411
        /*
1412
         * (non-Javadoc)
1413
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getZoomLevels()
1414
         */
1415
        public int getZoomLevels() {
1416
                try {
1417
                        return ((TiledRasterProvider)provider).getZoomLevels();
1418
                } catch (ClassCastException e) {
1419
                        return -1;
1420
                }
1421
        }
1422

    
1423
        /*
1424
         * (non-Javadoc)
1425
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getNearestLevel(double)
1426
         */
1427
        public int getNearestLevel(double pixelSize) {
1428
                try {
1429
                        return ((TiledRasterProvider)provider).getNearestLevel(pixelSize);
1430
                } catch (ClassCastException e) {
1431
                        return -1;
1432
                }
1433
        }
1434
        
1435
        /*
1436
         * (non-Javadoc)
1437
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setTileServer(java.lang.Class)
1438
         */
1439
        public void setTileServer(Class<?> tileServer) throws InitializeException {
1440
                if(provider instanceof TiledRasterProvider) {
1441
                        ((TiledRasterProvider)provider).setTileServer(tileServer);
1442
                }
1443
        }
1444

    
1445
        /*
1446
         * (non-Javadoc)
1447
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getInternalParameters()
1448
         */
1449
        public RasterDataParameters getInternalParameters() {
1450
                if(provider instanceof TiledRasterProvider) {
1451
                        DefaultRasterProvider prov = (DefaultRasterProvider)((TiledRasterProvider)provider).getInternalProvider();
1452
                        return prov.getDataParameters();
1453
                }
1454
                return (RasterDataParameters)getParameters();
1455
        }
1456

    
1457
        /*
1458
         * (non-Javadoc)
1459
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#newDataStore()
1460
         */
1461
        public RasterDataStore newDataStore() {
1462
                if(provider != null) {
1463
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
1464
                        try {
1465
                                RasterDataStore newDataStore = manager.open((DataStoreParameters)parameters);
1466
                                if(newDataStore instanceof DefaultRasterStore) {
1467
                                        ((DefaultRasterStore)newDataStore).setStatistics(getStatistics());
1468
                                }
1469
                                return newDataStore;
1470
                        } catch (NotSupportedExtensionException e) {
1471
                                return null;
1472
                        } catch (RasterDriverException e) {
1473
                                return null;
1474
                        }
1475
                }
1476
                return null;
1477
        }
1478

    
1479
        /*
1480
         * (non-Javadoc)
1481
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileNameByProvider()
1482
         */
1483
        public String[] getURIByProvider() {
1484
                return provider.getURIByProvider();
1485
        }
1486

    
1487
        /*
1488
         * (non-Javadoc)
1489
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileSizeByProvider()
1490
         */
1491
        public long[] getFileSizeByProvider() {
1492
                return provider.getFileSizeByProvider();
1493
        }
1494

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

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

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