Statistics
| Revision:

gvsig-raster / org.gvsig.raster.mosaic / trunk / org.gvsig.raster.mosaic / org.gvsig.raster.mosaic.io / src / main / java / org / gvsig / raster / mosaic / io / MosaicProvider.java @ 723

History | View | Annotate | Download (31.6 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.mosaic.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.security.MessageDigest;
30
import java.security.NoSuchAlgorithmException;
31
import java.util.ArrayList;
32
import java.util.Date;
33
import java.util.HashMap;
34

    
35
import org.cresques.cts.IProjection;
36
import org.gvsig.compat.net.ICancellable;
37
import org.gvsig.fmap.dal.DALFileLocator;
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataStore;
40
import org.gvsig.fmap.dal.DataStoreParameters;
41
import org.gvsig.fmap.dal.coverage.RasterLibrary;
42
import org.gvsig.fmap.dal.coverage.RasterLocator;
43
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
44
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
45
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
46
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
47
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
48
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
49
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
50
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
51
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
52
import org.gvsig.fmap.dal.coverage.exception.ParsingException;
53
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
54
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
55
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
56
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
57
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
58
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
59
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
60
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
61
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
62
import org.gvsig.fmap.dal.coverage.util.MathUtils;
63
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
64
import org.gvsig.fmap.dal.exception.InitializeException;
65
import org.gvsig.fmap.dal.exception.OpenException;
66
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
67
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
68
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
69
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
70
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
71
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
72
import org.gvsig.fmap.dal.spi.DataStoreProvider;
73
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
74
import org.gvsig.metadata.MetadataLocator;
75
import org.gvsig.raster.cache.tile.Tile;
76
import org.gvsig.raster.cache.tile.TileCache;
77
import org.gvsig.raster.cache.tile.TileCacheLibrary;
78
import org.gvsig.raster.cache.tile.TileCacheLocator;
79
import org.gvsig.raster.cache.tile.TileCacheManager;
80
import org.gvsig.raster.cache.tile.exception.TileGettingException;
81
import org.gvsig.raster.cache.tile.layer.TiledLayer;
82
import org.gvsig.raster.cache.tile.provider.CacheStruct;
83
import org.gvsig.raster.cache.tile.provider.TileListener;
84
import org.gvsig.raster.cache.tile.provider.TileServer;
85
import org.gvsig.raster.impl.datastruct.ExtentImpl;
86
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
87
import org.gvsig.raster.impl.provider.MemoryMatrixBuffer;
88
import org.gvsig.raster.impl.provider.RasterProvider;
89
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
90
import org.gvsig.raster.impl.store.DefaultStoreFactory;
91
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
92
import org.gvsig.raster.impl.store.properties.SimpleProviderHistogramComputer;
93
import org.gvsig.raster.impl.store.properties.SimpleProviderStatistics;
94
import org.gvsig.raster.mosaic.io.downloader.MosaicTileServer;
95
import org.gvsig.timesupport.RelativeInstant;
96
import org.gvsig.timesupport.Time;
97
import org.gvsig.timesupport.TimeSupportLocator;
98
import org.gvsig.tools.ToolsLocator;
99
import org.slf4j.Logger;
100
import org.slf4j.LoggerFactory;
101
/**
102
 * Data provider for raster mosaics
103
 *
104
 * @author Nacho Brodin (nachobrodin@gmail.com)
105
 */
106
public class MosaicProvider extends DefaultRasterProvider {
107
        public static String                     NAME                     = "Mosaic Raster";
108
        public static String                     DESCRIPTION              = "Mosaic Raster Support";
109
        public final String                      METADATA_DEFINITION_NAME = NAME;
110
        private static final Logger              logger                   = LoggerFactory.getLogger(MosaicProvider.class);
111
        private boolean                          open                     = false;
112
        private RasterUtils                      util                     = RasterLocator.getManager().getRasterUtils();
113
        private MathUtils                        math                     = RasterLocator.getManager().getMathUtils();
114
    protected static String[]                formatList               = null;
115
    private MosaicRasterFormat               mosaicRasterFormat       = null;
116
    private ArrayList<RasterProvider>        providerList             = null;
117
    private double                           pixelSize                = 0D;
118
    private Extent                           extent                   = null;
119
        private double                           width                    = 0;
120
        private double                           height                   = 0;
121
        private Extent                           viewRequest              = null;
122
        private TiledLayer                       tiledLayer               = null;
123
        //This provider needs a MosaicTileServer by set of layers
124
        private HashMap<String, MosaicTileServer>
125
                                                 tileServerMap            = new HashMap<String, MosaicTileServer>();
126
        private ArrayList<RasterProvider>        selectedProviders        = new ArrayList<RasterProvider>();
127
    
128
        public static void register() {
129
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
130
                registerFormats();
131
                
132
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
133
                        dataman.registerStoreProvider(NAME,
134
                                        MosaicProvider.class, MosaicDataParametersImpl.class);
135
                }
136
                
137
                if(DALFileLocator.getFilesystemServerExplorerManager() != null)
138
                        DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
139
                                        NAME, DESCRIPTION,
140
                                        MosaicServerExplorer.class);
141
                
142
                if (!dataman.getExplorerProviders().contains(NAME)) {
143
                        dataman.registerExplorerProvider(NAME, MosaicServerExplorer.class, MosaicServerExplorerParameters.class);
144
                }
145
                
146
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
147
        }
