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

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

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

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

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

    
311
                if(prov != null && prov instanceof RasterProvider) {
312
                        if(((RasterProvider)prov).isRotated())
313
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
314

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

    
384
        /*
385
         * (non-Javadoc)
386
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
387
         */
388
        public void close() {
389
                for (int i = 0; i < providerList.size(); i++) {
390
                        providerList.get(i).close();
391
                }
392
        }
393
        
394
        /**
395
         * @return Returns the dataType.
396
         */
397
        public int[] getDataType() {
398
                if(providerList.get(0).getDataType()[0] == Buffer.TYPE_BYTE) {
399
                        int[] dt = new int[getBandCount()];
400
                        for (int i = 0; i < providerList.get(0).getDataType().length; i++) {
401
                                dt[i] = providerList.get(0).getDataType()[i];
402
                        }
403
                        dt[getBandCount() - 1] = Buffer.TYPE_BYTE;
404
                        return dt;
405
                }
406
                return providerList.get(0).getDataType();
407
        }
408
        
409
        /**
410
         * Gets the number of bands
411
         * @return 
412
         */
413
        public int getBandCount() {
414
                if(providerList.get(0).getDataType()[0] == Buffer.TYPE_BYTE)
415
                        return providerList.get(0).getBandCount() + 1;
416
                return providerList.get(0).getBandCount();
417
        }
418
        
419
        /*
420
         * (non-Javadoc)
421
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByProvider()
422
         */
423
        public String[] getURIByProvider() {
424
                providerList = getParameters().getProviders();
425
                String[] uris = new String[providerList.size()];
426
                for (int i = 0; i < uris.length; i++) {
427
                        uris[i] = providerList.get(i).getURI();
428
                }
429
                return uris;
430
        }
431
        
432
        /*
433
         * (non-Javadoc)
434
         * @see org.gvsig.raster.impl.provider.RasterProvider#getURIByBand(int)
435
         */
436
        public String getURIByBand(int band) {
437
                //No matter which band be selected. In providers with one file is always the first URI
438
                return getURI();
439
        }
440
        
441
        /*
442
         * (non-Javadoc)
443
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getPixelSizeX()
444
         */
445
        public double getPixelSizeX() {
446
                if(getParameters().hasParamsChanged())
447
                        calcMetadataFromParams();
448
                return pixelSize;
449
        }
450

    
451
        /*
452
         * (non-Javadoc)
453
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getPixelSizeY()
454
         */
455
        public double getPixelSizeY() {
456
                if(getParameters().hasParamsChanged())
457
                        calcMetadataFromParams();
458
                return pixelSize;
459
        }
460

    
461
        /*
462
         * (non-Javadoc)
463
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getNoDataValue()
464
         */
465
        public double getNoDataValue() {
466
                if(getParameters().hasParamsChanged())
467
                        calcMetadataFromParams();
468
                return noData;
469
        }
470
        
471
        /*
472
         * (non-Javadoc)
473
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getExtent()
474
         */
475
        public Extent getExtent() {
476
                if(getParameters().hasParamsChanged())
477
                        calcMetadataFromParams();
478
                return extent;
479
        }
480
        
481
        /*
482
         * (non-Javadoc)
483
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCellSize()
484
         */
485
        public double getCellSize() {
486
                return pixelSize;
487
        }
488
        
489
        /*
490
         * (non-Javadoc)
491
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getStatistics()
492
         */
493
        public Statistics getStatistics() {
494
                if(stats == null || getParameters().hasParamsChanged()) {
495
                        //First of all read the statistics in the rmf. If these have not been calculated then
496
                        //we'll read the statistics from simple files
497
                        stats = super.getStatistics();
498
                        try {
499
                                loadObjectFromRmf(SimpleProviderStatistics.class, stats);
500
                        } catch (RmfSerializerException e) {
501
                                // Si no se puede cargar del RMF, recalcularemos las estadisticas.
502
                        }
503
                        if(!stats.isCalculated()) {
504
                                calcMetadataFromParams();
505
                                providerList = getParameters().getProviders();
506
                                stats = SimpleProviderStatistics.union(this, providerList);
507
                        }
508
                }
509
                return stats;
510
        }
511

    
512
        /*
513
         * (non-Javadoc)
514
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHistogramComputer()
515
         */
516
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
517
                if(histogram == null || getParameters().hasParamsChanged()) {
518
                        calcMetadataFromParams();
519
                        providerList = getParameters().getProviders();
520
                        histogram = SimpleProviderHistogramComputer.union(this, providerList);
521
                }
522
                return histogram;
523
        }
