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 / DefaultMultiRasterStore.java @ 237

History | View | Annotate | Download (60.2 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
import java.io.File;
28
import java.util.ArrayList;
29

    
30
import org.cresques.cts.IProjection;
31
import org.gvsig.fmap.dal.DataStoreParameters;
32
import org.gvsig.fmap.dal.coverage.RasterLibrary;
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.FileNotExistsException;
40
import org.gvsig.fmap.dal.coverage.exception.FileNotFoundInListException;
41
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
42
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
43
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
44
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
45
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
46
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
47
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
48
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
49
import org.gvsig.fmap.dal.coverage.grid.render.TileListener;
50
import org.gvsig.fmap.dal.coverage.store.MultiRasterStore;
51
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
52
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
53
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
54
import org.gvsig.fmap.dal.coverage.store.props.Histogram;
55
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
56
import org.gvsig.fmap.dal.coverage.store.props.SerialInfo;
57
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
58
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
59
import org.gvsig.fmap.dal.exception.InitializeException;
60
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
61
import org.gvsig.raster.impl.DefaultRasterManager;
62
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
63
import org.gvsig.raster.impl.datastruct.BandListImpl;
64
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
65
import org.gvsig.raster.impl.datastruct.ExtentImpl;
66
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
67
import org.gvsig.raster.impl.provider.RasterProvider;
68
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
69
import org.gvsig.raster.impl.store.properties.MultiDataStoreHistogram;
70
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
71
import org.gvsig.raster.impl.store.properties.MultiDataStoreStatistics;
72

    
73
/**
74
 * Clase que representa una imagen de raster georreferenciada formada por varias
75
 * imagenes de disco que tienen la misma extensi?n. Contiene funcionalidades
76
 * para abrir ficheros, gestionar el extent, pintar el raster sobre un DataImage
77
 * con su gesti?n de bandas correspondiente.
78
 *
79
 * @author Nacho Brodin (nachobrodin@gmail.com)
80
 */
81
public class DefaultMultiRasterStore extends AbstractRasterDataStore implements MultiRasterStore {
82
        protected ArrayList<RasterProvider>     providers     = new ArrayList<RasterProvider>();
83
        protected BandListImpl                  bandList      = new BandListImpl();
84
        protected MultiDataStoreStatistics      stats         = null;
85
        protected MultiDataStoreHistogram       histogram     = null;
86
        protected MultiDataStoreMetadata        metadata      = null;
87
        /**
88
         * Flag que fuerza al buffer de solo lectura
89
         */
90
        protected boolean                       readOnly      = false;
91
        /**
92
         * Flag que fuerza al buffer en memoria
93
         */
94
        protected boolean                       forceToMemory = false;
95
        protected int                           percent       = 0;
96
        
97

    
98
        //TODO: FUNCIONALIDAD: Contructores igual a RasterDataset + String[] nameFiles
99
        public DefaultMultiRasterStore() {
100
                super();
101
        }
102

    
103
        /**
104
         * Crea un objeto MultiRasterDataset nuevo con los mismos ficheros
105
         * que el actual.
106
         * @return MultiRasterDataset
107
         */
108
        public RasterDataStore newDataStore() {
109
                try {
110
                        String[] fileList = getNameDatasetStringList();
111
                        DefaultMultiRasterStore multiRasterDataset = (DefaultMultiRasterStore)DefaultRasterManager.getInstance().open(fileList[0]);
112
                        for (int j = 1; j < fileList.length; j++)
113
                                multiRasterDataset.addDataStore(new String[] { fileList[j] });
114
                        return multiRasterDataset;
115
                } catch (FileNotFoundInListException e) {
116
                        return null;
117
                } catch (NotSupportedExtensionException e) {
118
                        return null;
119
                } catch (RasterDriverException e) {
120
                        return null;
121
                } catch (OperationNotSupportedException e) {
122
                        //No puede darse. El metodo es @override 
123
                }
124
                return null;
125
        }
126
        
127
        /*
128
         * (non-Javadoc)
129
         * @see org.gvsig.raster.impl.dataset.QueryableRaster#getProviders()
130
         */
131
        public ArrayList<RasterProvider> getProviders() {
132
                return providers;
133
        }
134
        
135
        /*
136
         * (non-Javadoc)
137
         * @see org.gvsig.raster.impl.store.QueryableRaster#getProvider(int)
138
         */
139
        public RasterProvider getProvider(int i) {
140
                if(providers == null || 
141
                        providers.size() == 0 || 
142
                        i < 0 || 
143
                        i >= providers.size())
144
                        return null;
145
                return providers.get(i);
146
        }
147
        
148
        /*
149
         * (non-Javadoc)
150
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getName()
151
         */
152
        public String getName() {
153
                if(providers != null && providers.size() >= 1)
154
                        return providers.get(0).getFName();
155
                return null;
156
        }
157
        
158
        /*
159
         * (non-Javadoc)
160
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getFName(int)
161
         */
162
        public String getFName(int i) {
163
                if(providers != null && providers.size() >= (i + 1))
164
                        return providers.get(i).getFName();
165
                return null;
166
        }
167

    
168
        /*
169
         * (non-Javadoc)
170
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#addDataStore(org.gvsig.fmap.dal.coverage.store.RasterDataStore)
171
         */
172
        public void addDataStore(RasterDataStore f)throws FileNotFoundInListException, InvalidSourceException, OperationNotSupportedException {
173
                if(f instanceof DefaultMultiRasterStore) {
174
                        for (int i = 0; i < ((DefaultMultiRasterStore)f).providers.size(); i++) {
175
                                RasterProvider prov = providers.get(i);
176
                                providers.add(prov);
177
                                addBands(prov);
178
                                if(stats == null)
179
                                        stats = new MultiDataStoreStatistics(((QueryableRaster)f).getProviders());
180
                                else
181
                                        stats.addProvider(prov);
182
                        }
183
                }
184
        }
185

    
186
        /*
187
         * 
188
         */
189
        public void addDataStore(RasterProvider provider) throws OperationNotSupportedException {
190
                providers.add(provider);
191
                addBands(provider);
192
                if(stats == null) 
193
                        stats = new MultiDataStoreStatistics(providers);
194
                else
195
                        stats.addProvider(provider);
196
        }
197
        
198
        /*
199
         * (non-Javadoc)
200
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#addDataStore(java.lang.String[])
201
         */
202
        public void addDataStore(String[] fileName)throws FileNotFoundInListException, NotSupportedExtensionException, RasterDriverException, OperationNotSupportedException {
203
                if(fileName == null || fileName.length < 1)
204
                        throw new FileNotFoundInListException("Error in list.");
205
                if(findDataset(fileName[0]))
206
                        throw new FileNotFoundInListException("The file already is in list.");
207
                for (int i = 0; i < fileName.length; i++) {
208
                        DefaultRasterProvider ds = DefaultRasterProvider.singleDatasetInstance(fileName[i]);
209
                        addDataStore(ds);
210
                }
211
        }
212
        
213
        /*
214
         * (non-Javadoc)
215
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#addDataStore(java.lang.String)
216
         */
217
        public void addDataStore(String fileName)throws FileNotFoundInListException, NotSupportedExtensionException, RasterDriverException, OperationNotSupportedException {
218
                addDataStore(new String[]{fileName});
219
        }
220
        
221
        /**
222
         * A?ade el fichero a lista de georrasterfiles y sus bandas a la lista de bandas
223
         * @param grf
224
         */
225
        public void addBands(RasterProvider prov) {
226
                if(prov == null)
227
                        return;
228

    
229
                for(int i = 0; i < prov.getBandCount(); i++)
230
                        try {
231
                                int dataType = prov.getDataType()[i];
232
                                DatasetBand band = new DatasetBandImpl(prov.getFName(), i, dataType, prov.getBandCount());
233
                                bandList.addBand(band, i);
234
                        } catch(BandNotFoundInListException ex) {
235
                                //No a?adimos la banda
236
                        }
237
        }
238

    
239
        /*
240
         * (non-Javadoc)
241
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#removeDataStore(java.lang.String)
242
         */
243
        public void removeDataStore(String fileName) throws OperationNotSupportedException {
244
                for(int i = 0; i < providers.size(); i++)
245
                        if(providers.get(i).getFName().equals(fileName)) {
246
                                providers.remove(i);
247
                                bandList.removeBands(fileName);
248
                                return;
249
                        }
250
        }
251

    
252
        /*
253
         * (non-Javadoc)
254
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#removeDataStore(org.gvsig.fmap.dal.coverage.store.RasterDataStore)
255
         */
256
        public void removeDataStore(RasterDataStore file) throws OperationNotSupportedException {
257
                for(int i = 0; i < providers.size(); i++)
258
                        if(providers.get(i).getFName().equals(file.getName())) {
259
                                providers.remove(i);
260
                                bandList.removeBands(file.getName());
261
                                return;
262
                        }
263
        }
264

    
265
        /*
266
         * (non-Javadoc)
267
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataStoreCount()
268
         */
269
        public int getDataStoreCount() {
270
                return providers.size();
271
        }
272

    
273
        /**
274
         * Encuentra un fichero en la lista.
275
         * @param file Fichero b?scado.
276
         * @return true si se ha hallado el fichero y false si no se
277
         * ha encontrado
278
         */
279
        public boolean findDataset(RasterDataStore file) {
280
                for(int i = 0; i < providers.size(); i++) {
281
                        RasterProvider prov = providers.get(i);
282
                        if(        prov.getFName().equals(file.getName()))
283
                                return true;
284
                }
285
                return false;
286
        }
287

    
288
        /**
289
         * Encuentra un fichero en la lista.
290
         * @param file Fichero b?scado.
291
         * @return true si se ha hallado el fichero y false si no se
292
         * ha encontrado
293
         */
294
        public boolean findDataset(String fileName) {
295
                for(int i = 0; i < providers.size(); i++)
296
                        if(providers.get(i).getFName().equals(fileName))
297
                                return true;
298
                return false;
299
        }
300

    
301
        /*
302
         * (non-Javadoc)
303
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#close()
304
         */
305
        public void close() {
306
                for(int i = 0; i < providers.size(); i++)
307
                        providers.get(i).close();
308
                providers.clear();
309
                bandList.clear();
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getNameDatasetStringList()
315
         */
316
        public String[] getNameDatasetStringList() {
317
                String[] list = new String[providers.size()];
318
                for(int k = 0; k < providers.size(); k++)
319
                        list[k] = providers.get(k).getFName();
320
                return list;
321
        }
322

    
323
        /**
324
         * Inicializa el buffer a valores NoData
325
         * @param raster Buffer a inicializar
326
         * @param bandList Lista de bandas
327
         */
328
        @SuppressWarnings("unused")
329
        private void initBufferToNoData(Buffer raster, BandList bandList) {
330
                for(int i = 0; i < bandList.getDrawableBandsCount(); i++)
331
                        switch(getDataType()[0]) {
332
                        case Buffer.TYPE_BYTE:raster.assign(i, raster.getByteNoDataValue());break;
333
                        case Buffer.TYPE_SHORT:raster.assign(i, raster.getShortNoDataValue());break;
334
                        case Buffer.TYPE_INT:raster.assign(i, raster.getIntNoDataValue());break;
335
                        case Buffer.TYPE_FLOAT:raster.assign(i, raster.getFloatNoDataValue());break;
336
                        case Buffer.TYPE_DOUBLE:raster.assign(i, raster.getNoDataValue());break;
337
                        }
338
        }
339

    
340
        /**
341
         * A partir de la lista de bandas que dice como cargar el buffer se crean tantos Buffer como ficheros intervienen
342
         * . Cada Buffer corresponde a un dataset del RasterMultiDataset y en ellos se reserva memoria solo para las
343
         * bandas que vayan a ser cargadas. Las otras se asignaran a la banda NotValid.
344
         * @param bl Lista de bandas
345
         * @param width Ancho
346
         * @param height Alto
347
         * @return Lista de buffers en el que cada uno corresponde a un dataset.
348
         */
349
        @SuppressWarnings("unused")
350
        private Buffer[] mallocBuffersDatasets(BandList bl, int width, int height) {
351
                Buffer[] buffers = new Buffer[getDataStoreCount()];
352
                for(int i = 0; i < getDataStoreCount(); i++) {
353
                        if(forceToMemory)
354
                                buffers[i] =  DefaultRasterManager.getInstance().createMemoryBuffer(getProvider(i).getDataType()[0], width, height, getProvider(i).getBandCount(), false);
355
                        else
356
                                buffers[i] =  DefaultRasterManager.getInstance().createBuffer(getProvider(i).getDataType()[0], width, height, getProvider(i).getBandCount(), false);
357

    
358
                        //Asignamos las bandas de cada fichero que no se pintan a null y las que se pintan se reserva memoria
359
                        String name = getProvider(i).getName();
360
                        for(int j = 0; j < getProvider(i).getBandCount(); j ++)
361
                                if(bl.getBufferBandToDraw(name, j) == null)
362
                                        buffers[i].assignBandToNotValid(j);
363
                                else
364
                                        buffers[i].mallocOneBand(getProvider(i).getDataType()[0], width, height, j);
365
                }
366
                return buffers;
367
        }
368

    
369
        /**
370
         * Mezcla los buffers de los dataset que forman el RasterMultiDataset sobre un solo buffer
371
         * con las directrices que marca la lista de bandas. Esta funci?n es la que realiza el switch
372
         * de las bandas.
373
         * @param b Buffer sobre el que se mezcla
374
         * @param bDataset Buffers que corresponden a los datasets
375
         * @param bandList Objeto que contiene la informaci?n de que bandas de los dataset se escriben sobre
376
         * que banda del buffer.
377
         */
378
        @SuppressWarnings("unused")
379
        private void mergeBuffers(Buffer b, Buffer[] bDataset, BandList bandList) {
380
                for(int iDataset = 0; iDataset < getDataStoreCount(); iDataset++){ //Ojo! Los datasets est?n en la misma posici?n que se han metido en mallocBuffersDatasets
381
                        String name = getProvider(iDataset).getFName();
382

    
383
                        for(int iBand = 0; iBand < getProvider(iDataset).getBandCount(); iBand ++) {
384
                                int[] posToDraw = bandList.getBufferBandToDraw(name, iBand);
385
                                if(posToDraw != null)
386
                                        for(int i = 0; i < posToDraw.length; i ++)
387
                                                switch(getDataType()[iDataset]) {
388
                                                case Buffer.TYPE_BYTE: b.assignBand(posToDraw[i], bDataset[iDataset].getBand(iBand)); break;
389
                                                case Buffer.TYPE_SHORT: b.assignBand(posToDraw[i], bDataset[iDataset].getBand(iBand)); break;
390
                                                case Buffer.TYPE_INT: b.assignBand(posToDraw[i], bDataset[iDataset].getBand(iBand)); break;
391
                                                case Buffer.TYPE_FLOAT: b.assignBand(posToDraw[i], bDataset[iDataset].getBand(iBand)); break;
392
                                                case Buffer.TYPE_DOUBLE: b.assignBand(posToDraw[i], bDataset[iDataset].getBand(iBand)); break;
393
                                                }
394
                        }
395
                }
396
        }
397

    
398
        /*
399
         * (non-Javadoc)
400
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double)
401
         */
402
        public Buffer getWindowRaster(double ulx, double uly, double lrx, double lry)
403
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
404
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
405

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

    
409
                Point2D p1 = providers.get(0).worldToRaster(new Point2D.Double(ulx, uly));
410
                Point2D p2 = providers.get(0).worldToRaster(new Point2D.Double(lrx, lry));
411

    
412
                //Para el valor mayor redondeamos por arriba. Para el valor menor redondeamos por abajo.
413
                double p1X = (p1.getX() > p2.getX()) ? Math.ceil(p1.getX()) : Math.floor(p1.getX());
414
                double p1Y = (p1.getY() > p2.getY()) ? Math.ceil(p1.getY()) : Math.floor(p1.getY());
415
                double p2X = (p2.getX() > p1.getX()) ? Math.ceil(p2.getX()) : Math.floor(p2.getX());
416
                double p2Y = (p2.getY() > p1.getY()) ? Math.ceil(p2.getY()) : Math.floor(p2.getY());
417

    
418
                int width = (int)Math.abs(p1X - p2X);
419
                int height = (int)Math.abs(p1Y - p2Y);
420

    
421
                //Ajustamos por si nos hemos salido del raster
422
                if(((int)(Math.min(p1X, p2X) + width)) > getWidth())
423
                        width = (int)(getWidth() - Math.min(p1X, p2X));
424
                if(((int)(Math.min(p1Y, p2Y) + height)) > getHeight())
425
                        height = (int)(getHeight() - Math.min(p1Y, p2Y));
426

    
427
                if (p1X < 0)
428
                        p1X = 0;
429
                if (p1Y < 0)
430
                        p1Y = 0;
431
                if (p2X > getWidth())
432
                        p2X = getWidth();
433
                if (p2Y > getHeight())
434
                        p2Y = getHeight();
435

    
436
                int mallocNBands = 0;
437
                if(bandList.getDrawableBands() != null)
438
                        mallocNBands = bandList.getDrawableBands().length;
439
                else
440
                        mallocNBands = bandList.getDrawableBandsCount();
441

    
442
                //Buffer ReadOnly
443

    
444
                if(isReadOnly()) {
445
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
446
                        if(rb instanceof RasterReadOnlyBuffer) {
447
                                try {
448
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
449
                                } catch (FileNotExistsException e) {
450
                                        //Esto no debe darse ya que se comprueba al hacer el open.
451
                                        return null;
452
                                } catch (NotSupportedExtensionException e) {
453
                                        //Esto no debe darse ya que se comprueba al hacer el open
454
                                        return null;
455
                                }
456
                                return rb;
457
                        }
458
                }
459

    
460
                //Buffer RW
461
                Buffer raster = null;
462
                
463
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
464
                //equivalente a los pixeles redondeados.
465
                Point2D wc1 = providers.get(0).rasterToWorld(new Point2D.Double(p1X, p1Y));
466
                Point2D wc2 = providers.get(0).rasterToWorld(new Point2D.Double(p2X, p2Y));
467
                
468
                if(forceToMemory) //Fuerza siempre buffer en memoria
469
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
470
                else
471
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
472
                
473
                for(int i = 0; i < getDataStoreCount(); i++)
474
                        ((DefaultRasterProvider)providers.get(i)).getWindowRaster(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY(), bandList, raster);
475

    
476
                
477
                //CASO 1: Solo un provider
478
                /*if(providers.size() == 1) {
479
                        if(forceToMemory) //Fuerza siempre buffer en memoria
480
                                raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
481
                        else
482
                                raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
483

484
                        return ((DefaultRasterProvider)providers.get(0)).getWindowRaster(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY(), bandList, raster);
485
                }
486
                
487
                //CASO 2: Multiples providers
488
                
489
                if(forceToMemory) //Fuerza siempre buffer en memoria
490
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, false);
491
                else
492
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, false);
493

494
                for(int iBand = 0; iBand < raster.getBandCount(); iBand ++)
495
                        raster.assignBandToNotValid(iBand);
496

497
                //Reservamos memoria para los buffers por dataset
498
                Buffer[] bufferDatasets = mallocBuffersDatasets(bandList, width, height);
499

500
                for(int i = 0; i < getDataStoreCount(); i++)
501
                        bufferDatasets[i] = ((DefaultRasterProvider)providers.get(i)).getWindowRaster(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY(), bandList, bufferDatasets[i]);
502

503
                //Mezclamos los buffers de cada dataset en un solo buffer
504
                mergeBuffers(raster, bufferDatasets, bandList);
505

506
                for (int i = 0; i < bufferDatasets.length; i++)
507
                        bufferDatasets[i].free();*/
508

    
509
                return raster;
510
        }
511

    
512
        /*
513
         * (non-Javadoc)
514
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, boolean)
515
         */
516
        public Buffer getWindowRaster(double ulx, double uly, double w, double h, boolean adjustToExtent)
517
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
518
                //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
519
                //tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
520
                Extent ext = getExtent();
521
                Point2D pInit = providers.get(0).rasterToWorld(new Point2D.Double(0, 0));
522
                Point2D pEnd = providers.get(0).rasterToWorld(new Point2D.Double((int)getWidth(), (int)getHeight()));
523
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
524
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
525
                double lrx = (((int)(ext.getULX() - wRaster)) == ((int)ext.getLRX())) ? (ulx - w) : (ulx + w);
526
                double lry = (((int)(ext.getULY() - hRaster)) == ((int)ext.getLRY())) ? (uly - h) : (uly + h);
527

    
528
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
529

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

    
533
                Point2D p1 = providers.get(0).worldToRaster(new Point2D.Double(ulx, uly));
534
                Point2D p2 = providers.get(0).worldToRaster(new Point2D.Double(lrx, lry));
535
                int width = (int)Math.abs(Math.ceil(p2.getX()) - Math.floor(p1.getX()));
536
                int height = (int)Math.abs(Math.floor(p1.getY()) - Math.ceil(p2.getY()));
537

    
538
                //Ajustamos por si nos hemos salido del raster
539
                if(((int)(p1.getX() + width)) > getWidth())
540
                        width = (int)(getWidth() - p1.getX());
541
                if(((int)(p1.getY() + height)) > getHeight())
542
                        height = (int)(getHeight() - p1.getY());
543

    
544
                if (p1.getX() < 0)
545
                        p1.setLocation(0, p1.getY());
546
                if (p1.getY() < 0)
547
                        p1.setLocation(p1.getX(), 0);
548
                if (p2.getX() > getWidth())
549
                        p2.setLocation(getWidth(), p2.getY());
550
                if (p2.getY() > getHeight())
551
                        p2.setLocation(p2.getX(), getHeight());
552

    
553
                int mallocNBands = 0;
554
                if(bandList.getDrawableBands() != null)
555
                        mallocNBands = bandList.getDrawableBands().length;
556
                else
557
                        mallocNBands = bandList.getDrawableBandsCount();
558

    
559
                //Buffer ReadOnly
560

    
561
                if(isReadOnly()) {
562
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
563
                        if(rb instanceof RasterReadOnlyBuffer) {
564
                                try {
565
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
566
                                } catch (FileNotExistsException e) {
567
                                        //Esto no debe darse ya que se comprueba al hacer el open.
568
                                        return null;
569
                                } catch (NotSupportedExtensionException e) {
570
                                        //Esto no debe darse ya que se comprueba al hacer el open
571
                                        return null;
572
                                }
573
                                return rb;
574
                        }
575
                }
576
                
577
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
578
                //equivalente a los pixeles redondeados.
579
                Point2D wc1 = providers.get(0).rasterToWorld(new Point2D.Double(Math.floor(p1.getX()), Math.floor(p1.getY())));
580
                Point2D wc2 = providers.get(0).rasterToWorld(new Point2D.Double(Math.ceil(p2.getX()), Math.ceil(p2.getY())));
581

    
582
                //Buffer RW
583
                Buffer raster = null;
584
                
585
                if(forceToMemory) //Fuerza siempre buffer en memoria
586
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
587
                else
588
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
589

    
590
                if(!adjustToExtent)
591
                         initBufferToNoData(raster, bandList);
592
                
593
                for(int i = 0; i < getDataStoreCount(); i++)
594
                        ((DefaultRasterProvider)providers.get(i)).getWindowRaster(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()), bandList, raster, adjustToExtent);
595
                
596
                
597
                //CASO 1: Solo un provider
598
                /*if(providers.size() == 1) {
599
                        if(forceToMemory) //Fuerza siempre buffer en memoria
600
                                raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
601
                        else
602
                                raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
603
                        return ((DefaultRasterProvider)providers.get(0)).getWindowRaster(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()), bandList, raster, adjustToExtent);
604
                }
605
                
606
                //CASO 2: Multiples providers
607
                if(forceToMemory) //Fuerza siempre buffer en memoria
608
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, false);
609
                else
610
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, false);
611

612
                for(int iBand = 0; iBand < raster.getBandCount(); iBand ++)
613
                        raster.assignBandToNotValid(iBand);
614

615
                //Si no vamos a ajustar el extent al raster inicializamos el buffer a noData ya que este puede ser
616
                //m?s grande y salirse de los l?mites.
617
                if(!adjustToExtent)
618
                         initBufferToNoData(raster, bandList);
619

620
                //Reservamos memoria para los buffers por dataset
621
                Buffer[] bufferDatasets = mallocBuffersDatasets(bandList, width, height);
622

623
                for(int i = 0; i < getDataStoreCount(); i++)
624
                        bufferDatasets[i] = ((DefaultRasterProvider)providers.get(i)).getWindowRaster(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()), bandList, bufferDatasets[i], adjustToExtent);
625
                        //bufferDatasets[i] = ((RasterDataStore)files.get(i)).getWindowRaster(x, y, w, h, bandList, bufferDatasets[i], adjustToExtent);
626

627
                //Mezclamos los buffers de cada dataset en un solo buffer
628
                mergeBuffers(raster, bufferDatasets, bandList);
629

630
                for (int i = 0; i < bufferDatasets.length; i++)
631
                        bufferDatasets[i].free();*/
632

    
633
                return raster;
634
        }
