Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.multifile.io / src / main / java / org / gvsig / raster / tools / multifile / io / MultiFileProvider.java @ 1329

History | View | Annotate | Download (29.7 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.tools.multifile.io;
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.io.IOException;
29
import java.util.ArrayList;
30

    
31
import org.gvsig.fmap.dal.DALFileLocator;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataStore;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.coverage.RasterLocator;
36
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
37
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
38
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
39
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
40
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
41
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
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.ParsingException;
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.store.parameter.RasterDataParameters;
49
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
50
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
51
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
52
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
53
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
54
import org.gvsig.fmap.dal.exception.CloseException;
55
import org.gvsig.fmap.dal.exception.InitializeException;
56
import org.gvsig.fmap.dal.exception.OpenException;
57
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
58
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
59
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
60
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
61
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
62
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
63
import org.gvsig.fmap.dal.spi.DataStoreProvider;
64
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
65
import org.gvsig.metadata.MetadataLocator;
66
import org.gvsig.raster.cache.tile.provider.TileListener;
67
import org.gvsig.raster.cache.tile.provider.TileServer;
68
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
69
import org.gvsig.raster.impl.datastruct.ExtentImpl;
70
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
71
import org.gvsig.raster.impl.provider.RasterProvider;
72
import org.gvsig.raster.impl.provider.tile.FileTileServer;
73
import org.gvsig.raster.impl.store.DefaultStoreFactory;
74
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
75
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
76
import org.gvsig.raster.impl.store.properties.MultiProviderHistogramComputer;
77
import org.gvsig.raster.impl.store.properties.MultiProviderStatistics;
78
import org.gvsig.tools.ToolsLocator;
79
import org.gvsig.tools.locator.LocatorException;
80
import org.gvsig.tools.task.TaskStatus;
81
/**
82
 * A data provider for a multiband image readed from different files
83
 *
84
 * @author Nacho Brodin (nachobrodin@gmail.com)
85
 */
86
public class MultiFileProvider extends DefaultRasterProvider {
87
        public static String                     NAME                     = "Multifile Raster";
88
        public static String                     DESCRIPTION              = "Multifile Raster Support";
89
        public final String                      METADATA_DEFINITION_NAME = NAME;
90
        private Extent                           viewRequest              = null;
91
        private TileServer                       tileServer               = null;
92
        private boolean                          open                     = false;
93

    
94
    private DataStoreTransparency            fileTransparency         = null;
95
    //private static final Logger              logger                   = LoggerFactory.getLogger(MultifileProvider.class);
96
    protected static String[]                formatList               = null;
97
    private ArrayList<RasterProvider>        providerList             = null;
98
    
99
        public static void register() {
100
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
101
                registerFormats();
102
                
103
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
104
                        dataman.registerStoreProvider(NAME,
105
                                        MultiFileProvider.class, MultiFileDataParametersImpl.class);
106
                }                
107
                
108
                if(DALFileLocator.getFilesystemServerExplorerManager() != null)
109
                        DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
110
                                        NAME, DESCRIPTION,
111
                                        MultiFileServerExplorer.class);
112
                
113
                if (!dataman.getExplorerProviders().contains(NAME)) {
114
                        dataman.registerExplorerProvider(NAME, MultiFileServerExplorer.class, MultiFileServerExplorerParameters.class);
115
                }
116
                
117
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
118
        }
119
        
120
        private static void registerFormats() {
121
                formatList      = new String[] {
122
                                "mff"};
123
                for (int i = 0; i < formatList.length; i++) 
124
                        RasterLocator.getManager().addFormat(formatList[i], MultiFileProvider.class);
125
        }
126
        
127
        public MultiFileProvider() {
128
        }
129
        
130
        /**
131
         * Opens the dataset.
132
         * @param proj Projection
133
         * @param fName File name
134
         * @throws NotSupportedExtensionException
135
         */
