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

History | View | Annotate | Download (46.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.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.awt.geom.Rectangle2D;
27

    
28
import org.cresques.cts.IProjection;
29
import org.gvsig.compat.net.ICancellable;
30
import org.gvsig.fmap.dal.DataStoreParameters;
31
import org.gvsig.fmap.dal.coverage.RasterLocator;
32
import org.gvsig.fmap.dal.coverage.RasterManager;
33
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
34
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
35
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
36
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
37
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
38
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
39
import org.gvsig.fmap.dal.coverage.exception.CloneException;
40
import org.gvsig.fmap.dal.coverage.exception.FileNotExistsException;
41
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
42
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
43
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
44
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
45
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
46
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
47
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
48
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
49
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
50
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
51
import org.gvsig.fmap.dal.coverage.exception.TimeException;
52
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
53
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
54
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
55
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
56
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
57
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
58
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
59
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
60
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
61
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
62
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
63
import org.gvsig.raster.cache.tile.Tile;
64
import org.gvsig.raster.cache.tile.TileCacheLocator;
65
import org.gvsig.raster.cache.tile.TileCacheManager;
66
import org.gvsig.raster.cache.tile.exception.TileGettingException;
67
import org.gvsig.raster.cache.tile.provider.TileListener;
68
import org.gvsig.raster.impl.DefaultRasterManager;
69
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
70
import org.gvsig.raster.impl.datastruct.BandListImpl;
71
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
72
import org.gvsig.raster.impl.datastruct.ExtentImpl;
73
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
74
import org.gvsig.raster.impl.provider.RasterProvider;
75
import org.gvsig.raster.impl.provider.TiledRasterProvider;
76
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
77
import org.gvsig.timesupport.Time;
78

    
79
/**
80
 * Default data store for raster
81
 *
82
 * @author Nacho Brodin (nachobrodin@gmail.com)
83
 */
84
public class DefaultRasterStore extends AbstractRasterDataStore {
85
        protected RasterProvider                provider      = null;
86
        protected BandListImpl                  bandList      = new BandListImpl();
87
        protected Metadata                      metadata      = null;
88
        private RasterManager                   rManager      = RasterLocator.getManager();
89
        
90
        /**
91
         * Flag que fuerza al buffer de solo lectura
92
         */
93
        protected boolean                       readOnly      = false;
94
        /**
95
         * Flag que fuerza al buffer en memoria
96
         */
97
        protected boolean                       forceToMemory = false;
98
        
99
        public DefaultRasterStore() {
100
                super();
101
        }
102
        
103
        public void setProvider(RasterProvider provider) {
104
                this.provider = provider;
105
                parameters = (DataStoreParameters)provider.getDataParameters();
106
                bandList.clear();
107
                for(int i = 0; i < provider.getBandCount(); i++) {
108
                        try {
109
                                int dataType = provider.getDataType()[i];
110
                                DatasetBand band = new DatasetBandImpl(provider.getURIByBand(i), 
111
                                                                                                        provider.getBandPositionByProvider(i), 
112
                                                                                                        dataType, 
113
                                                                                                        provider.getBandCount());
114
                                bandList.addBand(band, i);
115
                        } catch(BandNotFoundInListException ex) {
116
                                //No a?adimos la banda
117
                        }
118
                }
119
        }
120
        
121
        /*
122
         * (non-Javadoc)
123
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setProvider(org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider)
124
         */
125
        public void setProvider(CoverageStoreProvider prov) {
126
                if(prov instanceof RasterProvider)
127
                        setProvider((RasterProvider)prov);
128
        }
129
        
130
        /*
131
         * (non-Javadoc)
132
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getName()
133
         */
134
        public String getName() {
135
                if(provider != null)
136
                        return provider.getURI();
137
                return null;
138
        }
139

    
140
        /*
141
         * (non-Javadoc)
142
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#close()
143
         */
144
        public void close() {
145
                provider.close();
146
                bandList.clear();
147
        }
148

    
149
        /**
150
         * Inicializa el buffer a valores NoData
151
         * @param raster Buffer a inicializar
152
         * @param bandList Lista de bandas
153
         */
154
        private void initBufferToNoData(Buffer raster, BandList bandList) {
155
                for(int i = 0; i < bandList.getDrawableBandsCount(); i++)
156
                        switch(getDataType()[0]) {
157
                        case Buffer.TYPE_BYTE:raster.assign(i, raster.getByteNoDataValue());break;
158
                        case Buffer.TYPE_SHORT:raster.assign(i, raster.getShortNoDataValue());break;
159
                        case Buffer.TYPE_INT:raster.assign(i, raster.getIntNoDataValue());break;
160
                        case Buffer.TYPE_FLOAT:raster.assign(i, raster.getFloatNoDataValue());break;
161
                        case Buffer.TYPE_DOUBLE:raster.assign(i, raster.getNoDataValue());break;
162
                        }
163
        }
164
        
165
        /*
166
         * (non-Javadoc)
167
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isTiled()
168
         */
169
        public boolean isTiled() {
170
                return (provider instanceof TiledRasterProvider);
171
        }
172

    
173
        /*
174
         * (non-Javadoc)
175
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double)
176
         */
177
        public Buffer getWindow(double ulx, double uly, double lrx, double lry)
178
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
179
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
180

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

    
184
                Point2D p1 = provider.worldToRaster(new Point2D.Double(ulx, uly));
185
                Point2D p2 = provider.worldToRaster(new Point2D.Double(lrx, lry));
186

    
187
                //Para el valor mayor redondeamos por arriba. Para el valor menor redondeamos por abajo.
188
                double p1X = (p1.getX() > p2.getX()) ? Math.ceil(p1.getX()) : Math.floor(p1.getX());
189
                double p1Y = (p1.getY() > p2.getY()) ? Math.ceil(p1.getY()) : Math.floor(p1.getY());
190
                double p2X = (p2.getX() > p1.getX()) ? Math.ceil(p2.getX()) : Math.floor(p2.getX());
191
                double p2Y = (p2.getY() > p1.getY()) ? Math.ceil(p2.getY()) : Math.floor(p2.getY());
192

    
193
                int width = (int)Math.abs(p1X - p2X);
194
                int height = (int)Math.abs(p1Y - p2Y);
195

    
196
                //Ajustamos por si nos hemos salido del raster
197
                if(((int)(Math.min(p1X, p2X) + width)) > getWidth())
198
                        width = (int)(getWidth() - Math.min(p1X, p2X));
199
                if(((int)(Math.min(p1Y, p2Y) + height)) > getHeight())
200
                        height = (int)(getHeight() - Math.min(p1Y, p2Y));
201

    
202
                if (p1X < 0)
203
                        p1X = 0;
204
                if (p1Y < 0)
205
                        p1Y = 0;
206
                if (p2X > getWidth())
207
                        p2X = getWidth();
208
                if (p2Y > getHeight())
209
                        p2Y = getHeight();
210

    
211
                int mallocNBands = 0;
212
                if(bandList.getDrawableBands() != null)
213
                        mallocNBands = bandList.getDrawableBands().length;
214
                else
215
                        mallocNBands = bandList.getDrawableBandsCount();
216

    
217
                //Buffer ReadOnly
218

    
219
                if(isReadOnly()) {
220
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
221
                        if(rb instanceof RasterReadOnlyBuffer) {
222
                                try {
223
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
224
                                } catch (FileNotExistsException e) {
225
                                        //Esto no debe darse ya que se comprueba al hacer el open.
226
                                        return null;
227
                                } catch (NotSupportedExtensionException e) {
228
                                        //Esto no debe darse ya que se comprueba al hacer el open
229
                                        return null;
230
                                }
231
                                return rb;
232
                        }
233
                }
234

    
235
                //Buffer RW
236
                Buffer raster = null;
237
                
238
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
239
                //equivalente a los pixeles redondeados.
240
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(p1X, p1Y));
241
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(p2X, p2Y));
242
                