635
        
636
        /*
637
         * (non-Javadoc)
638
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.grid.render.TileListener, int)
639
         */
640
        public void getWindowRaster(double ulx, double uly, double lrx, double lry, 
641
                int bufWidth, int bufHeight, TileListener listener)
642
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
643
                double[] step = null;
644
                Buffer buf = null;
645
                
646
                //Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
647
                if(!currentQuery.isSupersamplingLoadingBuffer()) {
648
                        //nWidth = ((adjustedDataExtent.width() * mDataset.getDataset(0).getWidth()) / mDataset.getExtentForRequest().width());
649
                        //nHeight = ((adjustedDataExtent.height() * mDataset.getDataset(0).getHeight()) / mDataset.getExtentForRequest().height());
650
                        Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
651
                        Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
652
                        nWidth = Math.abs(p1.getX() - p2.getX());
653
                        nHeight = Math.abs(p1.getY() - p2.getY());
654

    
655
                        if(bufWidth > Math.ceil(nWidth) && bufHeight > Math.ceil(nHeight)) {
656
                                step = calcSteps(ulx, uly, lrx, lry, nWidth, nHeight, bufWidth, bufHeight);
657
                                buf = getWindowRaster(ulx, uly, lrx, lry);
658
                        }
659
                } 
660
                
661
                if(buf == null)