136
        public MultiFileProvider(String params) throws NotSupportedExtensionException, OpenException {
137
                super(params);
138
                if(params instanceof String) {
139
                        MultiFileDataParameters p = new MultiFileDataParametersImpl();
140
                        p.setURI((String)params);
141
                        super.init(p, null, ToolsLocator.getDynObjectManager()
142
                                        .createDynObject(
143
                                                        MetadataLocator.getMetadataManager().getDefinition(
144
                                                                        DataStore.METADATA_DEFINITION_NAME)));
145
                        init(p, null);
146
                }
147
        }
148
        
149
        public MultiFileProvider(MultiFileDataParametersImpl params,
150
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
151
                super(params, storeServices, ToolsLocator.getDynObjectManager()
152
                                .createDynObject(
153
                                                MetadataLocator.getMetadataManager().getDefinition(
154
                                                                DataStore.METADATA_DEFINITION_NAME)));
155
                init(params, storeServices);
156
        }
157

    
158
        /**
159
         * Build file references
160
         * @param proj Projection
161
         * @param param Load parameters
162
         * @throws NotSupportedExtensionException
163
         */
164
        public void init(MultiFileDataParameters params,
165
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
166
                
167
                openFromMff();
168

    
169
                uri = getParameters().getURI();
170
                providerList = getParameters().getProviders();
171
                setParam(storeServices, params);
172
                
173
                super.init();
174
                
175
                try {
176
                        loadFromRmf(getRmfBlocksManager());
177
                } catch (ParsingException e) {
178
                        //No lee desde rmf
179
                }
180

    
181
                open = true;
182
        }
183
        
184
        /**
185
         * Open from a .mff file. 
186
         * This method loads all providers and adds these to the parameters
187
         * @throws OpenException
188
         */
189
        private void openFromMff() throws OpenException {
190
                if(getParameters().getURI() != null && new File(getParameters().getURI()).exists()) {
191
                        boolean loadedProviders = true;
192
                        if(getParameters().getProviders() != null) {
193
                                //solo se considera que est?n todos los providers cargados si existen y est?n open,
194
                                //sino se leeran de disco
195
                                for (int i = 0; i < getParameters().getProviders().size(); i++) {
196
                                        if(!getParameters().getProviders().get(i).isOpen()) 
197
                                                loadedProviders = false;
198
                                }
199
                        } else
200
                                loadedProviders = false;
201
                        
202
                        if(loadedProviders)
203
                                return;
204
                        
205
                        try {
206
                                if(getParameters().getProviders() != null)
207
                                        getParameters().getProviders().clear();
208
                                MultiFileFormat multiFileFormat = new MultiFileFormat();
209
                                multiFileFormat = MultiFileFormatSerializer.read(multiFileFormat, getParameters().getURI());
210
                                for (int i = 0; i < multiFileFormat.getNumberOfFiles(); i++) {
211
                                        try {
212
                                                File file = new File(multiFileFormat.getPathToFile(i));
213
                                                if(file.exists()) {
214
                                                        RasterProvider prov = loadProvider(multiFileFormat.getPathToFile(i), storeServices);
215
                                                        getParameters().addProvider(prov);
216
                                                }
217
                                        } catch (ProviderNotRegisteredException e) {
218
                                                throw new OpenException("A provider can't be loaded", e);
219
                                        } catch (InitializeException e) {
220
                                                throw new OpenException("A provider can't be initialized", e);
221
                                        }
222
                                }
223
                        } catch (IOException e1) {
224
                                throw new OpenException("File .mff can't be read", e1);
225
                        } catch (ParsingException e1) {
226
                                throw new OpenException("File .mff can't be parsed", e1);
227
                        }
228
                } 
229
        }
230
        
231
        /**
232
         * Loads the specific provider
233
         * @param file
234
         * @return
235
         * @throws NotSupportedExtensionException
236
         * @throws FileNotSupportedException 
237
         */