524

    
525
        /*
526
         * (non-Javadoc)
527
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFName()
528
         */
529
        public String getURIOfFirstProvider() {
530
                return providerList.get(0).getURIOfFirstProvider();
531
        }
532

    
533
        /*
534
         * (non-Javadoc)
535
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFileSize()
536
         */
537
        public long getFileSize() {
538
                if(getParameters().hasParamsChanged())
539
                        calcMetadataFromParams();
540
                long sizeMosaic = 0;
541
                for (int i = 0; i < providerList.size(); i++) {
542
                        long[] fs = providerList.get(i).getFileSizeByProvider();
543
                        for (int j = 0; j < fs.length; j++) {
544
                                sizeMosaic += fs[j];
545
                        }
546
                }
547
                return sizeMosaic;
548
        }
549

    
550
        /*
551
         * (non-Javadoc)
552
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getProjection()
553
         */
554
        public IProjection getProjection() {
555
                return proj;
556
        }
557

    
558
        /*
559
         * (non-Javadoc)
560
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setProjection(org.cresques.cts.IProjection)
561
         */
562
        public void setProjection(IProjection p) {
563
        }
564

    
565
        /*
566
         * (non-Javadoc)
567
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getInfoByPoint(double, double, ICancellable)
568
         */
569
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
570
                return null;
571
        }
572
        
573
        /*
574
         * (non-Javadoc)
575
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTileSize(int)
576
         */
577
        public int[] getTileSize(int level) {
578
                return null;
579
        }
580
        
581
        /*
582
         * (non-Javadoc)
583
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getSourceType()
584
         */
585
        public int getSourceType() {
586
                return RasterDataStore.MOSAIC;
587
        }
588
        
589
        /*
590
         * (non-Javadoc)
591
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
592
         */
593
        public String translateFileName(String fileName) {
594
                return fileName;
595
        }
596

    
597
        public void setView(Extent e) {
598
                viewRequest = new ExtentImpl(e);
599
        }
600

    
601
        /*
602
         * (non-Javadoc)
603
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
604
         */
605
        public Extent getView() {
606
                return viewRequest;
607
        }
608

    
609
        /*
610
         * (non-Javadoc)
611
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
612
         */
613
        public double getWidth() {
614
                if(getParameters().hasParamsChanged())
615
                        calcMetadataFromParams();
616
                return width;
617
        }
618

    
619
        /*
620
         * (non-Javadoc)
621
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
622
         */
623
        public double getHeight() {
624
                if(getParameters().hasParamsChanged())
625
                        calcMetadataFromParams();
626
                return height;
627
        }
628

    
629
        /*
630
         *  (non-Javadoc)
631
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int)
632
         */
633
        public Object readBlock(int pos, int blockHeight)
634
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
635
                if(getParameters().hasParamsChanged())
636
                        calcMetadataFromParams();
637
                blockHeight = pos + blockHeight > getHeight() ? (int)(getHeight() - pos) : blockHeight;
638
                Buffer buf = RasterLocator.getManager().createBuffer(getDataType()[0], (int)getWidth(), blockHeight, getBandCount(), true);
639
                BandList bandList = new BandListImpl();
640
                bandList.clear();
641
                int[] drawableBands = new int[getBandCount()];
642
                for(int i = 0; i < getBandCount(); i++) {
643
                        try {
644
                                int dataType = getDataType()[i];
645
                                DatasetBand band = new DatasetBandImpl(getURIByBand(i), 
646
                                                                                                        getBandPositionByProvider(i), 
647
                                                                                                        dataType, 
648
                                                                                                        getBandCount());
649
                                bandList.addBand(band, i);
650
                                drawableBands[i] = i;
651
                        } catch(BandNotFoundInListException ex) {
652
                                //No a?adimos la banda
653
                        }
654
                }
655
                bandList.setDrawableBands(drawableBands);