662
                        buf = getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
663
                
664
                buf.setDataExtent(new Rectangle2D.Double(ulx, uly, Math.abs(ulx - lrx), Math.abs(uly - lry)));
665
                
666
                Buffer alphaBand = null;
667
                if(currentQuery.getAlphaBandNumber() != -1) {
668
                        int[] drawableBands = bandList.getDrawableBands();
669
                        bandList.setDrawableBands(new int[]{currentQuery.getAlphaBandNumber(), -1, -1});
670
                        for(int i = 0; i < getDataStoreCount(); i++)
671
                                ((AbstractRasterDataParameters)((DefaultRasterProvider)providers.get(i)).getDataParameters()).setAlphaBand(currentQuery.getAlphaBandNumber());
672
                        alphaBand = getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
673
                        bandList.setDrawableBands(drawableBands);
674
                }
675
                
676
                listener.nextBuffer(buf, alphaBand, new ExtentImpl(ulx, uly, lrx, lry), this.getAffineTransform(), step, false);
677
                listener.endReading();
678
        }
679

    
680
        /*
681
         * (non-Javadoc)
682
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, boolean)
683
         */
684
        public Buffer getWindowRaster(double ulx, double uly, double lrx, double lry, int bufWidth, int bufHeight, boolean adjustToExtent)