148
        
149
        private static void registerFormats() {
150
                formatList      = new String[] {"mrf"};
151
                for (int i = 0; i < formatList.length; i++) 
152
                        RasterLocator.getManager().addFormat(formatList[i], MosaicProvider.class);
153
        }
154
        
155
        /*
156
         * (non-Javadoc)
157
         * @see org.gvsig.raster.impl.provider.RasterProvider#getFormatList()
158
         */
159
        public String[] getFormatList() {
160
                return formatList;
161
        }
162
        
163
        /**
164
         * Returns true if the extension is supported and false if doesn't
165
         * @param ext
166
         * @return
167
         */
168
        public boolean isExtensionSupported(String ext) {
169
                if(ext.indexOf(".") != -1)
170
                        ext = ext.substring(ext.lastIndexOf(".") + 1, ext.length());
171
                for (int i = 0; i < formatList.length; i++) {
172
                        if(formatList[i].compareTo(ext) == 0)
173
                                return true;
174
                }
175
                return false;
176
        }
177
        
178
        public MosaicProvider() {
179
        }
180
        
181
        /**
182
         * Opens the dataset.
183
         * @param proj Projection
184
         * @param fName File name
185
         * @throws NotSupportedExtensionException
186
         */
187
        public MosaicProvider(String params) throws NotSupportedExtensionException, OpenException {
188
                super(params);
189
                if(params instanceof String) {
190
                        MosaicDataParametersImpl p = new MosaicDataParametersImpl();
191
                        p.setURI((String)params);
192
                        super.init(p, null, ToolsLocator.getDynObjectManager()
193
                                        .createDynObject(
194
                                                        MetadataLocator.getMetadataManager().getDefinition(
195
                                                                        DataStore.METADATA_DEFINITION_NAME)));
196
                        init(p, null);
197
                }
198
        }
199
        
200
        public MosaicProvider (MosaicDataParametersImpl params,
201
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
202
                super(params, storeServices, ToolsLocator.getDynObjectManager()
203
                                .createDynObject(
204
                                                MetadataLocator.getMetadataManager().getDefinition(
205
                                                                DataStore.METADATA_DEFINITION_NAME)));
206
                init(params, storeServices);
207
        }
208

    
209
        /**
210
         * Build file references
211
         * @param proj Projection
212
         * @param param Load parameters
213
         * @throws NotSupportedExtensionException
214
         */