243
                if(forceToMemory) //Fuerza siempre buffer en memoria
244
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
245
                else
246
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
247
                
248
                Extent ex = rManager.getDataStructFactory().createExtent(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY());
249
                raster = ((DefaultRasterProvider)provider).getWindow(ex, bandList, raster);
250

    
251
                return raster;
252
        }
253

    
254
        /*
255
         * (non-Javadoc)
256
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, boolean)
257
         */
258
        public Buffer getWindow(double ulx, double uly, double w, double h, boolean adjustToExtent)
259
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
260
                //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
261
                //tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
262
                Extent ext = getExtent();
263
                Point2D pInit = provider.rasterToWorld(new Point2D.Double(0, 0));
264
                Point2D pEnd = provider.rasterToWorld(new Point2D.Double((int)getWidth(), (int)getHeight()));
265
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
266
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
267
                double lrx = (((int)(ext.getULX() - wRaster)) == ((int)ext.getLRX())) ? (ulx - w) : (ulx + w);
268
                double lry = (((int)(ext.getULY() - hRaster)) == ((int)ext.getLRY())) ? (uly - h) : (uly + h);
269

    
270
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
271

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

    
275
                Point2D p1 = provider.worldToRaster(new Point2D.Double(ulx, uly));
276
                Point2D p2 = provider.worldToRaster(new Point2D.Double(lrx, lry));
277
                int width = (int)Math.abs(Math.ceil(p2.getX()) - Math.floor(p1.getX()));
278
                int height = (int)Math.abs(Math.floor(p1.getY()) - Math.ceil(p2.getY()));
279

    
280
                //Ajustamos por si nos hemos salido del raster
281
                if(((int)(p1.getX() + width)) > getWidth())
282
                        width = (int)(getWidth() - p1.getX());
283
                if(((int)(p1.getY() + height)) > getHeight())
284
                        height = (int)(getHeight() - p1.getY());
285

    
286
                if (p1.getX() < 0)
287
                        p1.setLocation(0, p1.getY());
288
                if (p1.getY() < 0)
289
                        p1.setLocation(p1.getX(), 0);
290
                if (p2.getX() > getWidth())
291
                        p2.setLocation(getWidth(), p2.getY());
292
                if (p2.getY() > getHeight())
293
                        p2.setLocation(p2.getX(), getHeight());
294

    
295
                int mallocNBands = 0;
296
                if(bandList.getDrawableBands() != null)
297
                        mallocNBands = bandList.getDrawableBands().length;
298
                else
299
                        mallocNBands = bandList.getDrawableBandsCount();
300

    
301
                //Buffer ReadOnly
302

    
303
                if(isReadOnly()) {
304
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
305
                        if(rb instanceof RasterReadOnlyBuffer) {
306
                                try {
307
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
308
                                } catch (FileNotExistsException e) {
309
                                        //Esto no debe darse ya que se comprueba al hacer el open.
310
                                        return null;
311
                                } catch (NotSupportedExtensionException e) {
312
                                        //Esto no debe darse ya que se comprueba al hacer el open
313
                                        return null;
314
                                }
315
                                return rb;
316
                        }
317
                }
318
                
319
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
320
                //equivalente a los pixeles redondeados.
321
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(Math.floor(p1.getX()), Math.floor(p1.getY())));
322
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(Math.ceil(p2.getX()), Math.ceil(p2.getY())));
323

    
324
                //Buffer RW
325
                Buffer raster = null;
326
                
327
                if(forceToMemory) //Fuerza siempre buffer en memoria
328
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
329
                else
330
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
331

    
332
                if(!adjustToExtent)
333
                         initBufferToNoData(raster, bandList);
334
                
335
                raster = ((DefaultRasterProvider)provider).getWindow(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()), bandList, raster, adjustToExtent);
336

    
337
                return raster;
338
        }
339
        
340
        /*
341
         * (non-Javadoc)
342
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.grid.render.TileListener, int)
343
         */
344
        public void getWindow(double ulx, double uly, double lrx, double lry, 
345
                int bufWidth, int bufHeight, TileListener listener)