656
                return getWindow(0, pos, bandList, buf);
657
        }
658

    
659

    
660
        /*
661
         * (non-Javadoc)
662
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
663
         */
664
        public Object getData(int x, int y, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
665
                if(getParameters().hasParamsChanged())
666
                        calcMetadataFromParams();
667
                return null;
668
        }
669

    
670
        /*
671
         * (non-Javadoc)
672
         * @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)
673
         */
674
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
675
                        BandList bandList, TileListener listener) throws ProcessInterruptedException, RasterDriverException {
676
                if(getParameters().hasParamsChanged())
677
                        calcMetadataFromParams();
678
                setView(ex);
679
        }
680

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

    
710
        /*
711
         * (non-Javadoc)
712
         * @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)
713
         */
714
        public Buffer getWindow(double ulx, double uly, double w, double h, 
715
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
716
                //cut image
717
                if(getParameters().hasParamsChanged())
718
                        calcMetadataFromParams();
719
                Extent ext = getExtent();
720
                Point2D pInit = rasterToWorld(new Point2D.Double(0, 0));
721
                Point2D pEnd = rasterToWorld(new Point2D.Double(getWidth(), getHeight()));
722
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
723
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
724
                double lrx = (((ext.getULX() - wRaster) > ext.maxX()) || ((ext.getULX() - wRaster) < ext.minX())) ? (ulx + w) : (ulx - w);
725
                double lry = (((ext.getULY() - hRaster) > ext.maxY()) || ((ext.getULY() - hRaster) < ext.minY())) ? (uly + h) : (uly - h);
726

    
727
                Extent selectedExtent = new ExtentImpl(ulx, uly, lrx, lry);
728
                setView(selectedExtent);
729
                return getWindow(selectedExtent, 
730
                                rasterBuf.getWidth(), rasterBuf.getHeight(), bandList, rasterBuf, false);
731
        }
732

    
733
        /*
734
         * (non-Javadoc)
735
         * @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)
736
         */
737
        public Buffer getWindow(Extent extent, 
738
                        int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
739
                //draw method
740
                if(getParameters().hasParamsChanged())
741
                        calcMetadataFromParams();
742
                setView(extent);
743
                String layerName = getLayerNameFromSelection(getParameters().getTimeSelection());
744
                ArrayList<Tile> tileList = getTileList(extent, bandList, bufWidth, bufHeight, layerName);
745
                try {
746
                        for (int i = 0; i < tileList.size(); i++) {
747
                                tiledLayer.getTile(tileList.get(i));
748
                        }
749
                } catch (TileGettingException e) {
750
                        throw new RasterDriverException("Error getting the tile list", e);
751
                }
752
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
753
                
754
                if(        tileList.get(0).getData().length > 1 && 
755
                        getDataType()[0] == Buffer.TYPE_BYTE &&
756
                        rasterBuf.getBandCount() == 1 &&
757
                        bandList.getDrawableBands()[0] == getBandCount())
758
                        return matrixBuffer.getWindow(extent, rasterBuf, true);
759
                else
760
                        return matrixBuffer.getWindow(extent, rasterBuf, false);
761
        }
762

    
763
        /*
764
         * (non-Javadoc)
765
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
766
         */
767
        public Buffer getWindow(int x, int y, 
768
                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
769
                //Layer with real resolution
770
                if(getParameters().hasParamsChanged())
771
                        calcMetadataFromParams();
772
                int w = rasterBuf.getWidth();
773
                int h = rasterBuf.getHeight();
774
                Rectangle2D r = new Rectangle2D.Double(x, y, w, h);
775
                setView(
776
                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
777
                                        getWidth(),
778
                                        getHeight(),
779
                                        r))
780
                );
781
                String layerName = getLayerNameFromSelection(getParameters().getTimeSelection());
782
                
783
                CacheStruct struct = getTileServer(layerName).getStruct();
784
                
785
                createTiledLayer(layerName); //Creates a new layer when the file type changes
786
                
787
                ArrayList<Tile> tileList = struct.getTileList(r);
788
                
789
                for (int i = 0; i < tileList.size(); i++) {
790
                        tileList.get(i).setDownloaderParams("BandList", bandList.clone());
791
                }