215
        public void init (AbstractRasterDataParameters params,
216
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
217
                setParam(storeServices, params);
218
                
219
                openFromMrf();
220
                
221
                calcMetadataFromParams();
222
                
223
                super.init();
224
                
225
                try {
226
                        loadFromRmf(getRmfBlocksManager());
227
                } catch (ParsingException e) {
228
                        //No lee desde rmf
229
                }
230

    
231
                open = true;
232
        }
233
        
234
        /**
235
         * Calculates metadata using the parameters
236
         */
237
        private void calcMetadataFromParams() {
238
                uri = getParameters().getURI();
239
                providerList = getParameters().getProviders();
240
                pixelSize = getParameters().getPixelSize();
241
                noData = getParameters().getNoData();
242
                noDataEnabled = true;
243
                setColorInterpretation(providerList.get(0).getColorInterpretation().cloneColorInterpretation());
244
                
245
                //Se le pone banda de transparencia siempre
246
                if(providerList.get(0).getDataType()[0] == Buffer.TYPE_BYTE) {
247
                        transparency = new DataStoreTransparency();
248
                        transparency.setTransparencyBand(getBandCount());
249
                } else 
250
                        transparency = providerList.get(0).getTransparency();
251
                
252
                extent = null;
253
                for (int i = 0; i < providerList.size(); i++) {
254
                        if(extent == null)
255
                                extent = providerList.get(i).getExtent();
256
                        else
257
                                extent = extent.encloseBoundinBoxes(providerList.get(i).getExtent());
258
                }
259
                width = extent.width() / pixelSize;
260
                height = extent.height() / pixelSize;
261
                
262
                ownTransformation = new AffineTransform(pixelSize, 0, 
263
                                                        0, -pixelSize, 
264
                                                        extent.getULX(), extent.getULY());
265
                externalTransformation = (AffineTransform) ownTransformation.clone();
266
                
267
                ((MosaicDataParametersImpl)getParameters()).resetParamsChanged();
268
        }
269
        
270
        /**
271
         * Loads the specific provider
272
         * @param file
273
         * @return
274
         * @throws NotSupportedExtensionException
275
         * @throws FileNotSupportedException 
276
         */
277
        private RasterProvider loadProvider(String file, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
278
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
279
                DataStoreProvider prov = null;
280

    
281
                if(file != null) {
282
                        //We have to locate a provider's name which manages the selected file
283
                        //A FilesystemServerExplorer will give a getProviderNames service
284
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
285
                        FilesystemServerExplorer serverExplorer = null;
286
                        try {
287
                                paramsExplorer.setRoot(File.separator);
288
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
289
                        } catch (ValidateDataParametersException e) {
290
                                throw new InitializeException(e);
291
                        }
292
                        File f = new File(file);
293
                        //Gets the list of provider's name to manage the file
294
                        ArrayList<String> provName = serverExplorer.getProviderNameList(f);
295
                        if(provName.size() > 0) {
296
                                for (int i = 0; i < provName.size(); i++) {
297
                                        //Gets the first provider what is not a TileProvider
298
                                        if(provName.get(i).compareTo("Tile Store") != 0) {
299
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
300
                                                ((FilesystemStoreParameters)newparams).setFile(f); 
301
                                                prov = dataManager.createProvider(storeServices, newparams);
302
                                        }
303
                                }
304
                        }
305
                }
306

    
307
                if(prov != null && prov instanceof RasterProvider) {
308
                        if(((RasterProvider)prov).isRotated())
309
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
310

    
311
                        return (RasterProvider)prov;
312
                }
313
                
314
                return null;
315
        }
316
        
317
        /**
318
         * Open from a .mrf file. 
319
         * This method loads all providers and adds these to the parameters
320
         * @throws OpenException
321
         */