685
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
686

    
687
                Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
688
                Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
689
                
690
                if(p1.getX() > p2.getX())
691
                        p1.setLocation(p1.getX() - 1, p1.getY());
692
                else
693
                        p2.setLocation(p2.getX() - 1, p2.getY());
694
                
695
                if(p1.getY() > p2.getY())
696
                        p1.setLocation(p1.getX(), p1.getY() - 1);
697
                else
698
                        p2.setLocation(p2.getX(), p2.getY() - 1);
699
                
700
                if(        ((int)p1.getX()) < 0 || ((int)p2.getX()) > getWidth() ||
701
                                ((int)p2.getY()) > getHeight() || ((int)p2.getY()) < 0)
702
                                throw new InvalidSetViewException("");
703

    
704
                int mallocNBands = 0;
705
                if(bandList.getDrawableBands() != null)
706
                        mallocNBands = bandList.getDrawableBands().length;
707
                else
708
                        mallocNBands = bandList.getDrawableBandsCount();
709

    
710
                //Buffer ReadOnly
711

    
712
                if(isReadOnly()) {
713
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], bufWidth, bufHeight, getBandCount());
714
                        if(rb instanceof RasterReadOnlyBuffer) {
715
                                try {
716
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
717
                                } catch (FileNotExistsException e) {
718
                                        //Esto no debe darse ya que se comprueba al hacer el open.
719
                                        return null;
720
                                } catch (NotSupportedExtensionException e) {
721
                                        //Esto no debe darse ya que se comprueba al hacer el open
722
                                        return null;
723
                                }
724
                                return rb;
725
                        }
726
                }
727

    
728
                //Buffer RW
729
                Buffer raster = null;
730
                
731
                if(forceToMemory) //Fuerza siempre buffer en memoria
732
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
733
                else
734
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
735
                
736
                for(int i = 0; i < getDataStoreCount(); i++)
737
                        ((DefaultRasterProvider)providers.get(i)).getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, bandList, raster, adjustToExtent);
738

    
739
                
740
                //CASO 1: Solo un provider
741
                /*if(providers.size() == 1) {
742
                        if(forceToMemory) //Fuerza siempre buffer en memoria
743
                                raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
744
                        else
745
                                raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
746
                        return ((DefaultRasterProvider)providers.get(0)).getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, bandList, raster, adjustToExtent);
747
                }
748
                
749
                //CASO 2: Multiples providers
750
                if(forceToMemory) //Fuerza siempre buffer en memoria
751
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, false);
752
                else
753
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, false);
754

755
                for(int iBand = 0; iBand < raster.getBandCount(); iBand ++)
756
                        raster.assignBandToNotValid(iBand);
757

758
                //Si no vamos a ajustar el extent al raster inicializamos el buffer a noData ya que este puede ser
759
                //m?s grande y salirse de los l?mites.
760
                if(!adjustToExtent)
761
                         initBufferToNoData(raster, bandList);
762

763
                //Reservamos memoria para los buffers por dataset
764
                Buffer[] bufferDatasets = mallocBuffersDatasets(bandList, bufWidth, bufHeight);
765
                for(int i = 0; i < getDataStoreCount(); i++)
766
                        bufferDatasets[i] = ((DefaultRasterProvider)providers.get(i)).getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, bandList, bufferDatasets[i], adjustToExtent);
767

768
                //Mezclamos los buffers de cada dataset en un solo buffer
769
                mergeBuffers(raster, bufferDatasets, bandList);
770

771
                for (int i = 0; i < bufferDatasets.length; i++)
772
                        bufferDatasets[i].free();*/
773

    
774
                return raster;
775
        }
776

    
777
        /*
778
         * (non-Javadoc)
779
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int)
780
         */
781
        public Buffer getWindowRaster(int x, int y, int w, int h)
782
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
783
                if(x < 0 || y < 0 || w > providers.get(0).getWidth() || h > providers.get(0).getHeight())
784
                        throw new InvalidSetViewException("Out of image");
785

    
786
                //Buffer ReadOnly
787

    
788
                if(isReadOnly()) {
789
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], w, h, getBandCount());
790
                        if(rb instanceof RasterReadOnlyBuffer) {
791
                                try {
792
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, x, y, x + w, y + h, bandList);
793
                                } catch (FileNotExistsException e) {
794
                                        //Esto no debe darse ya que se comprueba al hacer el open.
795
                                        return null;
796
                                } catch (NotSupportedExtensionException e) {
797
                                        //Esto no debe darse ya que se comprueba al hacer el open
798
                                        return null;
799
                                }
800
                                return rb;
801
                        }
802
                }
803

    
804
                //Buffer RW
805
                Buffer raster = null;
806
                
807
                if(forceToMemory) //Fuerza siempre buffer en memoria
808
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
809
                else
810
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
811
                
812
                for(int i = 0; i < getDataStoreCount(); i++)
813
                        ((DefaultRasterProvider)providers.get(i)).getWindowRaster(x, y, w, h, bandList, raster);
814
                
815
                //CASO 1: Solo un provider