792
                
793
                try {
794
                        for (int i = 0; i < tileList.size(); i++) {
795
                                tiledLayer.getTile(tileList.get(i));
796
                        }
797
                } catch (TileGettingException e) {
798
                        throw new RasterDriverException("Error getting the tile list", e);
799
                }
800
                
801
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
802
                return matrixBuffer.getWindow(r, rasterBuf);
803
        }
804

    
805
        /*
806
         * (non-Javadoc)
807
         * @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)
808
         */
809
        public Buffer getWindow(int x, int y, int w, int h, 
810
                        int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
811
                if(getParameters().hasParamsChanged())
812
                        calcMetadataFromParams();
813
                setView(
814
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
815
                                                getWidth(),
816
                                                getHeight(),
817
                                                new Rectangle2D.Double(x, y, w, h)))
818
                );
819
                return null;
820
        }
821

    
822
        /*
823
         * (non-Javadoc)
824
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
825
         */
826
        public int getBlockSize() {
827
                return 0;
828
        }
829

    
830
        /*
831
         * (non-Javadoc)
832
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
833
         */
834
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
835
                return 0;
836
        }
837

    
838
        /*
839
         * (non-Javadoc)
840
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
841
         */
842
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
843
                return 0;
844
        }
845

    
846
        /*
847
         * (non-Javadoc)
848
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
849
         */
850
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
851
                return 0;
852
        }
853

    
854
        /*
855
         * (non-Javadoc)
856
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
857
         */
858
        public boolean isOverviewsSupported() {
859
                return false;
860
        }
861

    
862
        /*
863
         * (non-Javadoc)
864
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
865
         */
866
        public boolean isReproyectable() {
867
                return false;
868
        }
869

    
870
        /*
871
         * (non-Javadoc)
872
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
873
         */
874
        public String getName() {
875
                return NAME;
876
        }
877
        
878
        /*
879
         * (non-Javadoc)
880
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
881
         */
882
        public void setStatus(RasterProvider provider) {
883
                if(provider instanceof MosaicProvider) {
884
                }
885
        }
886
        
887
        /*
888
         * (non-Javadoc)
889
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
890
         */
891
        public boolean isTimeSupported() {
892
                return true;
893
        }
894
        
895
        /*
896
         * (non-Javadoc)
897
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isMosaic()
898
         */
899
        public boolean isMosaic() {
900
                return true;
901
        }
902
        
903
        /**
904
         * Deletes the cache of this layer composed by the files in the provider list
905
         */
906
        public void deleteLayerFromCache() {
907
                String layerName = getLayerNameFromSelection(null);
908
                TileCacheManager  manager = TileCacheLocator.getManager();
909
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
910
                TiledLayer newLayer = tileCache.createLayer(getTileServer(layerName), TileCacheLibrary.DEFAULT_STRUCTURE);
911
                tileCache.removeLayer(newLayer);
912
        }
913
        
914
        /**
915
         * Gets the layer name using the time selection and visibility
916
         * @param t
917
         * @return
918
         */