322
        private void openFromMrf() throws OpenException {
323
                if(getParameters().getURI() != null && new File(getParameters().getURI()).exists()) {
324
                        try {
325
                                if(getParameters().getProviders() != null)
326
                                        getParameters().getProviders().clear();
327
                                MosaicRasterFormat multiFileFormat = new MosaicRasterFormat();
328
                                multiFileFormat = MosaicRasterFormatSerializer.read(multiFileFormat, getParameters().getURI());
329
                                for (int i = 0; i < multiFileFormat.getNumberOfFiles(); i++) {
330
                                        try {
331
                                                File file = new File(multiFileFormat.getPathToFile(i));
332
                                                if(file.exists()) {
333
                                                        RasterProvider prov = loadProvider(multiFileFormat.getPathToFile(i), storeServices);
334
                                                        if(i == 0)
335
                                                                getParameters().setPixelSize(prov.getCellSize());
336
                                                        getParameters().addProvider(prov);
337
                                                }
338
                                        } catch (ProviderNotRegisteredException e) {
339
                                                throw new OpenException("A provider can't be loaded", e);
340
                                        } catch (InitializeException e) {
341
                                                throw new OpenException("A provider can't be initialized", e);
342
                                        }
343
                                }
344
                        } catch (IOException e1) {
345
                                throw new OpenException("File .mrf can't be read", e1);
346
                        } catch (ParsingException e1) {
347
                                throw new OpenException("File .mrf can't be parsed", e1);
348
                        }
349
                } 
350
        }
351
        
352
        /*
353
         * (non-Javadoc)
354
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
355
         */
356
        public RasterProvider load() {
357
                return this;
358
        }
359
        
360
        /**
361
         * Gets the MosaicDataParameters
362
         * @return
363
         */
364
        public MosaicDataParameters getParameters() {
365
                try {
366
                        return (MosaicDataParameters)parameters;
367
                } catch (ClassCastException e) {
368
                        return null;
369
                }
370
        }
371
        
372
        /*
373
         * (non-Javadoc)
374
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
375
         */
376
        public boolean isOpen() {
377
                return open;
378
        }
379

    
380
        /*
381
         * (non-Javadoc)
382
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
383
         */
384
        public void close() {
385
                for (int i = 0; i < providerList.size(); i++) {
386
                        providerList.get(i).close();
387
                }
388
        }
389
        
390
        /**
391
         * @return Returns the dataType.
392
         */
393
        public int[] getDataType() {
394
                //Every raster in a mosaic has the same data type
395
                return providerList.get(0).getDataType();
396
        }
397
        
398
        /**
399
         * Obtiene el n?nero de bandas del fichero
400
         * @return Entero que representa el n?mero de bandas
401
         */
402
        public int getBandCount() {
403
                //Every raster in a mosaic has the same number of bands
404
                return providerList.get(0).getBandCount();
405
        }
406
        
407
        /*
408
         * (non-Javadoc)
409
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getPixelSizeX()
410
         */
411
        public double getPixelSizeX() {
412
                if(getParameters().hasParamsChanged())
413
                        calcMetadataFromParams();
414
                return pixelSize;
415
        }
416

    
417
        /*
418
         * (non-Javadoc)
419
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getPixelSizeY()
420
         */
421
        public double getPixelSizeY() {
422
                if(getParameters().hasParamsChanged())
423
                        calcMetadataFromParams();
424
                return pixelSize;
425
        }
426

    
427
        /*
428
         * (non-Javadoc)
429
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getNoDataValue()
430
         */
431
        public double getNoDataValue() {
432
                if(getParameters().hasParamsChanged())
433
                        calcMetadataFromParams();
434
                return noData;
435
        }
436
        
437
        /*
438
         * (non-Javadoc)
439
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getExtent()
440
         */
441
        public Extent getExtent() {
442
                if(getParameters().hasParamsChanged())
443
                        calcMetadataFromParams();
444
                return extent;
445
        }
446
        
447
        /*
448
         * (non-Javadoc)
449
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCellSize()
450
         */