238
        private RasterProvider loadProvider(String file, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
239
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
240
                DataStoreProvider prov = null;
241

    
242
                if(file != null) {
243
                        //We have to locate a provider's name which manages the selected file
244
                        //A FilesystemServerExplorer will give a getProviderNames service
245
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
246
                        FilesystemServerExplorer serverExplorer = null;
247
                        try {
248
                                paramsExplorer.setRoot(File.separator);
249
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
250
                        } catch (ValidateDataParametersException e) {
251
                                throw new InitializeException(e);
252
                        }
253
                        File f = new File(file);
254
                        //Gets the list of provider's name to manage the file
255
                        ArrayList<String> provName = serverExplorer.getProviderNameList(f);
256
                        if(provName.size() > 0) {
257
                                for (int i = 0; i < provName.size(); i++) {
258
                                        //Gets the first provider what is not a TileProvider
259
                                        if(provName.get(i).compareTo("Tile Store") != 0) {
260
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
261
                                                ((FilesystemStoreParameters)newparams).setFile(f); 
262
                                                prov = dataManager.createProvider(storeServices, newparams);
263
                                        }
264
                                }
265
                        }
266
                }
267

    
268
                if(prov != null && prov instanceof RasterProvider) {
269
                        if(((RasterProvider)prov).isRotated())
270
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
271

    
272
                        return (RasterProvider)prov;
273
                }
274
                
275
                return null;
276
        }
277
        
278
        /**
279
         * Checks if the new file is compatible with the old one
280
         * @param file
281
         * @return
282
         * @throws LocatorException
283
         * @throws NotSupportedExtensionException
284
         * @throws RasterDriverException
285
         * @throws CloseException
286
         */
287
        private boolean checkNewProvider(RasterProvider p) {
288
                Rectangle2D extentOrigin = getExtent().toRectangle2D();
289
                
290
                Extent extentNewFile = p.getExtent();
291

    
292
                // Comprobamos que el extent y tama?o del fichero a?adido sea igual al
293
                // fichero original. Si no es as? no abrimos la capa y mostramos un aviso
294

    
295
                double widthNewFile = (extentNewFile.getMax().getX() - extentNewFile.getMin().getX());
296
                double heightNewFile = (extentNewFile.getMax().getY() - extentNewFile.getMin().getY());
297

    
298
                if ((widthNewFile - extentOrigin.getWidth()) > 1.0 || (widthNewFile - extentOrigin.getWidth()) < -1.0 || (heightNewFile - extentOrigin.getHeight()) > 1.0
299
                                || (heightNewFile - extentOrigin.getHeight()) < -1.0) {
300
                        return false;
301
                }
302

    
303
                if ((extentNewFile.getMax().getX() - extentNewFile.getMin().getX()) != extentOrigin.getWidth()
304
                                || (extentNewFile.getMax().getY() - extentNewFile.getMin().getY()) != extentOrigin.getHeight()) {
305
                        return false;
306
                }
307

    
308
                return true;
309
        }
310
        
311
        public MultiFileDataParameters getParameters() {
312
                try {
313
                        return (MultiFileDataParameters)parameters;
314
                } catch (ClassCastException e) {
315
                        return null;
316
                }
317
        }
318
        
319
        /*
320
         * (non-Javadoc)
321
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
322
         */
323
        public RasterProvider load() {
324
                return this;
325
        }
326
        
327
        /*
328
         * (non-Javadoc)
329
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBandCount()
330
         */
331
        public int getBandCount() {
332
                providerList = getParameters().getProviders();
333
                int bandCount = 0;
334
                for (int i = 0; i < providerList.size(); i++) {
335
                        bandCount += providerList.get(i).getBandCount();
336
                }
337
                return bandCount;
338
        }
339
        
340
        /*
341
         * (non-Javadoc)
342
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getDataType()
343
         */
344
        public int[] getDataType() {
345
                providerList = getParameters().getProviders();
346
                int[] datatypes = new int[getBandCount()];
347
                int k = 0;
348
                for (int i = 0; i < providerList.size(); i++) {
349
                        int[] dtByProv = providerList.get(i).getDataType();
350
                        for (int j = 0; j < dtByProv.length; j++) {
351
                                datatypes[k] = dtByProv[j];
352
                                k++;
353
                        }
354
                }
355
                return datatypes;
356
        }
357
        