346
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
347
                if(isTiled()) { 
348
                        Extent ex = new ExtentImpl(ulx, uly, lrx, lry);
349
                        ((DefaultRasterProvider)provider).getWindow(ex, bufWidth, bufHeight, bandList, listener);
350
                        return;
351
                }
352
                                
353
                double[] step = null;
354
                Buffer buf = null;
355
                
356
                //Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
357
                if(!currentQuery.isSupersamplingLoadingBuffer()) {
358
                        //nWidth = ((adjustedDataExtent.width() * mDataset.getDataset(0).getWidth()) / mDataset.getExtentForRequest().width());
359
                        //nHeight = ((adjustedDataExtent.height() * mDataset.getDataset(0).getHeight()) / mDataset.getExtentForRequest().height());
360
                        Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
361
                        Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
362
                        nWidth = Math.abs(p1.getX() - p2.getX());
363
                        nHeight = Math.abs(p1.getY() - p2.getY());
364

    
365
                        if(bufWidth > Math.ceil(nWidth) && bufHeight > Math.ceil(nHeight)) {
366
                                step = calcSteps(ulx, uly, lrx, lry, nWidth, nHeight, bufWidth, bufHeight);
367
                                buf = getWindow(ulx, uly, lrx, lry);
368
                        }
369
                } 
370
                
371
                if(buf == null)
372
                        buf = getWindow(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
373
                
374
                buf.setDataExtent(new Rectangle2D.Double(ulx, uly, Math.abs(ulx - lrx), Math.abs(uly - lry)));
375
                
376
                Buffer alphaBand = null;
377
                if(currentQuery.getAlphaBandNumber() != -1) {
378
                        int[] drawableBands = bandList.getDrawableBands();
379
                        bandList.setDrawableBands(new int[]{currentQuery.getAlphaBandNumber(), -1, -1});
380
                        for(int i = 0; i < provider.getInternalProviderCount(); i++)
381
                                ((AbstractRasterDataParameters)((DefaultRasterProvider)provider.getInternalProvider(i)).getDataParameters()).setAlphaBand(currentQuery.getAlphaBandNumber());
382
                        alphaBand = getWindow(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
383
                        bandList.setDrawableBands(drawableBands);
384
                }
385
                
386
                TileCacheManager m = TileCacheLocator.getManager();
387
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
388
                t.setData(new Object[]{buf, alphaBand});
389
                t.setUl(new Point2D.Double(ulx, uly));
390
                t.setLr(new Point2D.Double(lrx, lry));
391
                if(provider.getDataParameters() instanceof MultiDimensionalStoreParameters) {
392
                        MultiDimensionalStoreParameters par = (MultiDimensionalStoreParameters)provider.getDataParameters();
393
                        t.setVariable(par.getStringVariable());
394
                        t.setZ(par.getStringLevel());
395
                        t.setTimeInstant(par.getStringTime());
396
                }
397
                t.setDownloaderParams("AffineTransform", getAffineTransform());
398
                t.setDownloaderParams("Tiling", new Boolean(true));
399
                t.setDownloaderParams("Step", step);
400
                try {
401
                        listener.tileReady(t);
402
                } catch (TileGettingException e) {
403
                        throw new RasterDriverException("Error getting a tile", e);
404
                }
405
                
406
                //listener.nextBuffer(buf, alphaBand, new ExtentImpl(ulx, uly, lrx, lry), this.getAffineTransform(), step, false);
407
                listener.endReading();
408
        }
409
        
410
        /*
411
         * (non-Javadoc)
412
         * @see org.gvsig.raster.impl.store.QueryableRaster#getTile(int, int, int, org.gvsig.fmap.dal.coverage.datastruct.Extent)
413
         */
414
        public Tile getTile(int level, int col, int row, Extent bbox) throws TileGettingException {
415
                TiledRasterProvider tiledProv = ((TiledRasterProvider)provider);
416
                return tiledProv.getTile(level, col, row, bbox);
417
        }
418

    
419
        /*
420
         * (non-Javadoc)
421
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, boolean)
422
         */
423
        public Buffer getWindow(double ulx, double uly, double lrx, double lry, int bufWidth, int bufHeight, boolean adjustToExtent)
424
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
425

    
426
                Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
427
                Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
428
                
429
                if(p1.getX() > p2.getX())
430
                        p1.setLocation(p1.getX() - 1, p1.getY());
431
                else
432
                        p2.setLocation(p2.getX() - 1, p2.getY());
433
                
434
                if(p1.getY() > p2.getY())
435
                        p1.setLocation(p1.getX(), p1.getY() - 1);
436
                else
437
                        p2.setLocation(p2.getX(), p2.getY() - 1);
438
                
439
                if(        ((int)p1.getX()) < 0 || ((int)p2.getX()) > getWidth() ||
440
                                ((int)p2.getY()) > getHeight() || ((int)p2.getY()) < 0)
441
                                throw new InvalidSetViewException("");
442

    
443
                int mallocNBands = 0;
444
                if(bandList.getDrawableBands() != null)
445
                        mallocNBands = bandList.getDrawableBands().length;
446
                else
447
                        mallocNBands = bandList.getDrawableBandsCount();
448

    
449
                //Buffer ReadOnly
450

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

    
467
                //Buffer RW
468
                Buffer raster = null;
469
                
470
                if(forceToMemory) //Fuerza siempre buffer en memoria
471
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
472
                else
473
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
474
                
475
                Extent ex = rManager.getDataStructFactory().createExtent(ulx, uly, lrx, lry);
476
                 
477
                raster = ((DefaultRasterProvider)provider).getWindow(ex, bufWidth, bufHeight, bandList, raster, adjustToExtent);
478

    
479
                return raster;
480
        }
481

    
482
        /*
483
         * (non-Javadoc)
484
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int)
485
         */
486
        public Buffer getWindow(int x, int y, int w, int h)
487
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
488
                if(x < 0 || y < 0 || w > provider.getWidth() || h > provider.getHeight())