451
        public double getCellSize() {
452
                return pixelSize;
453
        }
454
        
455
        /*
456
         * (non-Javadoc)
457
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getStatistics()
458
         */
459
        public Statistics getStatistics() {
460
                if(stats == null || getParameters().hasParamsChanged()) {
461
                        calcMetadataFromParams();
462
                        providerList = getParameters().getProviders();
463
                        stats = SimpleProviderStatistics.union(this, providerList);
464
                }
465
                return stats;
466
        }
467

    
468
        /*
469
         * (non-Javadoc)
470
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHistogramComputer()
471
         */
472
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
473
                if(histogram == null || getParameters().hasParamsChanged()) {
474
                        calcMetadataFromParams();
475
                        providerList = getParameters().getProviders();
476
                        histogram = SimpleProviderHistogramComputer.union(this, providerList);
477
                }
478
                return histogram;
479
        }
480

    
481
        /*
482
         * (non-Javadoc)
483
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFName()
484
         */
485
        public String getURIOfFirstProvider() {
486
                return providerList.get(0).getURIOfFirstProvider();
487
        }
488

    
489
        /*
490
         * (non-Javadoc)
491
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFileSize()
492
         */
493
        public long getFileSize() {
494
                if(getParameters().hasParamsChanged())
495
                        calcMetadataFromParams();
496
                long sizeMosaic = 0;
497
                for (int i = 0; i < providerList.size(); i++) {
498
                        long[] fs = providerList.get(i).getFileSizeByProvider();
499
                        for (int j = 0; j < fs.length; j++) {
500
                                sizeMosaic += fs[j];
501
                        }
502
                }
503
                return sizeMosaic;
504
        }
505

    
506
        /*
507
         * (non-Javadoc)
508
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getProjection()
509
         */
510
        public IProjection getProjection() {
511
                return proj;
512
        }
513

    
514
        /*
515
         * (non-Javadoc)
516
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setProjection(org.cresques.cts.IProjection)
517
         */
518
        public void setProjection(IProjection p) {
519
        }
520

    
521
        /*
522
         * (non-Javadoc)
523
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getInfoByPoint(double, double, ICancellable)
524
         */
525
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
526
                return null;
527
        }
528
        
529
        /*
530
         * (non-Javadoc)
531
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTileSize(int)
532
         */
533
        public int[] getTileSize(int level) {
534
                return null;
535
        }
536
        
537
        /*
538
         * (non-Javadoc)
539
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getSourceType()
540
         */
541
        public int getSourceType() {
542
                return RasterDataStore.MOSAIC;
543
        }
544
        
545
        /*
546
         * (non-Javadoc)
547
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
548
         */
549
        public String translateFileName(String fileName) {
550
                return fileName;
551
        }
552

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

    
562
        /*
563
         * (non-Javadoc)
564
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
565
         */
566
        public Extent getView() {
567
                return viewRequest;
568
        }
569

    
570
        /*
571
         * (non-Javadoc)
572
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
573
         */
574
        public double getWidth() {
575
                if(getParameters().hasParamsChanged())
576
                        calcMetadataFromParams();
577
                return width;
578
        }
579

    
580
        /*
581
         * (non-Javadoc)
582
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
583
         */
584
        public double getHeight() {
585
                if(getParameters().hasParamsChanged())
586
                        calcMetadataFromParams();
587
                return height;
588
        }
589

    
590
        /*
591
         *  (non-Javadoc)
592
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int)
593
         */
594
        public Object readBlock(int pos, int blockHeight)
595
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
596
                if(getParameters().hasParamsChanged())
597
                        calcMetadataFromParams();
598
                return null;
599
        }
600

    
601
        /*
602
         * (non-Javadoc)
603
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
604
         */
605
        public Object getData(int x, int y, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
606
                if(getParameters().hasParamsChanged())
607
                        calcMetadataFromParams();
608
                return null;
609
        }