358
        /*
359
         * (non-Javadoc)
360
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByProvider()
361
         */
362
        public String[] getURIByProvider() {
363
                providerList = getParameters().getProviders();
364
                String[] uris = new String[providerList.size()];
365
                for (int i = 0; i < uris.length; i++) {
366
                        uris[i] = providerList.get(i).getURIOfFirstProvider();
367
                }
368
                return uris;
369
        }
370
        
371
        /*
372
         * (non-Javadoc)
373
         * @see org.gvsig.raster.impl.provider.RasterProvider#getBandPositionByProvider(int)
374
         */
375
        public int getBandPositionByProvider(int band) {
376
                return getSubBandByBandNumber(band)[1];
377
        }
378
        
379
        /*
380
         * (non-Javadoc)
381
         * @see org.gvsig.raster.impl.provider.RasterProvider#getURIOfFirstProvider()
382
         */
383
        public String getURIOfFirstProvider() {
384
                providerList = getParameters().getProviders();
385
                return providerList.get(0).getURIOfFirstProvider();
386
        }
387
        
388
        
389
        /*
390
         * (non-Javadoc)
391
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getExtent()
392
         */
393
        public Extent getExtent() {
394
                providerList = getParameters().getProviders();
395
                if(providerList != null && providerList.size() > 0)
396
                        return providerList.get(0).getExtent();
397
                return null;
398
        }
399
        
400
        /*
401
         * (non-Javadoc)
402
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
403
         */
404
        public AffineTransform getAffineTransform() {
405
                providerList = getParameters().getProviders();
406
                return providerList.get(0).getAffineTransform();
407
        }
408
        
409
        /*
410
         * (non-Javadoc)
411
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#setAffineTransform(java.awt.geom.AffineTransform)
412
         */
413
        public void setAffineTransform(AffineTransform t) {
414
                providerList = getParameters().getProviders();
415
                for (int i = 0; i < providerList.size(); i++) {
416
                        providerList.get(i).setAffineTransform(t);
417
                }
418
        }
419
        
420
        /*
421
         * (non-Javadoc)
422
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInternalProviderCount()
423
         */
424
        public int getInternalProviderCount() {
425
                return providerList.size();
426
        }
427
        
428
        /*
429
         * (non-Javadoc)
430
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInternalProvider(int)
431
         */
432
        public RasterProvider getInternalProvider(int i) {
433
                return providerList.get(i);
434
        }
435
        
436
        /*
437
         * (non-Javadoc)
438
         * @see org.gvsig.raster.impl.provider.RasterProvider#getBandCountByProvider()
439
         */
440
        public int[] getBandCountByProvider() {
441
                providerList = getParameters().getProviders();
442
                int[] bc = new int[providerList.size()];
443
                for (int i = 0; i < bc.length; i++) {
444
                        bc[i] = providerList.get(i).getBandCount();
445
                }
446
                return bc;
447
        }
448
        
449
        /*
450
         * (non-Javadoc)
451
         * @see org.gvsig.raster.impl.provider.RasterProvider#getFileSizeByProvider()
452
         */
453
        public long[] getFileSizeByProvider() {
454
                providerList = getParameters().getProviders();
455
                long[] fs = new long[providerList.size()];
456
                for (int i = 0; i < fs.length; i++) {
457
                        fs[i] = ((DefaultRasterProvider)providerList.get(i)).getFileSize();
458
                }
459
                return fs;
460
        }
461
        
462
        /*
463
         * (non-Javadoc)
464
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#rasterToWorld(java.awt.geom.Point2D)
465
         */
466
        public Point2D rasterToWorld(Point2D pt) {
467
                providerList = getParameters().getProviders();
468
                return providerList.get(0).rasterToWorld(pt);
469
        }
470

    
471
        /*
472
         * (non-Javadoc)
473
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#worldToRaster(java.awt.geom.Point2D)
474
         */
475
        public Point2D worldToRaster(Point2D pt) {
476
                providerList = getParameters().getProviders();
477
                return providerList.get(0).worldToRaster(pt);
478
        }
479
        