489
                        throw new InvalidSetViewException("Out of image");
490

    
491
                //Buffer ReadOnly
492

    
493
                if(isReadOnly()) {
494
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], w, h, getBandCount());
495
                        if(rb instanceof RasterReadOnlyBuffer) {
496
                                try {
497
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, x, y, x + w, y + h, bandList);
498
                                } catch (FileNotExistsException e) {
499
                                        //Esto no debe darse ya que se comprueba al hacer el open.
500
                                        return null;
501
                                } catch (NotSupportedExtensionException e) {
502
                                        //Esto no debe darse ya que se comprueba al hacer el open
503
                                        return null;
504
                                }
505
                                return rb;
506
                        }
507
                }
508

    
509
                //Buffer RW
510
                Buffer raster = null;
511
                
512
                if(forceToMemory) //Fuerza siempre buffer en memoria
513
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
514
                else
515
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
516
                
517
                ((DefaultRasterProvider)provider).getWindow(x, y, bandList, raster);
518
        
519
                return raster;
520
        }
521

    
522
        /*
523
         * (non-Javadoc)
524
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int, int, int)
525
         */
526
        public Buffer getWindow(int x, int y, int w, int h, int bufWidth, int bufHeight)
527
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
528
                if(x < 0 || y < 0 || w > provider.getWidth() || h > provider.getHeight())
529
                        throw new InvalidSetViewException("Out of image");
530

    
531
                //Buffer ReadOnly
532

    
533
                if(isReadOnly()) {
534
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], bufWidth, bufHeight, getBandCount());
535
                        if(rb instanceof RasterReadOnlyBuffer) {
536
                                try {
537
                                        ((RasterReadOnlyBuffer)rb).setBufferParams((QueryableRaster)this, x, y, x + w, y + h, bandList);
538
                                } catch (FileNotExistsException e) {
539
                                        //Esto no debe darse ya que se comprueba al hacer el open.
540
                                        return null;
541
                                } catch (NotSupportedExtensionException e) {
542
                                        //Esto no debe darse ya que se comprueba al hacer el open
543
                                        return null;
544
                                }
545
                                return rb;
546
                        }
547
                }
548

    
549
                //Buffer RW
550
                Buffer raster = null;
551
                
552
                if(forceToMemory) //Fuerza siempre buffer en memoria
553
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
554
                else
555
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
556
                
557
                raster = ((DefaultRasterProvider)provider).getWindow(x, y, w, h, bufWidth, bufHeight, bandList, raster);
558

    
559
                return raster;
560
        }
561

    
562
        //******************************
563
        //Setters and Getters
564
        //******************************
565

    
566
        /**
567
         * Calcula el tama?o de los ficheros en disco
568
         * @return tama?o en bytes de todos los ficheros de la lista
569
         */
570
        public long getFileSize() {
571
                if(provider != null) {
572
                        long size = 0;
573
                        long[] fSize = provider.getFileSizeByProvider();
574
                        if(fSize != null && fSize.length > 0) {
575
                                for (int j = 0; j < fSize.length; j++) {
576
                                        size += fSize[j];        
577
                                }
578
                        }
579
                        return size;
580
                }
581
                return 0;
582
        }
583

    
584
        /*
585
         * (non-Javadoc)
586
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeight()
587
         */
588
        public double getHeight() {
589
                return provider.getHeight();
590
        }
591

    
592
        /*
593
         * (non-Javadoc)
594
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidth()
595
         */
596
        public double getWidth() {
597
                return provider.getWidth();
598
        }
599

    
600
        /*
601
         * (non-Javadoc)
602
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getCellSize()
603
         */
604
        public double getCellSize() {
605
                try {
606
                        Extent e = getExtent();
607
                        double dCellsize = (e.getMax().getX() - e.getMin().getX() ) / getWidth();
608
                        return dCellsize;
609
                } catch (NullPointerException e) {
610
                        return 1;
611
                }
612
        }
613

    
614
        /*
615
         * (non-Javadoc)
616
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCount()
617
         */
618
        public int getBandCount() {
619
                return provider.getBandCount();
620
        }
621

    
622
        /*
623
         * (non-Javadoc)
624
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataType()
625
         */
626
        public int[] getDataType() {
627
                return provider.getDataType();
628
        }
629

    
630
        /*
631
         * (non-Javadoc)
632
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBands()
633
         */
634
        public BandList getBands() {
635
                return bandList;
636
        }
637

    
638
        /**
639
         * Obtiene la coordenada X m?nima de toda la lista
640
         * @return Coordenada X m?nima
641
         */
642
        public double getMinX() {
643
                return provider.getExtent().getMin().getX();
644
        }
645

    
646
        /**
647
         * Obtiene la coordenada Y m?nima de toda la lista
648
         * @return Coordenada Y m?nima
649
         */
650
        public double getMinY() {
651
                return provider.getExtent().getMin().getY();
652
        }
653

    
654
        /**
655
         * Obtiene la coordenada Y m?xima de toda la lista
656
         * @return Coordenada Y m?xima
657
         */
658
        public double getMaxX() {
659
                return provider.getExtent().getMax().getX();        }
660

    
661
        /**
662
         * Obtiene la coordenada Y m?xima de toda la lista
663
         * @return Coordenada Y m?xima
664
         */
665
        public double getMaxY() {
666
                return provider.getExtent().getMax().getY();
667
        }
668

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

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

    
685
        /*
686
         * (non-Javadoc)
687
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#resetNoDataValue()
688
         */
689
        public void resetNoDataValue() {
690
                provider.resetNoDataValue();
691
        }
692

    
693
        /*
694
         * (non-Javadoc)
695
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setNoDataValue(double)
696
         */
697
        public void setNoDataValue(double value) {
698
                provider.setNoDataValue(value);
699
        }
700

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

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

    
717
        /**
718
         * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
719
         * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
720
         * pero para un raster rotado ser? igual al extent del raster como si no
721
         * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
722
         * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
723
         * aplicado.
724
         * @return Extent
725
         */