919
        private String getLayerNameFromSelection(Time t) {
920
                String name = "";
921
                
922
                MessageDigest md = null;
923
                try {
924
                        md = java.security.MessageDigest.getInstance("MD5");
925
                } catch (NoSuchAlgorithmException e) {
926
                }
927

    
928
                //Without time selected
929
                if(t == null || selectedProviders.size() != providerList.size()) {
930
                        selectedProviders.clear();
931
                        for (int i = 0; i < providerList.size(); i++) {
932
                                RasterProvider prov = providerList.get(i);
933
                                selectedProviders.add(prov);
934
                                if(!((RasterDataParameters)prov.getDataParameters()).isVisible())
935
                                        name += prov.getURI().substring(prov.getURI().lastIndexOf(File.separator) + 1, prov.getURI().length());
936
                        }
937
                } else {
938
                        selectedProviders.clear();
939
                        for (int i = 0; i < providerList.size(); i++) {
940
                                try {
941
                                        TimeSeries tSeries = providerList.get(i).getTimeSerials();
942
                                        ArrayList<?> tList = tSeries.getTimeList();
943
                                        for (int j = 0; j < tList.size(); j++) {
944
                                                Object obj = tList.get(i);
945
                                                RelativeInstant instant = null;
946
                                                if(obj instanceof Date) {
947
                                                        Date s = (Date)obj;
948
                                                        instant = TimeSupportLocator.getManager().createRelativeInstant(s);
949
                                                }
950
                                                if(obj instanceof Double) {
951
                                                        long s = ((Double)obj).longValue();
952
                                                        instant = TimeSupportLocator.getManager().createRelativeInstant(s);
953
                                                }
954
                                                if( instant != null && 
955
                                                        t.intersects(instant) &&
956
                                                        !selectedProviders.contains(providerList.get(i))) {
957
                                                        RasterProvider prov = providerList.get(i);
958
                                                        selectedProviders.add(prov);
959
                                                        if(!((RasterDataParameters)prov.getDataParameters()).isVisible())
960
                                                                name += prov.getURI().substring(prov.getURI().lastIndexOf(File.separator) + 1, prov.getURI().length());
961
                                                }
962
                                        }
963
                                } catch (RmfSerializerException e) {
964
                                        logger.debug("Error reading rmf time serials", e);
965
                                }
966
                        }
967
                }
968
                
969
                if(md != null) {
970
                        md.update(name.getBytes());
971
                        return math.convertToHex(md.digest());
972
                } else {
973
                        return name;
974
                }
975
        }
976
        
977
        /**
978
         * Creates a new tiled layer if this hasn't been created yet or the ID has changed. 
979
         * An ID could changed because the file type has changed when the user uses WMTS properties.
980
         */
981
        private TileCache createTiledLayer(String layerName) {
982
                TileCacheManager  manager = TileCacheLocator.getManager();
983
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
984
                TiledLayer newLayer = tileCache.createLayer(getTileServer(layerName), TileCacheLibrary.DEFAULT_STRUCTURE);
985
                if(tiledLayer == null || newLayer.getID().compareTo(tiledLayer.getID()) != 0)
986
                        tiledLayer = newLayer;
987
                return tileCache;
988
        }
989
        
990
        /**
991
         * Gets the tile list in a selected extent
992
         * @param ex
993
         * @param bandList
994
         * @param bufWidth
995
         * @param bufHeight
996
         * @return
997
         */
998
        private ArrayList<Tile> getTileList(Extent ex, BandList bandList, int bufWidth, int bufHeight, String layerName) {
999
                CacheStruct struct = getTileServer(layerName).getStruct();
1000
                
1001
                createTiledLayer(layerName); //Creates a new layer when the file type changes
1002
                
1003
                Extent adjustedExtent = util.intersection(getExtent(), ex);
1004
                double newBufWidth = (adjustedExtent.width() * bufWidth) / ex.width();
1005
                double pixelSizeRequest = adjustedExtent.width() / newBufWidth; 
1006
                
1007
                ArrayList<Tile> tileList = struct.getTileList(new Point2D.Double(adjustedExtent.getULX(), adjustedExtent.getULY()), 
1008
                                new Point2D.Double(adjustedExtent.getLRX(), adjustedExtent.getLRY()), 
1009
                                pixelSizeRequest);
1010
                
1011
                for (int i = 0; i < tileList.size(); i++) {
1012
                        tileList.get(i).setDownloaderParams("BandList", bandList.clone());
1013
                }
1014
                return tileList;
1015
        }
1016
        
1017
        /*
1018
         * (non-Javadoc)
1019
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1020
         */
1021
        public TileServer getTileServer() {
1022
                return null;
1023
        }
1024
        
1025
        /**
1026
         * Gets the tile server from the Hashmap
1027
         * @param layerName
1028
         * @return
1029
         */
1030
        public TileServer getTileServer(String layerName) {
1031
                MosaicTileServer tileServer = tileServerMap.get(layerName);
1032
                if(tileServer == null) {
1033
                        tileServer = new MosaicTileServer(this, 
1034
                                        providerList,
1035
                                        layerName,
1036
                                        getParameters().getOverlapMethod(),
1037
                                        getParameters().getColorCorrectionMethod());
1038
                        tileServerMap.put(layerName, tileServer);
1039
                }
1040
                return tileServer;
1041
        }
1042
}