816
                /*if(providers.size() == 1) {
817
                        if(forceToMemory) //Fuerza siempre buffer en memoria
818
                                raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
819
                        else
820
                                raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
821
                        return ((DefaultRasterProvider)providers.get(0)).getWindowRaster(x, y, w, h, bandList, raster);
822
                }
823
                
824
                //CASO 2: Multiples providers
825
                if(forceToMemory) //Fuerza siempre buffer en memoria
826
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), false);
827
                else
828
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), false);
829

830
                for(int iBand = 0; iBand < raster.getBandCount(); iBand ++)
831
                        raster.assignBandToNotValid(iBand);
832

833
                //Reservamos memoria para los buffers por dataset
834
                Buffer[] bufferDatasets = mallocBuffersDatasets(bandList, w, h);
835
                for(int i = 0; i < getDataStoreCount(); i++)
836
                        bufferDatasets[i] = ((DefaultRasterProvider)providers.get(i)).getWindowRaster(x, y, w, h, bandList, bufferDatasets[i]);
837

838
                //Mezclamos los buffers de cada dataset en un solo buffer
839
                mergeBuffers(raster, bufferDatasets, bandList);
840

841
                for (int i = 0; i < bufferDatasets.length; i++)
842
                        bufferDatasets[i].free();*/
843

    
844
                return raster;
845
        }
846

    
847
        /*
848
         * (non-Javadoc)
849
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int, int, int)
850
         */
851
        public Buffer getWindowRaster(int x, int y, int w, int h, int bufWidth, int bufHeight)
852
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
853
                if(x < 0 || y < 0 || w > providers.get(0).getWidth() || h > providers.get(0).getHeight())
854
                        throw new InvalidSetViewException("Out of image");
855

    
856
                //Buffer ReadOnly
857

    
858
                if(isReadOnly()) {
859
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], bufWidth, bufHeight, getBandCount());
860
                        if(rb instanceof RasterReadOnlyBuffer) {
861
                                try {
862
                                        ((RasterReadOnlyBuffer)rb).setBufferParams((QueryableRaster)this, x, y, x + w, y + h, bandList);
863
                                } catch (FileNotExistsException e) {
864
                                        //Esto no debe darse ya que se comprueba al hacer el open.
865
                                        return null;
866
                                } catch (NotSupportedExtensionException e) {
867
                                        //Esto no debe darse ya que se comprueba al hacer el open
868
                                        return null;
869
                                }
870
                                return rb;
871
                        }
872
                }
873

    
874
                //Buffer RW
875
                Buffer raster = null;
876
                
877
                if(forceToMemory) //Fuerza siempre buffer en memoria
878
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
879
                else
880
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
881
                
882
                for(int i = 0; i < getDataStoreCount(); i++)
883
                        ((DefaultRasterProvider)providers.get(i)).getWindowRaster(x, y, w, h, bufWidth, bufHeight, bandList, raster);
884

    
885
                
886
                //CASO 1: Solo un provider
887
                /*if(providers.size() == 1) {
888
                        if(forceToMemory) //Fuerza siempre buffer en memoria
889
                                raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
890
                        else
891
                                raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
892
                        return ((DefaultRasterProvider)providers.get(0)).getWindowRaster(x, y, w, h, bufWidth, bufHeight, bandList, raster);
893
                }
894
                
895
                //CASO 2: Multiples providers
896
                if(forceToMemory) //Fuerza siempre buffer en memoria
897
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), false);
898
                else
899
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), false);
900

901
                for(int iBand = 0; iBand < raster.getBandCount(); iBand ++)
902
                        raster.assignBandToNotValid(iBand);
903

904
                //Reservamos memoria para los buffers por dataset
905
                Buffer[] bufferDatasets = mallocBuffersDatasets(bandList, bufWidth, bufHeight);
906

907
                for(int i = 0; i < getDataStoreCount(); i++)
908
                        bufferDatasets[i] = ((DefaultRasterProvider)providers.get(i)).getWindowRaster(x, y, w, h, bufWidth, bufHeight, bandList, bufferDatasets[i]);
909

910
                //Mezclamos los buffers de cada dataset en un solo buffer
911
                mergeBuffers(raster, bufferDatasets, bandList);
912

913
                for (int i = 0; i < bufferDatasets.length; i++)
914
                        bufferDatasets[i].free();*/
915

    
916
                return raster;
917
        }
918

    
919
        //******************************
920
        //Setters and Getters
921
        //******************************
922

    
923
        /**
924
         * Calcula el tama?o de los ficheros en disco
925
         * @return tama?o en bytes de todos los ficheros de la lista
926
         */
927
        public long getFileSize() {
928
                int len = 0;
929
                for(int i = 0; i < providers.size();i++)
930
                        if(providers.get(i) != null) {
931
                                File f = new File(providers.get(i).getFName());
932
                                len += f.length();
933
                        }
934
                return len;
935
        }
936

    
937
        /*
938
         * (non-Javadoc)
939
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeight()
940
         */
941
        public double getHeight() {
942
                double[] lenghts = new double[getDataStoreCount()];
943
                for(int i = 0; i < getDataStoreCount(); i++)
944
                        if(providers.get(i) != null)
945
                                lenghts[i] = providers.get(i).getHeight();
946
                return lenghts[0];
947
        }
948

    
949
        /*
950
         * (non-Javadoc)
951
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidth()
952
         */
953
        public double getWidth() {
954
                double[] lenghts = new double[getDataStoreCount()];
955
                for(int i = 0; i < getDataStoreCount(); i++)
956
                        if(providers.get(i) != null)
957
                                lenghts[i] = providers.get(i).getWidth();
958
                return lenghts[0];
959
        }
960

    
961
        /*
962
         * (non-Javadoc)
963
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getCellSize()
964
         */
965
        public double getCellSize() {
966
                try {
967
                        Extent e = getExtent();
968
                        double dCellsize = (e.getMax().getX() - e.getMin().getX() ) / getWidth();
969
                        return dCellsize;
970
                } catch (NullPointerException e) {
971
                        return 1;
972
                }
973
        }
974

    
975
        /*
976
         * (non-Javadoc)
977
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCount()
978
         */
979
        public int getBandCount() {
980
                return bandList.getBandCount();
981
        }
982

    
983
        /*
984
         * (non-Javadoc)
985
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataType()
986
         */
987
        public int[] getDataType() {
988
                int[] dt = new int[getBandCount()];
989

    
990
                if (dt.length == 0)
991
                        return null;
992

    
993
                int k = 0;
994
                for(int i = 0; i < providers.size(); i++) {
995
                        int[] types = providers.get(i).getDataType();
996
                        for (int j = 0; j < types.length; j++) {
997
                                dt[k] = types[j];
998
                                k ++;
999
                        }
1000
                }
1001

    
1002
                return dt;
1003
        }
1004

    
1005
        /*
1006
         * (non-Javadoc)
1007
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getDataStore(int)
1008
         */
1009
        public RasterDataStore getDataStore(int i) {
1010
                try {
1011
                        DefaultMultiRasterStore store = new DefaultMultiRasterStore();
1012
                        store.addDataStore(providers.get(i));
1013
                        store.intializePhase1(null, (DataStoreParameters)providers.get(i).getDataParameters());
1014
                        return store;
1015
                } catch (ArrayIndexOutOfBoundsException e) {
1016
                        return null;
1017
                } catch (InitializeException e) {
1018
                        return null;
1019
                } catch (OperationNotSupportedException e) {
1020
                        DefaultMultiRasterStore store = new DefaultMultiRasterStore();
1021
                        providers.add(providers.get(0));
1022
                        addBands(providers.get(0));
1023
                        if(stats == null) 
1024
                                stats = new MultiDataStoreStatistics(providers);
1025
                        else
1026
                                stats.addProvider(providers.get(0));
1027
                        try {
1028
                                store.intializePhase1(null, (DataStoreParameters)providers.get(0).getDataParameters());
1029
                        } catch (InitializeException e1) {
1030
                                return null;
1031
                        }
1032
                        return store;
1033
                }
1034
        }
1035

    
1036
        /*
1037
         * (non-Javadoc)
1038
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getDataStore(java.lang.String)
1039
         */
1040
        public RasterDataStore getDataStore(String fileName) {
1041
                DefaultMultiRasterStore store = new DefaultMultiRasterStore();
1042
                boolean exists = false;
1043
                try {
1044
                        for(int i = 0; i < providers.size(); i++) {
1045
                                if(providers.get(i).getFName().equals(fileName)) {
1046
                                        store.addDataStore(providers.get(i));
1047
                                        exists = true;
1048
                                }
1049
                        }
1050
                } catch (OperationNotSupportedException e) {
1051
                        providers.add(providers.get(0));
1052
                        addBands(providers.get(0));
1053
                        if(stats == null) 
1054
                                stats = new MultiDataStoreStatistics(providers);
1055
                        else
1056
                                stats.addProvider(providers.get(0));
1057
                        try {
1058
                                store.intializePhase1(null, (DataStoreParameters)providers.get(0).getDataParameters());
1059
                        } catch (InitializeException e1) {
1060
                                return null;
1061
                        }
1062
                }
1063
                if(exists)
1064
                        return store;
1065
                else
1066
                        return null;
1067
        }