726
        public Extent getExtentForRequest() {
727
                return provider.getExtentWithoutRot();
728
        }
729

    
730
        /**
731
         * 
732
         * @return
733
         */
734
        public Extent getLastSelectedView(){
735
                return provider.getView();
736
        }
737

    
738
        /*
739
         * (non-Javadoc)
740
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(int)
741
         */
742
        public ColorTable getColorTable(int i){
743
                return provider.getColorTable();
744
        }
745

    
746
        /**
747
         * Obtiene la lista de paletas correspondiente a todos los ficheros que forman el GeoMultiRasterFile
748
         * @return Paleta asociada a este o null si no tiene. Una posici?n null en el array tambi?n indica que
749
         * para ese fichero no hay paletas asociadas.
750
         */
751
        public ColorTable getColorTables() {
752
                return provider.getColorTable();
753
        }
754

    
755
        /*
756
         * (non-Javadoc)
757
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(java.lang.String)
758
         */
759
        public ColorTable getColorTable(String fileName){
760
                return provider.getColorTable();
761
        }
762

    
763
        /*
764
         * (non-Javadoc)
765
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#rasterToWorld(java.awt.geom.Point2D)
766
         */
767
        public Point2D rasterToWorld(Point2D pt) {
768
                return provider.rasterToWorld(pt);
769
        }
770

    
771
        /*
772
         * (non-Javadoc)
773
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#worldToRaster(java.awt.geom.Point2D)
774
         */
775
        public Point2D worldToRaster(Point2D pt) {
776
                return provider.worldToRaster(pt);
777
        }
778

    
779
        /*
780
         * (non-Javadoc)
781
         * @see org.gvsig.raster.impl.store.QueryableRaster#calcSteps(double, double, double, double, double, double, int, int)
782
         */
783
        public double[] calcSteps(double dWorldTLX, double dWorldTLY, double dWorldBRX, double dWorldBRY,
784
                        double nWidth, double nHeight, int bufWidth, int bufHeight){
785
                return provider.calcSteps(dWorldTLX, dWorldTLY, dWorldBRX, dWorldBRY, nWidth, nHeight, bufWidth, bufHeight);
786
        }
787

    
788
        /*
789
         * (non-Javadoc)
790
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isGeoreferenced()
791
         */
792
        public boolean isGeoreferenced() {
793
                return provider.isGeoreferenced();
794
        }
795

    
796
        /*
797
         * (non-Javadoc)
798
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeX()
799
         */
800
        public double getPixelSizeX() {
801
                return provider.getPixelSizeX();
802
        }
803

    
804
        /*
805
         * (non-Javadoc)
806
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeY()
807
         */
808
        public double getPixelSizeY() {
809
                return provider.getPixelSizeY();
810
        }
811

    
812
        /*
813
         * (non-Javadoc)
814
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getData(int, int, int)
815
         */
816
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
817
                return provider.getData(x, y, band);
818
        }
819

    
820
        /*
821
         * (non-Javadoc)
822
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWktProjection()
823
         */
824
        public String getWktProjection() throws RasterDriverException {
825
                return provider.getWktProjection();
826
        }
827

    
828
        /*
829
         * (non-Javadoc)
830
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isInside(java.awt.geom.Point2D)
831
         */
832
        public boolean isInside(Point2D p) {
833
                if(provider != null)
834
                        return provider.isInside(p);
835
                return false;
836
        }
837
        
838
        /*
839
         * (non-Javadoc)
840
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDataStore()
841
         */
842
        public RasterDataStore getDataStore() {
843
                return this;
844
        }
845

    
846
        /**
847
         * 
848
         * @param band
849
         * @return
850
         */
851
        public AffineTransform getAffineTransform(int band){
852
                return provider.getAffineTransform();
853
        }
854

    
855

    
856
        /*
857
         * (non-Javadoc)
858
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setAffineTransform(java.awt.geom.AffineTransform)
859
         */
860
        public void setAffineTransform(AffineTransform transf) {
861
                provider.setAffineTransform(transf);
862
        }
863

    
864
        /**
865
         * Obtiene la matriz de transformaci?n del propio raster. Esta matriz es la encargada
866
         * de convertir las coordenadas de la petici?n en coordenadas a las que se pide a la libreria.
867
         * En gdal, por ejemplo, se piden las coordenadas a la libreria en coordenadas pixel por lo que
868
         * esta matriz tendr? la georreferenciaci?n asociada en el worldfile o cabecera. Otras librerias como
869
         * ermapper la petici?n a la libreria se hace en coordenadas geograficas que son las mismas en las
870
         * que pide el usuario de gvSIG por lo que esta matriz en este caso se inicializa con la identidad.
871
         * @return
872
         */
873
        public AffineTransform getOwnTransformation() {
874
                return provider.getOwnAffineTransform();
875
        }
876

    
877
        /*
878
         * (non-Javadoc)
879
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRotated()
880
         */
881
        public boolean isRotated() {
882
                if(provider != null)
883
                        return provider.isRotated();
884
                return false;
885
        }
886

    
887
        /*
888
         * (non-Javadoc)
889
         * @see org.gvsig.raster.impl.store.QueryableRaster#setDrawableBands(int[])
890
         */
891
        public void setDrawableBands(int[] db) {
892
                getBands().setDrawableBands(db);
893
        }
894
        
895
        /*
896
         * (non-Javadoc)
897
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDrawableBands()
898
         */
899
        public int[] getDrawableBands() {
900
                return getBands().getDrawableBands();
901
        }
902

    
903
        /*
904
         * (non-Javadoc)
905
         * @see org.gvsig.raster.impl.store.QueryableRaster#clearDrawableBands()
906
         */
907
        public void clearDrawableBands() {
908
                getBands().clearDrawableBands();
909
        }
910

    
911
        /*
912
         * (non-Javadoc)
913
         * @see org.gvsig.raster.impl.store.QueryableRaster#addDrawableBand(int, int)
914
         */