480
        /*
481
         * (non-Javadoc)
482
         * @see org.gvsig.raster.impl.provider.RasterProvider#isInside(java.awt.geom.Point2D)
483
         */
484
        public boolean isInside(Point2D p){
485
                providerList = getParameters().getProviders();
486
                return providerList.get(0).isInside(p);
487
        }
488
        
489
        /*
490
         * (non-Javadoc)
491
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCellSize()
492
         */
493
        public double getCellSize() {
494
                providerList = getParameters().getProviders();
495
                return providerList.get(0).getCellSize();
496
        }
497
        
498
        /*
499
         * (non-Javadoc)
500
         * @see org.gvsig.raster.impl.dataset.RasterProvider#getStatistics()
501
         */
502
        public Statistics getStatistics() {
503
                if(stats == null || (stats instanceof MultiProviderStatistics && 
504
                                ((MultiProviderStatistics)stats).getNumberOfProviders() != providerList.size())) {
505
                        providerList = getParameters().getProviders();
506
                        stats = new MultiProviderStatistics(providerList);
507
                }
508
                
509
                return stats;
510
        }
511
        
512
        /*
513
         * (non-Javadoc)
514
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
515
         */
516
        public HistogramComputer getHistogramComputer() {
517
                if(histogram == null || 
518
                        (histogram instanceof MultiProviderHistogramComputer && 
519
                        ((MultiProviderHistogramComputer)histogram).getNumberOfProviders() != providerList.size())) {
520
                        histogram = new MultiProviderHistogramComputer(this);
521
                }
522
                
523
                return histogram;
524
        }
525
        
526
        /**
527
         * A multiband provider doesn't have a color table because this will have
528
         * more than one band.
529
         */
530
        public ColorTable getColorTable() {
531
                return null;
532
        }
533
        
534
        /*
535
         * (non-Javadoc)
536
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
537
         */
538
        public boolean isOpen() {
539
                return open;
540
        }
541

    
542
        /*
543
         * (non-Javadoc)
544
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
545
         */
546
        public void close() {
547
        }
548

    
549
        /*
550
         * (non-Javadoc)
551
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
552
         */
553
        public String translateFileName(String fileName) {
554
                return fileName;
555
        }
556

    
557
        /**
558
         * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformaci?n
559
         * de la vista asignada ya que la petici?n viene en coordenadas del fichero .rmf y la vista (v)
560
         * ha de estar en coordenadas del fichero.
561
         */
562
        public void setView(Extent e) {
563
                viewRequest = new ExtentImpl(e);
564
        }
565

    
566
        /*
567
         * (non-Javadoc)
568
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
569
         */
570
        public Extent getView() {
571
                return viewRequest;
572
        }
573

    
574
        /*
575
         * (non-Javadoc)
576
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
577
         */
578
        public double getWidth() {
579
                providerList = getParameters().getProviders();
580
                if(providerList != null && providerList.size() > 0) {
581
                        return providerList.get(0).getWidth();
582
                }
583
                return 0;
584
        }
585

    
586
        /*
587
         * (non-Javadoc)
588
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
589
         */
590
        public double getHeight() {
591
                providerList = getParameters().getProviders();
592
                if(providerList != null && providerList.size() > 0) {
593
                        return providerList.get(0).getHeight();
594
                }
595
                return 0;
596

    
597
        }
598

    
599
        /*
600
         *  (non-Javadoc)
601
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int, double)
602
         */
603
        public Object readBlock(int pos, int blockHeight, double scale)
604
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
605
                providerList = getParameters().getProviders();
606
                return null;
607
        }
608

    
609
        /**
610
         * Gets a number of provider and the band of this provider 
611
         * @param band
612
         * @return
613
         */
614
        private int[] getSubBandByBandNumber(int band) {
615
                providerList = getParameters().getProviders();
616
                int[] res = new int[2];
617
                int acum = 0;
618
                for (int i = 0; i < providerList.size(); i++) {
619
                        acum += providerList.get(i).getBandCount();
620
                        if(acum > band) {
621
                                res[0] = i;
622
                                int aux = (acum - providerList.get(i).getBandCount());
623
                                res[1] = band - aux;
624
                                return res;
625
                        }
626
                }
627
                return res;
628
        }