1068

    
1069
        /*
1070
         * (non-Javadoc)
1071
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBands()
1072
         */
1073
        public BandList getBands() {
1074
                return bandList;
1075
        }
1076

    
1077
        /**
1078
         * Obtiene la coordenada X m?nima de toda la lista
1079
         * @return Coordenada X m?nima
1080
         */
1081
        public double getMinX() {
1082
                double minx = Double.MAX_VALUE;
1083
                for(int i = 0; i < providers.size(); i++) {
1084
                        double aux = providers.get(i).getExtent().getMin().getX();
1085
                        if(aux < minx)
1086
                                minx = aux;
1087
                }
1088
                return minx;
1089
        }
1090

    
1091
        /**
1092
         * Obtiene la coordenada Y m?nima de toda la lista
1093
         * @return Coordenada Y m?nima
1094
         */
1095
        public double getMinY() {
1096
                double miny = Double.MAX_VALUE;
1097
                for(int i = 0; i < providers.size(); i++) {
1098
                        double aux = providers.get(i).getExtent().getMin().getY();
1099
                        if(aux < miny)
1100
                                miny = aux;
1101
                }
1102
                return miny;
1103
        }
1104

    
1105
        /**
1106
         * Obtiene la coordenada Y m?xima de toda la lista
1107
         * @return Coordenada Y m?xima
1108
         */
1109
        public double getMaxX() {
1110
                double maxx = Double.NEGATIVE_INFINITY;
1111
                for(int i = 0; i < providers.size(); i++) {
1112
                        double aux = providers.get(i).getExtent().getMax().getY();
1113
                        if(aux > maxx)
1114
                                maxx = aux;
1115
                }
1116
                return maxx;
1117
        }
1118

    
1119
        /**
1120
         * Obtiene la coordenada Y m?xima de toda la lista
1121
         * @return Coordenada Y m?xima
1122
         */
1123
        public double getMaxY() {
1124
                double maxy = Double.NEGATIVE_INFINITY;
1125
                for(int i = 0; i < providers.size(); i++) {
1126
                        double aux = providers.get(i).getExtent().getMax().getY();
1127
                        if(aux > maxy)
1128
                                maxy = aux;
1129
                }
1130
                return maxy;
1131
        }
1132

    
1133
        /*
1134
         * (non-Javadoc)
1135
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getNoDataValue()
1136
         */
1137
        public double getNoDataValue() {
1138
                if (providers.isEmpty())
1139
                        return RasterLibrary.defaultNoDataValue;
1140

    
1141
                return providers.get(0).getNoDataValue();
1142
        }
1143

    
1144
        /*
1145
         * (non-Javadoc)
1146
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isNoDataEnabled()
1147
         */
1148
        public boolean isNoDataEnabled() {
1149
                if (providers.isEmpty())
1150
                        return false;
1151

    
1152
                return providers.get(0).isNoDataEnabled();
1153
        }
1154

    
1155
        /*
1156
         * (non-Javadoc)
1157
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#resetNoDataValue()
1158
         */
1159
        public void resetNoDataValue() {
1160
                for (int i = 0; i < providers.size(); i++)
1161
                        providers.get(i).resetNoDataValue();
1162
        }
1163

    
1164
        /*
1165
         * (non-Javadoc)
1166
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setNoDataValue(double)
1167
         */
1168
        public void setNoDataValue(double value) {
1169
                for (int i = 0; i < providers.size(); i++)
1170
                        providers.get(i).setNoDataValue(value);
1171
        }
1172

    
1173
        /*
1174
         * (non-Javadoc)
1175
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setNoDataEnabled(boolean)
1176
         */
1177
        public void setNoDataEnabled(boolean enabled) {
1178
                for (int i = 0; i < providers.size(); i++)
1179
                        providers.get(i).setNoDataEnabled(enabled);
1180
        }
1181

    
1182
        /*
1183
         * (non-Javadoc)
1184
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtent()
1185
         */
1186
        public Extent getExtent() {
1187
                if(providers.size() == 0)
1188
                        return null;
1189
                else
1190
                        return providers.get(0).getExtent();
1191
        }
1192

    
1193
        /**
1194
         * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
1195
         * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
1196
         * pero para un raster rotado ser? igual al extent del raster como si no
1197
         * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
1198
         * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
1199
         * aplicado.
1200
         * @return Extent
1201
         */
1202
        public Extent getExtentForRequest() {
1203
                return providers.get(0).getExtentWithoutRot();
1204
        }
1205

    
1206
        /**
1207
         * 
1208
         * @return
1209
         */
1210
        public Extent getLastSelectedView(){
1211
                return providers.get(0).getView();
1212
        }
1213

    
1214
        /*
1215
         * (non-Javadoc)
1216
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparencyFilesStatus()
1217
         */
1218
        public Transparency getTransparencyFilesStatus() {
1219
                if(providers.size() <= 0)
1220
                        return null;
1221
                Transparency t = providers.get(0).getTransparency();
1222
                for(int i = 1; i < providers.size(); i++) {
1223
                        Transparency t1 = providers.get(i).getTransparency();
1224
                        t.merge(t1);
1225
                }
1226
                return t;
1227
        }
1228

    
1229
        /*
1230
         * (non-Javadoc)
1231
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(int)
1232
         */
1233
        public ColorTable getColorTable(int i){
1234
                if(i >= providers.size())
1235
                        return null;
1236
                return providers.get(i).getColorTable();
1237
        }
1238

    
1239
        /**
1240
         * Obtiene la lista de paletas correspondiente a todos los ficheros que forman el GeoMultiRasterFile
1241
         * @return Paleta asociada a este o null si no tiene. Una posici?n null en el array tambi?n indica que
1242
         * para ese fichero no hay paletas asociadas.
1243
         */
1244
        public ColorTable[] getColorTables(){
1245
                if(providers.size() <= 0)
1246
                        return null;
1247
                ColorTable[] list = new ColorTable[providers.size()];
1248
                for(int i = 0; i < providers.size(); i++)
1249
                        list[i] = providers.get(i).getColorTable();
1250
                return list;
1251
        }
1252

    
1253
        /*
1254
         * (non-Javadoc)
1255
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(java.lang.String)
1256
         */
1257
        public ColorTable getColorTable(String fileName){
1258
                for(int i = 0; i < providers.size(); i++)
1259
                        if(providers.get(i).getFName().indexOf(fileName) == 0)
1260
                                return providers.get(i).getColorTable();
1261
                return null;
1262
        }
1263

    
1264
        /*
1265
         * (non-Javadoc)
1266
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#rasterToWorld(java.awt.geom.Point2D)
1267
         */
1268
        public Point2D rasterToWorld(Point2D pt) {
1269
                return providers.get(0).rasterToWorld(pt);
1270
        }
1271

    
1272
        /*
1273
         * (non-Javadoc)
1274
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#worldToRaster(java.awt.geom.Point2D)
1275
         */
1276
        public Point2D worldToRaster(Point2D pt) {
1277
                return providers.get(0).worldToRaster(pt);
1278
        }
1279

    
1280
        /*
1281
         * (non-Javadoc)
1282
         * @see org.gvsig.raster.impl.store.QueryableRaster#calcSteps(double, double, double, double, double, double, int, int)
1283
         */
1284
        public double[] calcSteps(double dWorldTLX, double dWorldTLY, double dWorldBRX, double dWorldBRY,
1285
                        double nWidth, double nHeight, int bufWidth, int bufHeight){
1286
                return providers.get(0).calcSteps(dWorldTLX, dWorldTLY, dWorldBRX, dWorldBRY, nWidth, nHeight, bufWidth, bufHeight);
1287
        }
1288

    
1289
        /*
1290
         * (non-Javadoc)
1291
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isGeoreferenced()
1292
         */
1293
        public boolean isGeoreferenced() {
1294
                for(int i = 0; i < providers.size(); i++)
1295
                        if(providers.get(i).isGeoreferenced())
1296
                                return true;
1297
                return false;
1298
        }