915
        public void addDrawableBand(int posRasterBuf, int imageBand) {
916
                getBands().addDrawableBand(posRasterBuf, imageBand);
917
        }
918

    
919
        /**
920
         * 
921
         * @return
922
         */
923
        public boolean isReadOnly() {
924
                return readOnly;
925
        }
926

    
927
        /**
928
         * 
929
         * @param readOnly
930
         */
931
        public void setReadOnly(boolean readOnly) {
932
                this.readOnly = readOnly;
933
                if(readOnly)
934
                        this.forceToMemory = false;
935
        }
936

    
937
        /*
938
         * (non-Javadoc)
939
         * @see org.gvsig.raster.impl.store.QueryableRaster#setMemoryBuffer(boolean)
940
         */
941
        public void setMemoryBuffer(boolean memory) {
942
                this.forceToMemory = memory;
943
                if(memory)
944
                        this.readOnly = false;
945
        }
946

    
947
        /**
948
         * 
949
         * @return
950
         */
951
        public boolean isMemoryBuffer() {
952
                return forceToMemory;
953
        }
954
        
955
        /*
956
         * (non-Javadoc)
957
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewWidth(int, int)
958
         */
959
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
960
                return provider.getOverviewWidth(band, overview);
961
        }
962

    
963
        /*
964
         * (non-Javadoc)
965
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewHeight(int, int)
966
         */
967
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
968
                return provider.getOverviewHeight(band, overview);
969
        }
970

    
971
        /*
972
         * (non-Javadoc)
973
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCount(int)
974
         */
975
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
976
                if(band >= getBandCount())
977
                        throw new BandAccessException("Wrong band");
978
                return provider.getOverviewCount(band);
979
        }
980

    
981
        /*
982
         * (non-Javadoc)
983
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#overviewsSupport()
984
         */
985
        public boolean overviewsSupport() {
986
                if(provider != null)
987
                        return provider.isOverviewsSupported();
988
                return false;
989
        }
990
        
991
        /*
992
         * (non-Javadoc)
993
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#saveGeoreferencingToRmf()
994
         */
995
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
996
                provider.saveObjectToRmf(DefaultRasterProvider.class, provider);
997
        }
998
        
999
        /*
1000
         * (non-Javadoc)
1001
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveSerialInfoToRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1002
         */
1003
        public void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException {
1004
                provider.saveObjectToRmf(TimeSeries.class, serialInfo);
1005
        }
1006
        
1007
        /*
1008
         * (non-Javadoc)
1009
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveColorTableToRmf(org.gvsig.fmap.dal.coverage.store.props.ColorTable)
1010
         */
1011
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
1012
                provider.saveObjectToRmf(ColorTable.class, table);
1013
        }
1014
        
1015
        /*
1016
         * (non-Javadoc)
1017
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadSerialInfoFromRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1018
         */
1019
        public boolean loadSerialInfoFromRmf(TimeSeries serialInfo) {
1020
                try {
1021
                        provider.loadObjectFromRmf(TimeSeries.class, serialInfo);
1022
                        return true;
1023
                } catch (RmfSerializerException e) {
1024
                        //Prueba hasta que alguno tiene la informaci?n
1025
                }
1026
                return false;
1027
        }
1028

    
1029
        /*
1030
         * (non-Javadoc)
1031
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getView()
1032
         */
1033
        public Extent getView() {
1034
                if(provider != null)
1035
                        return provider.getView();
1036
                return null;
1037
        }
1038
        
1039
        /*
1040
         * (non-Javadoc)
1041
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtentWithoutRot()
1042
         */
1043
        public Extent getExtentWithoutRot() {
1044
                if(provider != null)
1045
                        return provider.getExtentWithoutRot();
1046
                return null;
1047
        }
1048
        
1049
        /*
1050
         * (non-Javadoc)
1051
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOwnAffineTransform()
1052
         */
1053
        public AffineTransform getOwnAffineTransform() {
1054
                if(provider != null)
1055
                        return provider.getOwnAffineTransform();
1056
                return null;
1057
        }
1058
        
1059
        /*
1060
         * (non-Javadoc)
1061
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransform()
1062
         */
1063
        public AffineTransform getAffineTransform() {
1064
                if(provider != null)
1065
                        return provider.getAffineTransform();
1066
                return null;
1067
        }
1068
        
1069
        /*
1070
         * (non-Javadoc)
1071
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getProjection()
1072
         */
1073
        public IProjection getProjection() {
1074
                if(provider != null)
1075
                        return provider.getProjection();
1076
                return null;
1077
        }
1078
        
1079
        /*
1080
         * (non-Javadoc)
1081
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getStatistics()
1082
         */
1083
        public Statistics getStatistics() {
1084
                if(provider != null)
1085
                        return provider.getStatistics();
1086
                return null;
1087
        }
1088
        
1089
        /*
1090
         * (non-Javadoc)
1091
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHistogram()
1092
         */
1093
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
1094
                if(provider != null)
1095
                        return provider.getHistogramComputer();
1096
                return null;
1097
        }
1098
        
1099
        /*
1100
         * (non-Javadoc)
1101
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadata()
1102
         */
1103
        public Metadata getMetadata() {
1104
                if(provider != null)
1105
                        return provider.getMetadata();
1106
                return null;
1107
        }
1108
        
1109
        /*
1110
         * (non-Javadoc)
1111
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorTable()
1112
         */
1113
        public ColorTable getColorTable() {
1114
                //Solo tiene sentido si tiene un fichero y ese fichero tiene una sola banda
1115
                if(provider != null)
1116
                        return provider.getColorTable();
1117
                return null;
1118
        }
1119
        
1120
        /*
1121
         * (non-Javadoc)
1122
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparency()
1123
         */
1124
        public Transparency getTransparency() {
1125
                if(provider != null)
1126
                        return provider.getTransparency();
1127
                return null;
1128
        }
1129
        
1130
        /*
1131
         * (non-Javadoc)
1132
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorInterpretation()
1133
         */