610

    
611
        /*
612
         * (non-Javadoc)
613
         * @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)
614
         */
615
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
616
                        BandList bandList, TileListener listener) throws ProcessInterruptedException, RasterDriverException {
617
                if(getParameters().hasParamsChanged())
618
                        calcMetadataFromParams();
619
                setView(ex);
620
        }
621

    
622
        /*
623
         * (non-Javadoc)
624
         * @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)
625
         */
626
        public Buffer getWindow(Extent extent, BandList bandList, Buffer rasterBuf) 
627
                throws ProcessInterruptedException, RasterDriverException {
628
                if(getParameters().hasParamsChanged())
629
                        calcMetadataFromParams();
630
                setView(extent);
631
                String layerName = getLayerNameFromSelection(getParameters().getTimeSelection());
632
                ArrayList<Tile> tileList = getTileList(extent, bandList, rasterBuf.getWidth(), rasterBuf.getHeight(), layerName);
633
                try {
634
                        for (int i = 0; i < tileList.size(); i++) {
635
                                tiledLayer.getTile(tileList.get(i));
636
                        }
637
                } catch (TileGettingException e) {
638
                        throw new RasterDriverException("Error getting the tile list", e);
639
                }
640
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
641
                
642
                if(        tileList.get(0).getData().length > 1 && 
643
                        getDataType()[0] == Buffer.TYPE_BYTE &&
644
                        rasterBuf.getBandCount() == 1 &&
645
                        bandList.getDrawableBands()[0] == getBandCount())
646
                        return matrixBuffer.getWindow(extent, rasterBuf, true);
647
                else
648
                        return matrixBuffer.getWindow(extent, rasterBuf, false);
649
        }
650

    
651
        /*
652
         * (non-Javadoc)
653
         * @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)
654
         */
655
        public Buffer getWindow(double ulx, double uly, double w, double h, 
656
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
657
                if(getParameters().hasParamsChanged())
658
                        calcMetadataFromParams();
659
                Extent ext = getExtent();
660
                Point2D pInit = rasterToWorld(new Point2D.Double(0, 0));
661
                Point2D pEnd = rasterToWorld(new Point2D.Double(getWidth(), getHeight()));
662
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
663
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
664
                double lrx = (((ext.getULX() - wRaster) > ext.maxX()) || ((ext.getULX() - wRaster) < ext.minX())) ? (ulx + w) : (ulx - w);
665
                double lry = (((ext.getULY() - hRaster) > ext.maxY()) || ((ext.getULY() - hRaster) < ext.minY())) ? (uly + h) : (uly - h);
666

    
667
                Extent selectedExtent = new ExtentImpl(ulx, uly, lrx, lry);
668
                setView(selectedExtent);
669
                return null;
670
        }
671

    
672
        /*
673
         * (non-Javadoc)
674
         * @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)
675
         */
676
        public Buffer getWindow(Extent extent, 
677
                        int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
678
                //draw method
679
                if(getParameters().hasParamsChanged())
680
                        calcMetadataFromParams();
681
                setView(extent);
682
                String layerName = getLayerNameFromSelection(getParameters().getTimeSelection());
683
                ArrayList<Tile> tileList = getTileList(extent, bandList, bufWidth, bufHeight, layerName);
684
                try {
685
                        for (int i = 0; i < tileList.size(); i++) {
686
                                tiledLayer.getTile(tileList.get(i));
687
                        }
688
                } catch (TileGettingException e) {
689
                        throw new RasterDriverException("Error getting the tile list", e);
690
                }
691
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
692
                
693
                if(        tileList.get(0).getData().length > 1 && 
694
                        getDataType()[0] == Buffer.TYPE_BYTE &&
695
                        rasterBuf.getBandCount() == 1 &&
696
                        bandList.getDrawableBands()[0] == getBandCount())
697
                        return matrixBuffer.getWindow(extent, rasterBuf, true);
698
                else
699
                        return matrixBuffer.getWindow(extent, rasterBuf, false);
700
        }