629
        
630
        /* 
631
         * (non-Javadoc)
632
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
633
         */
634
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
635
                int[] sub = getSubBandByBandNumber(band);
636
                RasterProvider prov = providerList.get(sub[0]);
637
                return prov.getData(x, y, sub[1]);
638
        }
639

    
640
        /*
641
         * (non-Javadoc)
642
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
643
         */
644
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
645
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
646
        }
647

    
648
        /*
649
         * (non-Javadoc)
650
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
651
         */
652
        public Buffer getWindow(Extent extent, BandList bandList, Buffer rasterBuf, TaskStatus status) 
653
                throws ProcessInterruptedException, RasterDriverException {
654
                providerList = getParameters().getProviders();
655
                
656
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
657
                q.setAreaOfInterest(extent);
658
                q.setBandList(bandList);
659
                q.setBuffer(rasterBuf);
660
                
661
                for (int i = 0; i < providerList.size(); i++) {
662
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
663
                }
664
                return rasterBuf;
665
        }
666
        
667
        
668

    
669
        /*
670
         * (non-Javadoc)
671
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
672
         */
673
        public Buffer getWindow(double ulx, double uly, double w, double h, 
674
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
675
                providerList = getParameters().getProviders();
676
                
677
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
678
                q.setAreaOfInterest(ulx, uly, w, h);
679
                q.setBandList(bandList);
680
                q.setBuffer(rasterBuf);
681
                q.setAdjustToExtent(adjustToExtent);
682
                
683
                for (int i = 0; i < providerList.size(); i++) {
684
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
685
                }
686
                return rasterBuf;
687
        }
688

    
689
        /*
690
         * (non-Javadoc)
691
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
692
         */
693
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
694
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
695
                providerList = getParameters().getProviders();
696
                
697
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
698
                q.setAreaOfInterest(extent, bufWidth, bufHeight);
699
                q.setBandList(bandList);
700
                q.setBuffer(rasterBuf);
701
                q.setAdjustToExtent(adjustToExtent);
702
                
703
                for (int i = 0; i < providerList.size(); i++) {
704
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
705
                }
706
                return rasterBuf;
707
        }
708

    
709
        /*
710
         * (non-Javadoc)
711
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
712
         */
713
        public Buffer getWindow(int x, int y, int w, int h, 
714
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
715
                providerList = getParameters().getProviders();
716
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
717
                q.setAreaOfInterest(x, y, w, h);
718
                q.setBandList(bandList);
719
                q.setBuffer(rasterBuf);
720
                for (int i = 0; i < providerList.size(); i++) {
721
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
722
                }
723
                return rasterBuf;
724
        }
725

    
726
        /*
727
         * (non-Javadoc)
728
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
729
         */
730
        public int getBlockSize() {
731
                return 0;
732
        }
733

    
734
        /*
735
         * (non-Javadoc)
736
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
737
         */
738
        public ColorInterpretation getColorInterpretation() {
739
                if(super.getColorInterpretation() == null) {
740
                        String[] cis = new String[getBandCount()];
741
                        for (int i = 0; i < cis.length; i++) {
742
                                if(i == 0)
743
                                        cis[i] = ColorInterpretation.GRAY_BAND;
744
                                else
745
                                        cis[i] = ColorInterpretation.UNDEF_BAND;
746
                        }
747
                        setColorInterpretation(new DataStoreColorInterpretation(cis));
748
                }
749
                return super.getColorInterpretation();
750
        }
751

    
752
        /*
753
         * (non-Javadoc)
754
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
755
         */
756
        public DataStoreTransparency getTransparency() {
757
                if(fileTransparency == null)
758
                        fileTransparency = new DataStoreTransparency();
759
                return fileTransparency;
760
        }
761

    
762
        /**
763
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
764
         * el valor de esta variable cada vez que dibuja.
765
         * @return true si se ha supersampleado y false si no se ha hecho.
766
         */