1134
        public ColorInterpretation getColorInterpretation() {
1135
                return provider.getColorInterpretation();
1136
        }
1137

    
1138
        /*
1139
         * (non-Javadoc)
1140
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isReproyectable()
1141
         */
1142
        public boolean isReproyectable() {
1143
                if(provider != null)
1144
                        return (provider.isReproyectable());
1145
                return false;
1146
        }
1147
        
1148
        /*
1149
         * (non-Javadoc)
1150
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1151
         */
1152
        public String getMetadataName() {
1153
                if(provider != null)
1154
                        return provider.getName();
1155
                return null;
1156
        }
1157
        
1158
        /*
1159
         * (non-Javadoc)
1160
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#cloneDataStore()
1161
         */
1162
        public RasterDataStore cloneDataStore() throws CloneException {
1163
                DefaultRasterStore ds = new DefaultRasterStore();
1164
                ds.parameters = getParameters();
1165
                ds.provider = provider.cloneProvider();
1166
                
1167
                int[] bands = new int[1];
1168
                bands[0] = provider.getBandCount();
1169
                ds.metadata = new MultiDataStoreMetadata(bands);
1170
                ((MultiDataStoreMetadata)ds.metadata).add(provider.getMetadata());
1171
                
1172
                ds.bandList = (BandListImpl)bandList.clone();
1173
                return ds;
1174
        }
1175
        
1176
        /*
1177
         * (non-Javadoc)
1178
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isOpen()
1179
         */
1180
        public boolean isOpen() {
1181
                if(provider == null)
1182
                        return false;
1183
                return provider.isOpen();
1184
        }
1185

    
1186
        /*
1187
         * (non-Javadoc)
1188
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getProvider()
1189
         */
1190
        public CoverageStoreProvider getProvider() {
1191
                return provider;
1192
        }
1193
        
1194
        /*
1195
         * (non-Javadoc)
1196
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getInfoByPoint(double, double)
1197
         */
1198
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
1199
                return null;
1200
        }
1201

    
1202
        /*
1203
         * (non-Javadoc)
1204
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#goTo(int)
1205
         */
1206
        public void goTo(int position) throws OperationNotSupportedException {
1207
                if(!isTimeSupportedByTheProvider())
1208
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1209
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1210
                        ((MultiDimensionalStoreParameters)getParameters()).goTo(position);
1211
                }
1212
        }
1213

    
1214
        /*
1215
         * (non-Javadoc)
1216
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectNext()
1217
         */
1218
        public void selectNext() throws OperationNotSupportedException {
1219
                if(!isTimeSupportedByTheProvider())
1220
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1221
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1222
                        ((MultiDimensionalStoreParameters)getParameters()).selectNextInstant();
1223
                }
1224
        }
1225

    
1226
        /*
1227
         * (non-Javadoc)
1228
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectPrev()
1229
         */
1230
        public void selectPrev() throws OperationNotSupportedException {
1231
                if(!isTimeSupportedByTheProvider())
1232
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1233
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1234
                        ((MultiDimensionalStoreParameters)getParameters()).selectPrevInstant();
1235
                }
1236
        }
1237
        
1238
        /*
1239
         * (non-Javadoc)
1240
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#setTime(org.gvsig.timesupport.Time)
1241
         */
1242
        public void setTime(Time time) throws TimeException, OperationNotSupportedException {
1243
                if(!isTimeSupportedByTheProvider())
1244
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1245
                
1246
        }
1247
        
1248
        /**
1249
         * Returns true whether all providers support time
1250
         * @return
1251
         */
1252
        private boolean isTimeSupportedByTheProvider() {
1253
                if(provider != null)
1254
                        return provider.isTimeSupported();
1255
                return false;
1256
        }
1257
        
1258
        /*
1259
         * (non-Javadoc)
1260
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRasterEnclosed()
1261
         */
1262
        public boolean isRasterEnclosed() {
1263
                if(provider != null)
1264
                        return provider.isRasterEnclosed();
1265
                return false;
1266
        }
1267

    
1268
        /*
1269
         * (non-Javadoc)
1270
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
1271
         */
1272
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
1273
                try {
1274
                        return ((TiledRasterProvider)provider).getCoordsInLevel(viewCenter, level, w, h);
1275
                } catch (ClassCastException e) {
1276
                        return null;
1277
                }
1278
        }
1279

    
1280
        /*
1281
         * (non-Javadoc)
1282
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
1283
         */
1284
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
1285
                try {
1286
                        return ((TiledRasterProvider)provider).getCoordsInTheNearestLevel(extent, w, h);
1287
                } catch (ClassCastException e) {
1288
                        return null;
1289
                }
1290
        }
1291

    
1292
        /*
1293
         * (non-Javadoc)
1294
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getZoomLevels()
1295
         */
1296
        public int getZoomLevels() {
1297
                try {
1298
                        return ((TiledRasterProvider)provider).getZoomLevels();
1299
                } catch (ClassCastException e) {
1300
                        return -1;
1301
                }
1302
        }
1303

    
1304
        /*
1305
         * (non-Javadoc)
1306
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getNearestLevel(double)
1307
         */
1308
        public int getNearestLevel(double pixelSize) {
1309
                try {
1310
                        return ((TiledRasterProvider)provider).getNearestLevel(pixelSize);
1311
                } catch (ClassCastException e) {
1312
                        return -1;
1313
                }
1314
        }
1315
        
1316
        /*
1317
         * (non-Javadoc)
1318
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setTileServer(java.lang.Class)
1319
         */
1320
        public void setTileServer(Class<?> tileServer) {
1321
                if(provider instanceof TiledRasterProvider) {
1322
                        try {
1323
                                ((TiledRasterProvider)provider).setTileServer(tileServer);
1324
                        } catch (ClassCastException e) {
1325
                        }
1326
                }
1327
        }
1328

    
1329
        /*
1330
         * (non-Javadoc)
1331
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getInternalParameters()
1332
         */