701

    
702
        /*
703
         * (non-Javadoc)
704
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
705
         */
706
        public Buffer getWindow(int x, int y, 
707
                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
708
                if(getParameters().hasParamsChanged())
709
                        calcMetadataFromParams();
710
                int w = rasterBuf.getWidth();
711
                int h = rasterBuf.getHeight();
712
                setView(
713
                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
714
                                        getWidth(),
715
                                        getHeight(),
716
                                        new Rectangle2D.Double(x, y, w, h)))
717
                );
718
                return null;
719
        }
720

    
721
        /*
722
         * (non-Javadoc)
723
         * @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)
724
         */
725
        public Buffer getWindow(int x, int y, int w, int h, 
726
                        int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
727
                if(getParameters().hasParamsChanged())
728
                        calcMetadataFromParams();
729
                setView(
730
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
731
                                                getWidth(),
732
                                                getHeight(),
733
                                                new Rectangle2D.Double(x, y, w, h)))
734
                );
735
                return null;
736
        }
737

    
738
        /*
739
         * (non-Javadoc)
740
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
741
         */
742
        public int getBlockSize() {
743
                return 0;
744
        }
745

    
746
        /*
747
         * (non-Javadoc)
748
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
749
         */
750
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
751
                return 0;
752
        }
753

    
754
        /*
755
         * (non-Javadoc)
756
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
757
         */
758
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
759
                return 0;
760
        }
761

    
762
        /*
763
         * (non-Javadoc)
764
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
765
         */
766
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
767
                return 0;
768
        }
769

    
770
        /*
771
         * (non-Javadoc)
772
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
773
         */
774
        public boolean isOverviewsSupported() {
775
                return false;
776
        }
777

    
778
        /*
779
         * (non-Javadoc)
780
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
781
         */
782
        public boolean isReproyectable() {
783
                return false;
784
        }
785

    
786
        /*
787
         * (non-Javadoc)
788
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
789
         */
790
        public String getName() {
791
                return NAME;
792
        }
793
        
794
        /*
795
         * (non-Javadoc)
796
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
797
         */
798
        public void setStatus(RasterProvider provider) {
799
                if(provider instanceof MosaicProvider) {
800
                }
801
        }
802
        
803
        /*
804
         * (non-Javadoc)
805
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
806
         */
807
        public boolean isTimeSupported() {
808
                return true;
809
        }
810
        
811
        /**
812
         * Gets the layer name using the time selection and visibility
813
         * @param t
814
         * @return
815
         */
816
        private String getLayerNameFromSelection(Time t) {
817
                String name = "";
818
                
819
                MessageDigest md = null;
820
                try {
821
                        md = java.security.MessageDigest.getInstance("MD5");
822
                } catch (NoSuchAlgorithmException e) {
823
                }
824

    
825
                //Without time selected
826
                if(t == null || selectedProviders.size() != providerList.size()) {
827
                        selectedProviders.clear();
828
                        for (int i = 0; i < providerList.size(); i++) {
829
                                RasterProvider prov = providerList.get(i);
830
                                selectedProviders.add(prov);
831
                                if(!((RasterDataParameters)prov.getDataParameters()).isVisible())
832
                                        name += prov.getURI().substring(prov.getURI().lastIndexOf(File.separator) + 1, prov.getURI().length());
833
                        }
834
                } else {
835
                        selectedProviders.clear();
836
                        for (int i = 0; i < providerList.size(); i++) {
837
                                try {
838
                                        TimeSeries tSeries = providerList.get(i).getTimeSerials();
839
                                        ArrayList<?> tList = tSeries.getTimeList();
840
                                        for (int j = 0; j < tList.size(); j++) {
841
                                                Object obj = tList.get(i);
842
                                                RelativeInstant instant = null;
843
                                                if(obj instanceof Date) {
844
                                                        Date s = (Date)obj;
845
                                                        instant = TimeSupportLocator.getManager().createRelativeInstant(s);
846
                                                }
847
                                                if(obj instanceof Double) {
848
                                                        long s = ((Double)obj).longValue();
849
                                                        instant = TimeSupportLocator.getManager().createRelativeInstant(s);
850
                                                }
851
                                                if( instant != null && 
852
                                                        t.intersects(instant) &&
853
                                                        !selectedProviders.contains(providerList.get(i))) {
854
                                                        RasterProvider prov = providerList.get(i);
855
                                                        selectedProviders.add(prov);
856
                                                        if(!((RasterDataParameters)prov.getDataParameters()).isVisible())
857
                                                                name += prov.getURI().substring(prov.getURI().lastIndexOf(File.separator) + 1, prov.getURI().length());
858
                                                }
859
                                        }
860
                                } catch (RmfSerializerException e) {
861
                                        logger.debug("Error reading rmf time serials", e);
862
                                }
863
                        }
864
                }
865
                
866
                if(md != null) {
867
                        md.update(name.getBytes());
868
                        return math.convertToHex(md.digest());
869
                } else {
870
                        return name;
871
                }
872
        }