1299

    
1300
        /*
1301
         * (non-Javadoc)
1302
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeX()
1303
         */
1304
        public double getPixelSizeX() {
1305
                return providers.get(0).getPixelSizeX();
1306
        }
1307

    
1308
        /*
1309
         * (non-Javadoc)
1310
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeY()
1311
         */
1312
        public double getPixelSizeY() {
1313
                return providers.get(0).getPixelSizeY();
1314
        }
1315

    
1316
        /*
1317
         * (non-Javadoc)
1318
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getData(int, int, int)
1319
         */
1320
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
1321
                String file = bandList.getBand(band).getFileName();
1322
                int[] posList = bandList.getBandPositionList();
1323
                for(int i = 0; i < providers.size(); i++)
1324
                        if(providers.get(i).getFName().equals(file))
1325
                                return providers.get(i).getData(x, y, posList[band]);
1326
                return null;
1327
        }
1328

    
1329
        /*
1330
         * (non-Javadoc)
1331
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWktProjection()
1332
         */
1333
        public String getWktProjection() throws RasterDriverException {
1334
                return providers.get(0).getWktProjection();
1335
        }
1336

    
1337
        /*
1338
         * (non-Javadoc)
1339
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getPercent()
1340
         */
1341
        public int getPercent() {
1342
                if (histogram != null)
1343
                        return histogram.getPercent();
1344
                return 0;
1345
        }
1346

    
1347
        /*
1348
         * (non-Javadoc)
1349
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#resetPercent()
1350
         */
1351
        public void resetPercent() {
1352
                if (histogram != null) histogram.resetPercent();
1353
        }
1354

    
1355
        /*
1356
         * (non-Javadoc)
1357
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isInside(java.awt.geom.Point2D)
1358
         */
1359
        public boolean isInside(Point2D p) {
1360
                if(getProvider(0) != null)
1361
                        return getProvider(0).isInside(p);
1362
                return false;
1363
        }
1364
        
1365
        /*
1366
         * (non-Javadoc)
1367
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDataStore()
1368
         */
1369
        public RasterDataStore getDataStore() {
1370
                return this;
1371
        }
1372

    
1373
        /**
1374
         * 
1375
         * @param band
1376
         * @return
1377
         */
1378
        public AffineTransform getAffineTransform(int band){
1379
                if(band < 0 || band > (getBandCount() - 1))
1380
                        return null;
1381
                int[] providerBand = getProviderFromBandNumber(band);
1382
                if(providerBand != null)
1383
                        return providers.get(providerBand[0]).getAffineTransform();
1384
                return null;
1385
        }
1386

    
1387
        /**
1388
         * Obtiene el n?mero de dataset para un n?mero de banda y la posici?n de la banda dentro de
1389
         * ese dataset.
1390
         * @param bandNumber N?mero de banda
1391
         * @return Dataset que corresponde a la banda pedida y n?mero de banda dentro del dataset (dataset, banda)
1392
         */
1393
        public int[] getProviderFromBandNumber(int bandNumber) {
1394
                int cont = 0;
1395
                for (int i = 0; i < getDataStoreCount(); i++) {
1396
                        RasterProvider provider = providers.get(i);
1397
                        cont += provider.getBandCount();
1398
                        if(cont > bandNumber) {
1399
                                int lastBands = (cont - provider.getBandCount()); //Suma de las bandas de todos los datasets anteriores.
1400
                                return new int[]{i, (bandNumber - lastBands)};
1401
                        }
1402
                }
1403
                return null;
1404
        }
1405

    
1406
        /*
1407
         * (non-Javadoc)
1408
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setAffineTransform(java.awt.geom.AffineTransform)
1409
         */
1410
        public void setAffineTransform(AffineTransform transf){
1411
                for (int i = 0; i < getDataStoreCount(); i++)
1412
                        this.getProvider(i).setAffineTransform(transf);
1413
        }
1414

    
1415
        /**
1416
         * Obtiene la matriz de transformaci?n del propio raster. Esta matriz es la encargada
1417
         * de convertir las coordenadas de la petici?n en coordenadas a las que se pide a la libreria.
1418
         * En gdal, por ejemplo, se piden las coordenadas a la libreria en coordenadas pixel por lo que
1419
         * esta matriz tendr? la georreferenciaci?n asociada en el worldfile o cabecera. Otras librerias como
1420
         * ermapper la petici?n a la libreria se hace en coordenadas geograficas que son las mismas en las
1421
         * que pide el usuario de gvSIG por lo que esta matriz en este caso se inicializa con la identidad.
1422
         * @return
1423
         */
1424
        public AffineTransform getOwnTransformation() {
1425
                if(providers != null && providers.size() > 0)
1426
                        return providers.get(0).getOwnAffineTransform();
1427
                return new AffineTransform();
1428
        }
1429

    
1430
        /*
1431
         * (non-Javadoc)
1432
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRotated()
1433
         */
1434
        public boolean isRotated() {
1435
                if(providers != null && providers.size() > 0)
1436
                        return providers.get(0).isRotated();
1437
                return false;
1438
        }
1439

    
1440
        /*
1441
         * (non-Javadoc)
1442
         * @see org.gvsig.raster.impl.store.QueryableRaster#setDrawableBands(int[])
1443
         */
1444
        public void setDrawableBands(int[] db) {
1445
                getBands().setDrawableBands(db);
1446
        }
1447
        
1448
        /*
1449
         * (non-Javadoc)
1450
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDrawableBands()
1451
         */
1452
        public int[] getDrawableBands() {
1453
                return getBands().getDrawableBands();
1454
        }
1455

    
1456
        /*
1457
         * (non-Javadoc)
1458
         * @see org.gvsig.raster.impl.store.QueryableRaster#clearDrawableBands()
1459
         */
1460
        public void clearDrawableBands() {
1461
                getBands().clearDrawableBands();
1462
        }
1463

    
1464
        /*
1465
         * (non-Javadoc)
1466
         * @see org.gvsig.raster.impl.store.QueryableRaster#addDrawableBand(int, int)
1467
         */
1468
        public void addDrawableBand(int posRasterBuf, int imageBand) {
1469
                getBands().addDrawableBand(posRasterBuf, imageBand);
1470
        }
1471

    
1472
        /**
1473
         * 
1474
         * @return
1475
         */
1476
        public boolean isReadOnly() {
1477
                return readOnly;
1478
        }
1479

    
1480
        /**
1481
         * 
1482
         * @param readOnly
1483
         */
1484
        public void setReadOnly(boolean readOnly) {
1485
                this.readOnly = readOnly;
1486
                if(readOnly)
1487
                        this.forceToMemory = false;
1488
        }
1489

    
1490
        /*
1491
         * (non-Javadoc)
1492
         * @see org.gvsig.raster.impl.store.QueryableRaster#setMemoryBuffer(boolean)
1493
         */
1494
        public void setMemoryBuffer(boolean memory) {
1495
                this.forceToMemory = memory;
1496
                if(memory)
1497
                        this.readOnly = false;
1498
        }
1499

    
1500
        /**
1501
         * 
1502
         * @return
1503
         */
1504
        public boolean isMemoryBuffer() {
1505
                return forceToMemory;
1506
        }
1507
        
1508
        /*
1509
         * (non-Javadoc)
1510
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewWidth(int, int)
1511
         */
1512
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1513
                int[] providerBand = getProviderFromBandNumber(band);
1514
                RasterProvider prov = getProvider(providerBand[0]);
1515
                return prov.getOverviewWidth(providerBand[1], overview);
1516
        }
1517

    
1518
        /*
1519
         * (non-Javadoc)
1520
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewHeight(int, int)
1521
         */
1522
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1523
                int[] providerBand = getProviderFromBandNumber(band);
1524
                RasterProvider prov = getProvider(providerBand[0]);
1525
                return prov.getOverviewHeight(providerBand[1], overview);
1526
        }
1527

    
1528
        /*
1529
         * (non-Javadoc)
1530
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCount(int)
1531
         */
1532
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1533
                if(band >= getBandCount())
1534
                        throw new BandAccessException("Wrong band");
1535
                String fileName = getBands().getBand(band).getFileName();
1536
                RasterDataStore store = getDataStore(fileName);
1537
                RasterProvider prov = ((DefaultMultiRasterStore)store).getProvider(0);
1538
                return prov.getOverviewCount(0);
1539
        }