767
        public boolean isSupersampling() {
768
                return false;
769
        }
770

    
771
        /*
772
         * (non-Javadoc)
773
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
774
         */
775
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
776
                if(band >= getBandCount())
777
                        throw new BandAccessException("Wrong band");
778
                return 0;
779
        }
780

    
781
        /*
782
         * (non-Javadoc)
783
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
784
         */
785
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
786
                if (band >= getBandCount())
787
                        throw new BandAccessException("Wrong band");
788
                return 0;
789
        }
790

    
791
        /*
792
         * (non-Javadoc)
793
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
794
         */
795
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
796
                if (band >= getBandCount())
797
                        throw new BandAccessException("Wrong band");
798
                return 0;
799
        }
800
        
801
        /*
802
         * (non-Javadoc)
803
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isMultiFile()
804
         */
805
        public boolean isMultiFile() {
806
                return true;
807
        }
808

    
809
        /*
810
         * (non-Javadoc)
811
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
812
         */
813
        public boolean isOverviewsSupported() {
814
                return true;
815
        }
816

    
817
        /*
818
         * (non-Javadoc)
819
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
820
         */
821
        public boolean isReproyectable() {
822
                return true;
823
        }
824

    
825
        /*
826
         * (non-Javadoc)
827
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
828
         */
829
        public String getName() {
830
                return NAME;
831
        }
832
        
833
        /*
834
         * (non-Javadoc)
835
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
836
         */
837
        public void setStatus(RasterProvider provider) {
838
                if(provider instanceof MultiFileProvider) {
839
                        //Not implemented yet
840
                }
841
        }
842
        
843
        /*
844
         * (non-Javadoc)
845
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
846
         */
847
        public boolean isTimeSupported() {
848
                return true;
849
        }
850
        
851
        /*
852
         * (non-Javadoc)
853
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByBand(int)
854
         */
855
        public String getURIByBand(int band) {
856
                int[] sub = getSubBandByBandNumber(band);
857
                RasterProvider prov = providerList.get(sub[0]);
858
                return prov.getURIOfFirstProvider();
859
        }
860
        
861
        /*
862
         * (non-Javadoc)
863
         * @see org.gvsig.raster.impl.provider.RasterProvider#addFile(java.lang.String)
864
         */
865
        public void addFile(String file) throws InvalidSourceException {
866
                /*try {
867
                        RasterProvider provider = loadProvider(file, storeServices);
868
                        if(checkNewProvider(provider)) {
869
                                getParameters().addProvider(provider);
870
                        } else {
871
                                provider.close();
872
                        }
873
                } catch (ProviderNotRegisteredException e) {
874
                        throw new InvalidSourceException("Provider not registered", e);
875
                } catch (InitializeException e) {
876
                        throw new InvalidSourceException("Initialize exception", e);
877
                }*/
878
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
879
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
880
                
881
                ArrayList<RasterDataParameters> storeParametersList = provServ.createParametersList(file);
882
                for (int j = 0; j < storeParametersList.size(); j++) {
883
                        RasterProvider newFileProv;
884
                        try {
885
                                newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParametersList.get(j));
886
                                if(!newFileProv.isTiled() && checkNewProvider(newFileProv)) {
887
                                        getParameters().addProvider(newFileProv);
888
                                }
889
                        } catch (InitializeException e) {
890
                                throw new InvalidSourceException("", e);
891
                        } catch (ProviderNotRegisteredException e) {
892
                                throw new InvalidSourceException("", e);
893
                        }
894
                }
895
        }
896
        
897
        /*
898
         * (non-Javadoc)
899
         * @see org.gvsig.raster.impl.provider.RasterProvider#removeFile(java.lang.String)
900
         */
901
        public void removeFile(String file) {
902
                getParameters().removeProvider(file);
903
        }
904
        
905
        /*
906
         * (non-Javadoc)
907
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
908
         */
909
        public TileServer getTileServer() {
910
                if(tileServer == null)
911
                        tileServer = new FileTileServer(this);
912
                return tileServer;
913
        }
914
}