873
        
874
        /**
875
         * Creates a new tiled layer if this hasn't been created yet or the ID has changed. 
876
         * An ID could changed because the file type has changed when the user uses WMTS properties.
877
         */
878
        private void createTiledLayer(String layerName) {
879
                TileCacheManager  manager = TileCacheLocator.getManager();
880
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
881
                TiledLayer newLayer = tileCache.createLayer(getTileServer(layerName), TileCacheLibrary.DEFAULT_STRUCTURE);
882
                if(tiledLayer == null || newLayer.getID().compareTo(tiledLayer.getID()) != 0)
883
                        tiledLayer = newLayer;
884
        }
885
        
886
        /**
887
         * Gets the tile list in a selected extent
888
         * @param ex
889
         * @param bandList
890
         * @param bufWidth
891
         * @param bufHeight
892
         * @return
893
         */
894
        private ArrayList<Tile> getTileList(Extent ex, BandList bandList, int bufWidth, int bufHeight, String layerName) {
895
                CacheStruct struct = getTileServer(layerName).getStruct();
896
                
897
                createTiledLayer(layerName); //Creates a new layer when the file type changes
898
                
899
                Extent adjustedExtent = util.intersection(getExtent(), ex);
900
                double newBufWidth = (adjustedExtent.width() * bufWidth) / ex.width();
901
                double pixelSizeRequest = adjustedExtent.width() / newBufWidth; 
902
                
903
                ArrayList<Tile> tileList = struct.getTileList(new Point2D.Double(adjustedExtent.getULX(), adjustedExtent.getULY()), 
904
                                new Point2D.Double(adjustedExtent.getLRX(), adjustedExtent.getLRY()), 
905
                                pixelSizeRequest);
906
                
907
                for (int i = 0; i < tileList.size(); i++) {
908
                        tileList.get(i).setDownloaderParams("BandList", bandList.clone());
909
                }
910
                return tileList;
911
        }
912
        
913
        /*
914
         * (non-Javadoc)
915
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
916
         */
917
        public TileServer getTileServer() {
918
                return null;
919
        }
920
        
921
        /**
922
         * Gets the tile server from the Hashmap
923
         * @param layerName
924
         * @return
925
         */
926
        public TileServer getTileServer(String layerName) {
927
                MosaicTileServer tileServer = tileServerMap.get(layerName);
928
                if(tileServer == null) {
929
                        tileServer = new MosaicTileServer(this, 
930
                                        providerList,
931
                                        layerName,
932
                                        getParameters().getOverlapMethod(),
933
                                        getParameters().getColorCorrectionMethod());
934
                        tileServerMap.put(layerName, tileServer);
935
                }
936
                return tileServer;
937
        }
938
}