1333
        public RasterDataParameters getInternalParameters() {
1334
                if(provider instanceof TiledRasterProvider) {
1335
                        DefaultRasterProvider prov = (DefaultRasterProvider)((TiledRasterProvider)provider).getInternalProvider();
1336
                        return prov.getDataParameters();
1337
                }
1338
                return (RasterDataParameters)getParameters();
1339
        }
1340

    
1341
        /*
1342
         * (non-Javadoc)
1343
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#newDataStore()
1344
         */
1345
        public RasterDataStore newDataStore() {
1346
                if(provider != null) {
1347
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
1348
                        try {
1349
                                return manager.open((DataStoreParameters)parameters);
1350
                        } catch (NotSupportedExtensionException e) {
1351
                                return null;
1352
                        } catch (RasterDriverException e) {
1353
                                return null;
1354
                        }
1355
                }
1356
                return null;
1357
        }
1358

    
1359
        /*
1360
         * (non-Javadoc)
1361
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileNameByProvider()
1362
         */
1363
        public String[] getURIByProvider() {
1364
                return provider.getURIByProvider();
1365
        }
1366

    
1367
        /*
1368
         * (non-Javadoc)
1369
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileSizeByProvider()
1370
         */
1371
        public long[] getFileSizeByProvider() {
1372
                return provider.getFileSizeByProvider();
1373
        }
1374

    
1375
        /*
1376
         * (non-Javadoc)
1377
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getProviderCount()
1378
         */
1379
        public int getProviderCount() {
1380
                return provider.getInternalProviderCount();
1381
        }
1382
        
1383
        /*
1384
         * (non-Javadoc)
1385
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCountByProvider()
1386
         */
1387
        public int[] getBandCountByProvider() {
1388
                return provider.getBandCountByProvider();
1389
        }
1390
        
1391
        /*
1392
         * (non-Javadoc)
1393
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataParametersByProvider()
1394
         */
1395
        public RasterDataParameters[] getDataParametersByProvider() {
1396
                RasterDataParameters[] res = new RasterDataParameters[getProviderCount()];
1397
                for (int i = 0; i < res.length; i++) {
1398
                        res[i] = (RasterDataParameters)provider.getInternalProvider(i).getDataParameters();                        
1399
                }
1400
                return res;
1401
        }
1402
        
1403
        /*
1404
         * (non-Javadoc)
1405
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadataByProvider()
1406
         */
1407
        public Metadata[] getMetadataByProvider() {
1408
                Metadata[] res = new Metadata[getProviderCount()];
1409
                for (int i = 0; i < res.length; i++) {
1410
                        res[i] = provider.getInternalProvider(i).getMetadata();                        
1411
                }
1412
                return res;
1413
        }
1414
        
1415
        /*
1416
         * (non-Javadoc)
1417
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCountByProvider()
1418
         */
1419
        public int[] getOverviewCountByProvider(int band) throws BandAccessException {
1420
                int[] res = new int[getProviderCount()];
1421
                for (int i = 0; i < res.length; i++) {
1422
                        try {
1423
                                res[i] = provider.getInternalProvider(i).getOverviewCount(band);
1424
                        } catch (RasterDriverException e) {
1425
                                throw new BandAccessException("", e);
1426
                        }                        
1427
                }
1428
                return res;
1429
        }
1430
        
1431
        /*
1432
         * (non-Javadoc)
1433
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewSizeByProvider(int, int)
1434
         */
1435
        public String[] getOverviewSizeByProvider(int band, int overview) throws BandAccessException {
1436
                String[] res = new String[getProviderCount()];
1437
                for (int i = 0; i < res.length; i++) {
1438
                        try {
1439
                                res[i] = provider.getInternalProvider(i).getOverviewWidth(band, overview) + 
1440
                                                 "x" + 
1441
                                                 provider.getInternalProvider(i).getOverviewHeight(band, overview);
1442
                        } catch (RasterDriverException e) {
1443
                                throw new BandAccessException("", e);
1444
                        }                        
1445
                }
1446
                return res;
1447
        }
1448
        
1449
        /*
1450
         * (non-Javadoc)
1451
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransformByProvider()
1452
         */
1453
        public AffineTransform[] getAffineTransformByProvider() {
1454
                AffineTransform[] res = new AffineTransform[getProviderCount()];
1455
                for (int i = 0; i < res.length; i++) {
1456
                        res[i] = provider.getInternalProvider(i).getAffineTransform();
1457
                }
1458
                return res;
1459
        }
1460
        
1461
        /*
1462
         * (non-Javadoc)
1463
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeightByProvider()
1464
         */
1465
        public double[] getHeightByProvider() {
1466
                double[] res = new double[getProviderCount()];
1467
                for (int i = 0; i < res.length; i++) {
1468
                        res[i] = provider.getInternalProvider(i).getHeight();
1469
                }
1470
                return res;
1471
        }
1472
        
1473
        /*
1474
         * (non-Javadoc)
1475
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidthByProvider()
1476
         */
1477
        public double[] getWidthByProvider() {
1478
                double[] res = new double[getProviderCount()];
1479
                for (int i = 0; i < res.length; i++) {
1480
                        res[i] = provider.getInternalProvider(i).getWidth();
1481
                }
1482
                return res;
1483
        }
1484
        
1485
        /*
1486
         * (non-Javadoc)
1487
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#addFile(java.lang.String)
1488
         */
1489
        public void addFile(String file) throws InvalidSourceException {
1490
                provider.addFile(file);
1491
        }
1492
        
1493
        /*
1494
         * (non-Javadoc)
1495
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#removeFile(java.lang.String)
1496
         */
1497
        public void removeFile(String file) {
1498
                provider.removeFile(file);
1499
                bandList.removeBands(file);
1500
        }
1501
        
1502
        /*
1503
         * (non-Javadoc)
1504
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getURIByBand(int)
1505
         */
1506
        public String getURIByBand(int band) {
1507
                return provider.getURIByBand(band);
1508
        }
1509
}