1540

    
1541
        /*
1542
         * (non-Javadoc)
1543
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#overviewsSupport()
1544
         */
1545
        public boolean overviewsSupport() {
1546
                if(getProviders().size() > 0)
1547
                        return getProvider(0).overviewsSupport();
1548
                return false;
1549
        }
1550
        
1551
        /*
1552
         * (non-Javadoc)
1553
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#saveGeoreferencingToRmf()
1554
         */
1555
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
1556
                for (int i = 0; i < providers.size(); i++) {
1557
                        providers.get(i).saveObjectToRmf(DefaultRasterProvider.class, providers.get(i));
1558
                }
1559
        }
1560
        
1561
        /*
1562
         * (non-Javadoc)
1563
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveSerialInfoToRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1564
         */
1565
        public void saveSerialInfoToRmf(SerialInfo serialInfo) throws RmfSerializerException {
1566
                for (int i = 0; i < providers.size(); i++) {
1567
                        providers.get(i).saveObjectToRmf(SerialInfo.class, serialInfo);
1568
                }
1569
        }
1570
        
1571
        /*
1572
         * (non-Javadoc)
1573
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveColorTableToRmf(org.gvsig.fmap.dal.coverage.store.props.ColorTable)
1574
         */
1575
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
1576
                for (int i = 0; i < providers.size(); i++) {
1577
                        providers.get(i).saveObjectToRmf(ColorTable.class, table);
1578
                }
1579
        }
1580
        
1581
        /*
1582
         * (non-Javadoc)
1583
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadSerialInfoFromRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1584
         */
1585
        public boolean loadSerialInfoFromRmf(SerialInfo serialInfo) {
1586
                for (int i = 0; i < providers.size(); i++) {
1587
                        try {
1588
                                providers.get(i).loadObjectFromRmf(SerialInfo.class, serialInfo);
1589
                                return true;
1590
                        } catch (RmfSerializerException e) {
1591
                                //Prueba hasta que alguno tiene la informaci?n
1592
                        }
1593
                }
1594
                return false;
1595
        }
1596

    
1597
        /*
1598
         * (non-Javadoc)
1599
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getView()
1600
         */
1601
        public Extent getView() {
1602
                if(providers.size() >= 1)
1603
                        return providers.get(0).getView();
1604
                return null;
1605
        }
1606
        
1607
        /*
1608
         * (non-Javadoc)
1609
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtentWithoutRot()
1610
         */
1611
        public Extent getExtentWithoutRot() {
1612
                if(providers.size() >= 1)
1613
                        return providers.get(0).getExtentWithoutRot();
1614
                return null;
1615
        }
1616
        
1617
        /*
1618
         * (non-Javadoc)
1619
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOwnAffineTransform()
1620
         */
1621
        public AffineTransform getOwnAffineTransform() {
1622
                if(providers.size() >= 1)
1623
                        return providers.get(0).getOwnAffineTransform();
1624
                return null;
1625
        }
1626
        
1627
        /*
1628
         * (non-Javadoc)
1629
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransform()
1630
         */
1631
        public AffineTransform getAffineTransform() {
1632
                if(providers.size() >= 1)
1633
                        return providers.get(0).getAffineTransform();
1634
                return null;
1635
        }
1636
        
1637
        /*
1638
         * (non-Javadoc)
1639
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getProjection()
1640
         */
1641
        public IProjection getProjection() {
1642
                if(providers.size() >= 1)
1643
                        return providers.get(0).getProjection();
1644
                return null;
1645
        }
1646
        
1647
        /*
1648
         * (non-Javadoc)
1649
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getStatistics()
1650
         */
1651
        public Statistics getStatistics() {
1652
                if(stats == null)
1653
                        stats = new MultiDataStoreStatistics(providers);
1654
                return stats;
1655
        }
1656
        
1657
        /*
1658
         * (non-Javadoc)
1659
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHistogram()
1660
         */
1661
        public Histogram getHistogram() {
1662
                if (histogram == null)
1663
                        histogram = new MultiDataStoreHistogram(this);
1664
                return histogram;
1665
        }
1666
        
1667
        /*
1668
         * (non-Javadoc)
1669
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadata()
1670
         */
1671
        public Metadata getMetadata() {
1672
                if(metadata == null) {
1673
                        int[] bands = new int[providers.size()];
1674
                        for (int i = 0; i < bands.length; i++) 
1675
                                bands[i] = providers.get(i).getBandCount();
1676
                        metadata = new MultiDataStoreMetadata(bands);
1677
                }
1678
                return metadata;
1679
        }
1680
        
1681
        /*
1682
         * (non-Javadoc)
1683
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorTable()
1684
         */
1685
        public ColorTable getColorTable() {
1686
                //Solo tiene sentido si tiene un fichero y ese fichero tiene una sola banda
1687
                if(providers.size() == 1)
1688
                        return providers.get(0).getColorTable();
1689
                return null;
1690
        }
1691
        
1692
        /*
1693
         * (non-Javadoc)
1694
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparency()
1695
         */
1696
        public Transparency getTransparency() {
1697
                if(providers.size() >= 1)
1698
                        return providers.get(0).getTransparency();
1699
                return null;
1700
        }
1701
        
1702
        /*
1703
         * (non-Javadoc)
1704
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorInterpretation()
1705
         */
1706
        public ColorInterpretation getColorInterpretation() {
1707
                DataStoreColorInterpretation ci = new DataStoreColorInterpretation();
1708
                for (int i = 0; i < providers.size(); i++)
1709
                        ci.addColorInterpretation(providers.get(i).getColorInterpretation());
1710
                return ci;
1711
        }
1712
        
1713
        /*
1714
         * (non-Javadoc)
1715
         * @see org.gvsig.fmap.dal.coverage.store.MultiRasterStore#getColorInterpretation(int)
1716
         */
1717
        public ColorInterpretation getColorInterpretation(int file) {
1718
                try {
1719
                        return providers.get(file).getColorInterpretation();
1720
                } catch (ArrayIndexOutOfBoundsException e) {
1721
                        return null;
1722
                }
1723
        }
1724

    
1725
        /*
1726
         * (non-Javadoc)
1727
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isReproyectable()
1728
         */
1729
        public boolean isReproyectable() {
1730
                boolean is = true; 
1731
                for (int i = 0; i < providers.size(); i++) {
1732
                        if(!providers.get(i).isReproyectable())
1733
                                is = false;
1734
                }
1735
                return is;
1736
        }
1737
        
1738
        /*
1739
         * (non-Javadoc)
1740
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1741
         */
1742
        public String getMetadataName() {
1743
                if(providers.size() != 0)
1744
                        return providers.get(0).getName();
1745
                return null;
1746
        }
1747
        
1748
        /*
1749
         * (non-Javadoc)
1750
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#cloneDataStore()
1751
         */
1752
        public RasterDataStore cloneDataStore() {
1753
                DefaultMultiRasterStore ds = new DefaultMultiRasterStore();
1754
                
1755
                int[] bands = new int[providers.size()];
1756
                for (int i = 0; i < bands.length; i++) 
1757
                        bands[i] = providers.get(i).getBandCount();
1758
                ds.metadata = new MultiDataStoreMetadata(bands);
1759
                
1760
                for (int i = 0; i < providers.size(); i++) {
1761
                        RasterProvider prov = providers.get(i).cloneProvider();
1762
                        ds.providers.add(prov);
1763
                        ds.metadata.add(providers.get(i).getMetadata());
1764
                }
1765
                ds.bandList = (BandListImpl)bandList.clone();
1766
                ds.stats = new MultiDataStoreStatistics(ds.providers);
1767
                ds.histogram = new MultiDataStoreHistogram(ds);
1768
                return ds;
1769
        }
1770
        
1771
        /*
1772
         * (non-Javadoc)
1773
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isOpen()
1774
         */
1775
        public boolean isOpen() {
1776
                if(providers == null || providers.size() == 0)
1777
                        return false;
1778
                for (int i = 0; i < providers.size(); i++) {
1779
                        if(!providers.get(i).isOpen())
1780
                                return false;
1781
                }
1782
                return true;
1783
        }
1784

    
1785
        /*
1786
         * (non-Javadoc)
1787
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getProvider()
1788
         */
1789
        public CoverageStoreProvider getProvider() {
1790
                if(providers == null || providers.size() == 0)
1791
                        return providers.get(0);
1792
                return null;
1793
        }
1794
}