Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tilecache / trunk / org.gvsig.raster.tilecache / org.gvsig.raster.tilecache.io / src / main / java / org / gvsig / raster / tilecache / io / TileProvider.java @ 1848

History | View | Annotate | Download (37 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.tilecache.io;
23

    
24
import java.awt.Image;
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.NoninvertibleTransformException;
27
import java.awt.geom.Point2D;
28
import java.io.File;
29
import java.io.FileNotFoundException;
30
import java.io.IOException;
31
import java.lang.reflect.Constructor;
32
import java.lang.reflect.InvocationTargetException;
33
import java.util.ArrayList;
34
import java.util.List;
35

    
36
import org.gvsig.compat.net.ICancellable;
37
import org.gvsig.fmap.dal.DALLocator;
38
import org.gvsig.fmap.dal.DataStore;
39
import org.gvsig.fmap.dal.DataStoreParameters;
40
import org.gvsig.fmap.dal.coverage.RasterLibrary;
41
import org.gvsig.fmap.dal.coverage.RasterLocator;
42
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
43
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
44
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
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.BandNotFoundInListException;
48
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
49
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
50
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
51
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
52
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
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.RmfSerializerException;
56
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
57
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
58
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
59
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
60
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
61
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
62
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
63
import org.gvsig.fmap.dal.coverage.util.MathUtils;
64
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
65
import org.gvsig.fmap.dal.exception.InitializeException;
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.TileBuildException;
81
import org.gvsig.raster.cache.tile.exception.TileGettingException;
82
import org.gvsig.raster.cache.tile.layer.TiledLayer;
83
import org.gvsig.raster.cache.tile.provider.CacheStruct;
84
import org.gvsig.raster.cache.tile.provider.TileListener;
85
import org.gvsig.raster.cache.tile.provider.TileServer;
86
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
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.provider.RemoteRasterProvider;
94
import org.gvsig.raster.impl.provider.TiledRasterProvider;
95
import org.gvsig.raster.impl.store.DefaultStoreFactory;
96
import org.gvsig.raster.impl.store.properties.RemoteDataStoreStatistics;
97
import org.gvsig.tools.ToolsLocator;
98
import org.gvsig.tools.locator.LocatorException;
99
import org.gvsig.tools.task.TaskStatus;
100
import org.slf4j.Logger;
101
import org.slf4j.LoggerFactory;
102

    
103
/**
104
 * Provider for WMTS service
105
 *
106
 * @author Nacho Brodin (nachobrodin@gmail.com)
107
 */
108
public class TileProvider extends DefaultRasterProvider implements TiledRasterProvider {
109
        public static String                NAME                     = "Tile Store";
110
        public static String                DESCRIPTION              = "Raster Tiled Source";
111
        public static final String          METADATA_DEFINITION_NAME = "TileStore";
112
        private static final Logger         logger                   = LoggerFactory.getLogger(TileProvider.class);
113
        private RasterProvider              provider                 = null;
114
        private boolean                     open                     = false;
115
        private Extent                      viewRequest              = null;
116
        private TiledLayer                  tiledLayer               = null;
117
        private RasterUtils                 util                     = RasterLocator.getManager().getRasterUtils();
118
        private MathUtils                   math                     = RasterLocator.getManager().getMathUtils();
119
        private TileServer                  secondLevelTileServer    = null;
120
         
121
        public static void register() {                
122
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
123
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
124
                        dataman.registerStoreProvider(NAME,
125
                                        TileProvider.class, TileDataParametersImpl.class);
126
                }
127

    
128
                /*if(DALFileLocator.getFilesystemServerExplorerManager() != null)
129
                        DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
130
                                        NAME, DESCRIPTION,
131
                                        TileServerExplorer.class);*/
132
                
133
                if (!dataman.getExplorerProviders().contains(TileServerExplorer.NAME)) {
134
                        dataman.registerExplorerProvider(TileServerExplorer.NAME, TileServerExplorer.class, TileServerExplorerParameters.class);
135
                }
136
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
137
        }
138
        
139
        /**
140
         * Loads the specific provider to download data
141
         * @param file
142
         * @return
143
         * @throws NotSupportedExtensionException
144
         * @throws FileNotSupportedException 
145
         */
146
        private RasterProvider loadProvider(TileDataParametersImpl params, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
147
                Object obj = params.getDataParameters();
148
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
149
                DataStoreProvider prov = null;
150
                
151
                if(obj != null && obj instanceof DataStoreParameters) //Remote 
152
                        prov = dataManager.createProvider(storeServices, (DataStoreParameters)obj);
153
                else { //File
154
                        if(params.getFile() != null) {
155
                                //We have to locate a provider's name which manages the selected file
156
                                //A FilesystemServerExplorer will give a getProviderNames service
157
                                FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
158
                                FilesystemServerExplorer serverExplorer = null;
159
                                try {
160
                                        paramsExplorer.setRoot(File.separator);
161
                                        serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
162
                                } catch (ValidateDataParametersException e) {
163
                                        throw new InitializeException(e);
164
                                }
165
                                
166
                                //Gets the list of provider's name to manage the file
167
                                ArrayList<String> provName = serverExplorer.getProviderNameList(params.getFile());
168
                                if(provName.size() > 0) {
169
                                        for (int i = 0; i < provName.size(); i++) {
170
                                                //Gets the first provider what is not a TileProvider
171
                                                if(provName.get(i).compareTo(NAME) != 0) {
172
                                                        DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
173
                                                        ((FilesystemStoreParameters)newparams).setFile(params.getFile()); 
174
                                                        prov = dataManager.createProvider(storeServices, newparams);
175
                                                }
176
                                        }
177
                                }
178
                        }
179
                }
180
                
181
                if(prov != null && prov instanceof RasterProvider) {
182
                        if(((RasterProvider)prov).isRotated())
183
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
184

    
185
                        return (RasterProvider)prov;
186
                }
187
                
188
                return null;
189
        }
190
        
191
        /**
192
         * Gets the internal provider used to feed the TileProvider
193
         * @return
194
         */
195
        public RasterProvider getInternalProvider() {
196
                return provider;
197
        }
198
        
199
        /*
200
         * (non-Javadoc)
201
         * @see org.gvsig.raster.impl.provider.RasterProvider#getImageLegend()
202
         */
203
        public Image getImageLegend() {
204
                return provider.getImageLegend();
205
        }
206
        
207
        /*
208
         * (non-Javadoc)
209
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFileSuffix()
210
         */
211
        public String getFileSuffix() {
212
                try {
213
                        return provider instanceof RemoteRasterProvider ? provider.getFileSuffix() : "tif";
214
                } catch(Throwable e) {
215
                        //if wmts doesn't exists in the classpath
216
                        return "tif";
217
                }
218
        }
219
        
220
        /*
221
         * (non-Javadoc)
222
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getRMFFile()
223
         */
224
        public String getRMFFile() {
225
                TileCacheManager  manager = TileCacheLocator.getManager();
226
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
227
                
228
                String path = tiledLayer.getBaseLayerDirectory().substring(0, tiledLayer.getBaseLayerDirectory().lastIndexOf(File.separator) + 1) + 
229
                                          tileCache.getConfigurationDirectory() + File.separator + 
230
                                          tiledLayer.getID() + ".rmf";
231
                
232
                try {
233
                        if(!new File(path).exists() && 
234
                                provider != null && 
235
                                provider.getRMFFile() != null &&
236
                                new File(provider.getRMFFile()).exists()) 
237
                                RasterLocator.getManager().getFileUtils().copyFile(provider.getRMFFile(), path);
238
                        
239
                        if(provider != null && provider.getColorTable() != null) {        
240
                                ColorTable colorTable = provider.getColorTable();
241
                                RasterLocator.getManager().getProviderServices().saveObjectToRmfFile(path, ColorTable.class, colorTable);
242
                        }
243
                } catch (LocatorException e) {
244
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
245
                } catch (FileNotFoundException e) {
246
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
247
                } catch (IOException e) {
248
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
249
                } catch (RmfSerializerException e) {
250
                        logger.info("No se ha podido copiar la tabla de color a la capa tileada", e);
251
                }
252
                return path;
253
        }
254
        
255
        public TileProvider() throws NotSupportedExtensionException {
256
                super();
257
        }
258
        
259
        /*
260
         * (non-Javadoc)
261
         * @see org.gvsig.raster.impl.provider.RasterProvider#registerTileProviderFormats(java.lang.Class)
262
         */
263
        public void registerTileProviderFormats(Class<RasterProvider> c) {
264
                
265
        }
266
        
267
        /**
268
         * Assigns the provider associated to this tile server
269
         * @param prov
270
         * @throws NotSupportedExtensionException 
271
         */
272
        public void setProvider(RasterProvider prov) throws InitializeException  {
273
                this.provider = prov;
274
                init(getDataStoreParameters(), getStoreServices());
275
        }
276
        
277
        public TileProvider(TileDataParametersImpl params,
278
                        DataStoreProviderServices storeServices) throws InitializeException {
279
                super(params, storeServices, ToolsLocator.getDynObjectManager()
280
                                .createDynObject(
281
                                                MetadataLocator.getMetadataManager().getDefinition(
282
                                                                DataStore.METADATA_DEFINITION_NAME)));
283
                if(!params.isSecondLevelCache()) {
284
                        try {
285
                                provider = loadProvider(params, storeServices);
286
                        } catch (ProviderNotRegisteredException e) {
287
                                throw new InitializeException("Provider not registered", e);
288
                        }
289
                        init(params, storeServices);
290
                        if(provider.getFileSizeByProvider() != null && provider.getFileSizeByProvider().length > 0)
291
                                fileSize = provider.getFileSizeByProvider()[0];
292
                }
293
        }
294
        
295
        /**
296
         * Creates the second level cache if the client has set a <code>TileServer</code> and the
297
         * <code>CacheStruct</code> is different that the old one. 
298
         * <UL>
299
         * <LI>First level cache without TileServer from the client: do nothing</LI>
300
         * <LI>First level cache with TileServer from the client and the structure is 
301
         * different to the old one: Builds a second level TileProvider</LI>
302
         * <LI>First level cache with TileServer from the client and the structure is 
303
         * equal to the old one: do nothing</LI>
304
         * <LI>Second level cache: sets the TileServer</LI>
305
         * </UL>
306
         * @param params
307
         * @param storeServices
308
         * @throws NotSupportedExtensionException
309
         */
310
        /*private void createsSecondLevelCache(TileDataParametersImpl params) throws NotSupportedExtensionException {
311
                //Se obtiene el TileServer que haya pasado el cliente en los par?metros si ha pasado alguno.
312
                TileServer tileServer = params.getTileServer();
313
                //Se obtiene el CacheStruct y se compara con el del provider
314
                CacheStruct cacheStruct = null;
315
                if(tileServer != null)
316
                        cacheStruct = tileServer.getStruct();
317
                
318
                if(params.isSecondLevelCache()) { //Cache de segundo nivel
319
                        this.secondLevelTileServer = tileServer;
320
                } else if(cacheStruct != null && !provider.getTileServer().getStruct().compare(cacheStruct)) { //Cache de primer nivel
321
                        //Si son distintos habr? que crear una cach? de segundo nivel por lo que creamos un nuevo TileProvider
322
                        //que tenga como par?metro el provider viejo
323
                        TileDataParametersImpl par = new TileDataParametersImpl();
324
                        par.setDataParameters(provider.getDataParameters());
325
                        par.setTileServer(tileServer);
326
                        par.setSecondLevelCache(true);
327
                        TileProvider newProvider = new TileProvider(par, null);
328
                        newProvider.setProvider(this.provider);
329
                        //Al TileProvider actual se le asigna como provider el TileProvider creado
330
                        this.provider = newProvider;
331
                }
332
        }*/
333
        
334
        /**
335
         * Crea las referencias al fichero y carga
336
         * las estructuras con la informaci?n y los metadatos.
337
         * @param proj Proyecci?n
338
         * @param param Parametros de carga
339
         * @throws NotSupportedExtensionException
340
         */
341
        public void init (DataStoreParameters params,
342
                        DataStoreProviderServices storeServices) throws InitializeException  {
343
                setParam(storeServices, params);
344
                open = true;
345
                setDataType(provider.getDataType());
346
                bandCount = provider.getBandCount();
347
                //if(getColorInterpretation() == null)
348
                        setColorInterpretation(provider.getColorInterpretation());
349
                /*else
350
                        getColorInterpretation().addColorInterpretation(provider.getColorInterpretation());*/
351
                setColorTable(provider.getColorTable());
352
                noData = provider.getNoDataValue();
353
                setFName(provider.getURIOfFirstProvider());
354
                proj = provider.getProjection();
355
                ownTransformation = provider.getAffineTransform();
356
                externalTransformation = (AffineTransform)ownTransformation.clone();
357
                
358
                createTiledLayer();
359
                
360
                //Force to deletes the layer if the flag is to true
361
                if(tiledLayer != null) {
362
                        if(param instanceof TileDataParameters) {
363
                                if(((TileDataParameters)param).isDeletingCache()) {
364
                                        TileCacheManager  manager = TileCacheLocator.getManager();
365
                                        TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
366
                                        tileCache.removeLayer(tiledLayer);
367
                                        ((TileDataParameters)param).deleteCache(false);
368
                                }
369
                        }
370
                }
371
                
372
                if(provider instanceof RemoteRasterProvider)
373
                        stats = new RemoteDataStoreStatistics(provider);
374
        }
375
        
376
        /**
377
         * Creates a new tiled layer if this hasn't been created yet or the ID has changed. 
378
         * An ID could changed because the file type has changed when the user uses WMTS properties.
379
         */
380
        private void createTiledLayer() {
381
                TileCacheManager  manager = TileCacheLocator.getManager();
382
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
383
                TiledLayer newLayer = tileCache.createLayer(provider.getTileServer(), TileCacheLibrary.DEFAULT_STRUCTURE);
384
                if(tiledLayer == null || newLayer.getID().compareTo(tiledLayer.getID()) != 0)
385
                        tiledLayer = newLayer;
386
        }
387
        
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getZoomLevels()
391
         */
392
        public int getZoomLevels() {
393
                if(provider.getTileServer() != null)
394
                        return provider.getTileServer().getStruct().getNumberOfLevels();
395
                return 0;
396
        }
397
        
398
        /*
399
         * (non-Javadoc)
400
         * @see org.gvsig.raster.impl.provider.RasterProvider#getNearestLevel(double)
401
         */
402
        public int getNearestLevel(double pixelSize) {
403
                double[] pixelSizes = getPixelSizeByLevel();
404
                for (int i = 0; i < pixelSizes.length - 1; i++) {
405
                        if(pixelSize <= pixelSizes[i] && pixelSize > pixelSizes[i + 1]) {
406
                                return i;
407
                        }
408
                }
409
                if(pixelSize < pixelSizes[getZoomLevels() - 1])
410
                        return getZoomLevels() - 1;
411
                return 0;
412
        }
413
        
414
        /**
415
         * Returns a list of pixel sizes by level
416
         * @return
417
         */
418
        public double[] getPixelSizeByLevel() {
419
                double[] list = new double[getZoomLevels()];
420
                CacheStruct struct = provider.getTileServer().getStruct();
421
                for (int i = 0; i < struct.getNumberOfLevels(); i++) {
422
                        list[i] = math.adjustDouble(struct.getPixelSizeByLevel(i));
423
                }
424
                return list;
425
        }
426
        
427
        /*
428
         * (non-Javadoc)
429
         * @see org.gvsig.raster.impl.provider.RasterProvider#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
430
         */
431
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
432
                double[] pixelSizes = getPixelSizeByLevel();
433
                double currentPixelSize = extent.width() / (double)w;
434
                
435
                int level = 0;
436
                for (int i = 0; i < (pixelSizes.length - 1); i++) {
437
                        if(currentPixelSize < pixelSizes[i] && currentPixelSize >= pixelSizes[i + 1]) {
438
                                level = i + 1;
439
                                break;
440
                        }
441
                }
442
                
443
                return getZoomLevelCoordinates(level, extent, w, h);
444
        }
445
        
446
        /*
447
         * (non-Javadoc)
448
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
449
         */
450
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
451
                level = adjustLevel(level);
452
                double pixelSize = provider.getTileServer().getStruct().getPixelSizeByLevel(level);
453
                
454
                double ulx = viewCenter.getX() - ((w / 2) * pixelSize);
455
                double uly = viewCenter.getY() - ((h / 2) * pixelSize);
456
                double lrx = ulx + (w * pixelSize);
457
                double lry = uly + (h * pixelSize);
458
                return new ExtentImpl(ulx, uly, lrx, lry);
459
        }
460
        
461
        /**
462
         * Adjust de level to the range
463
         * @param level
464
         * @return
465
         */
466
        private int adjustLevel(int level) {
467
                if(level < 0)
468
                        level = 0;
469
                if(level > getZoomLevels())
470
                        level = getZoomLevels();
471
                return level;
472
        }
473
        
474
        /*
475
         * (non-Javadoc)
476
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
477
         */
478
        public AffineTransform getAffineTransform() {
479
                return provider.getAffineTransform();
480
        }
481
        
482
        /**
483
         * Obtiene el objeto que contiene el estado de la transparencia
484
         */
485
        public Transparency getTransparency() {
486
                return provider.getTransparency();
487
        }
488
        
489
        /**
490
         * Gets the bounding box in world coordinates. If the layer has grid subsets (TileMatrixLimits) then
491
         * this will have a only extent but if the layer doesn't have grid subsets then this will have a different
492
         * extent in each level resolution. In this case we need to know the extent for each level.
493
         * @return Extent
494
         */
495
        public Extent getExtent() {
496
                return provider.getExtent();
497
        }
498

    
499
        /*
500
         * (non-Javadoc)
501
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
502
         */
503
        public RasterProvider load() {
504
                return this;
505
        }
506
        
507
        /*
508
         * (non-Javadoc)
509
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
510
         */
511
        public boolean isOpen() {
512
                return open;
513
        }
514

    
515
        /*
516
         * (non-Javadoc)
517
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isTiled()
518
         */
519
        public boolean isTiled() {
520
                return true;
521
        }
522
        
523
        /*
524
         * (non-Javadoc)
525
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
526
         */
527
        public void close() {
528
                open = false;
529
                if(provider != null)
530
                        provider.close();
531
        }
532
        
533
        /*
534
         * (non-Javadoc)
535
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
536
         */
537
        public String translateFileName(String fileName) {
538
                return fileName;
539
        }
540

    
541
        /*
542
         * (non-Javadoc)
543
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
544
         */
545
        public void setView(Extent e) {
546
                viewRequest = e;
547
        }
548

    
549
        /*
550
         * (non-Javadoc)
551
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
552
         */
553
        public Extent getView() {
554
                return viewRequest;
555
        }
556

    
557
        /*
558
         * (non-Javadoc)
559
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
560
         */
561
        public double getWidth() {
562
                return provider.getWidth();
563
        }
564

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

    
573
        /*
574
         * (non-Javadoc)
575
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
576
         */
577
        public Object readCompleteLine(int line, int band)
578
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
579
                return null;
580
        }
581
        
582
        public File getFileLayer() throws RasterDriverException {
583
                return null;
584
        }
585

    
586
        /**
587
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
588
         * to read a file very fast without setting a view. 
589
         * 
590
         * @param pos Posici?n donde se empieza  a leer
591
         * @param blockHeight Altura m?xima del bloque leido
592
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
593
         * @throws InvalidSetViewException
594
         * @throws FileNotOpenException
595
         * @throws RasterDriverException
596
         */
597
        public Object readBlock(int pos, int blockHeight, double scale) 
598
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
599
                return provider.readBlock(pos, blockHeight, scale);
600
        }
601

    
602
        /*
603
         * (non-Javadoc)
604
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
605
         */
606
        public Object getData(int x, int y, int band)
607
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
608
                return provider.getData(x, y, band);
609
        }
610
        
611
        /**
612
         * Assigns the list of bands RGB and read a window of data
613
         * @param rasterBuf
614
         * @param bandList
615
         * @param lastFile
616
         * @param ulx
617
         * @param uly
618
         * @param lrx
619
         * @param lry
620
         * @return
621
         * @throws RasterDriverException
622
         * @throws ProcessInterruptedException
623
         */
624
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
625
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
626
                return null;
627
        }
628
        
629
        /**
630
         * Calculates the extent of a zoom level using other extent as a reference. The new extent is 
631
         * calculated with the same coordinate at the center. 
632
         * @param level
633
         * @param extent
634
         * @param w
635
         * @param h
636
         * @return
637
         */
638
        public Extent getZoomLevelCoordinates(int level, Extent extent, int w, int h) {
639
                double centerX = extent.getCenterX();
640
                double centerY = extent.getCenterY();
641
                return getCoordsInLevel(new Point2D.Double(centerX, centerY), level, w, h);
642
        }
643
        
644
        /**
645
         * Gets the tile list in a selected extent
646
         * @param ex
647
         * @param bandList
648
         * @param bufWidth
649
         * @param bufHeight
650
         * @return
651
         * @throws TileBuildException 
652
         */
653
        private List<Tile> getTileList(Extent ex, BandList bandList, int bufWidth, int bufHeight) throws TileBuildException {
654
                TileServer tileServer = provider.getTileServer();
655
                CacheStruct struct = tileServer.getStruct();
656
                tileServer.setFileSuffix(getFileSuffix());
657
                
658
                createTiledLayer(); //Creates a new layer when the file type changes
659
                
660
                Extent adjustedExtent = util.intersection(provider.getExtent(), ex);
661
                double newBufWidth = (adjustedExtent.width() * bufWidth) / ex.width();
662
                double pixelSizeRequest = adjustedExtent.width() / newBufWidth; 
663
                
664
                List<Tile> tileList = struct.getTileList(new Point2D.Double(adjustedExtent.getULX(), adjustedExtent.getULY()), 
665
                                new Point2D.Double(adjustedExtent.getLRX(), adjustedExtent.getLRY()), 
666
                                pixelSizeRequest);
667
                
668
                for (int i = 0; i < tileList.size(); i++) {
669
                        loadTileTimeParameters(tileList.get(i));
670
                }
671
                
672
                for (int i = 0; i < tileList.size(); i++) {
673
                        tileList.get(i).setDownloaderParams("BandList", bandList.clone());
674
                }
675
                return tileList;
676
        }
677
        
678
        /**
679
         * Loads the multidimensional parameters in a tile 
680
         * @param tile
681
         */
682
        private void loadTileTimeParameters(Tile tile) {
683
                if(provider.getDataParameters() instanceof MultiDimensionalStoreParameters) {
684
                        MultiDimensionalStoreParameters par = (MultiDimensionalStoreParameters)provider.getDataParameters();
685
                        tile.setVariable(par.getStringVariable());
686
                        tile.setZ(par.getStringLevel());
687
                        tile.setTimeInstant(par.getStringTime());
688
                }
689
        }
690
        
691
        /*
692
         * (non-Javadoc)
693
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#needEnhanced()
694
         */
695
        public boolean needEnhanced() {
696
                return provider.needEnhanced();
697
        }
698
        
699
        /*
700
         * (non-Javadoc)
701
         * @see org.gvsig.raster.impl.provider.TiledRasterProvider#getTile(int, int, int, org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.raster.cache.tile.provider.CacheStruct)
702
         */
703
        public Tile getTile(DefaultRasterQuery q) throws TileGettingException {
704
                //q.getResolutionLevel(), q.getTileCol(), q.getTileRow(), q.getBBox(), q.getCacheStruct()
705
                if(q.getCacheStruct() == null)
706
                        q.setCacheStruct(provider.getTileServer().getStruct());
707
                else
708
                        provider.getTileServer().setStruct(q.getCacheStruct());
709
                
710
                Tile tile = null;
711
                try {
712
                        tile = q.getCacheStruct().getTileStructure(
713
                                        q.getResolutionLevel(), q.getTileCol(), q.getTileRow(), 
714
                                        new Point2D.Double(q.getBBox().getULX(), q.getBBox().getULY()), 
715
                                        new Point2D.Double(q.getBBox().getLRX(), q.getBBox().getLRY()));
716
                } catch (TileBuildException e1) {
717
                        throw new TileGettingException(e1);
718
                }
719
                
720
                loadTileTimeParameters(tile);
721
                
722
                //Creamos un BandList con todas las bandas del fichero
723
                BandList bandList = new BandListImpl();
724
                for(int i = 0; i < provider.getBandCount(); i++) {
725
                        try {
726
                                DatasetBand band = new DatasetBandImpl(provider.getURIOfFirstProvider(), i, provider.getDataType()[i], provider.getBandCount());
727
                                bandList.addBand(band);
728
                        } catch(BandNotFoundInListException e) {
729
                                //No a?adimos la banda
730
                        }
731
                }
732
                bandList.setDrawableBands(new int[]{0, 1, 2});
733
                
734
                tile.setDownloaderParams("BandList", bandList);
735
                createTiledLayer();
736
                return tiledLayer.getTile(tile);
737
        }
738

    
739
        /*
740
         * (non-Javadoc)
741
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
742
         */
743
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
744
                        BandList bandList, TileListener listener, TaskStatus taskStatus) throws ProcessInterruptedException, RasterDriverException {
745
                try {
746
                        List<Tile> tileList = getTileList(ex, bandList, bufWidth, bufHeight);
747
                        tiledLayer.getTiles(tileList, listener, taskStatus);
748
                } catch (TileGettingException e) {
749
                        throw new RasterDriverException("Error getting the tile list", e);
750
                } catch (TileBuildException e) {
751
                        throw new RasterDriverException("Error building the tile list", e);
752
                }
753
        }
754
        
755
        /*
756
         * (non-Javadoc)
757
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
758
         */
759
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
760
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
761
                //draw method
762
                List<Tile> tileList = null;
763
                try {
764
                        tileList = getTileList(extent, bandList, bufWidth, bufHeight);
765
                        for (int i = 0; i < tileList.size(); i++) {
766
                                tiledLayer.getTile(tileList.get(i));
767
                        }
768
                } catch (TileGettingException e) {
769
                        throw new RasterDriverException("Error getting the tile list", e);
770
                } catch (TileBuildException e) {
771
                        throw new RasterDriverException("Error building the tile list", e);
772
                }
773
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
774
                return matrixBuffer.getWindow(extent, rasterBuf);
775
        }
776

    
777
        /*
778
         * (non-Javadoc)
779
         * @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)
780
         */
781
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
782
                throws ProcessInterruptedException, RasterDriverException {
783
                //return ((DefaultRasterProvider)provider).getWindow(ex, bandList, rasterBuf);
784
                return null;
785
        }
786

    
787
        /*
788
         * (non-Javadoc)
789
         * @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)
790
         */
791
        public Buffer getWindow(double ulx, double uly, double w, double h, 
792
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
793
                Extent extent = new ExtentImpl(ulx, uly, ulx + w, uly - h);
794
                List<Tile> tileList = null;
795
                try {
796
                        tileList = getTileList(extent, bandList, rasterBuf.getWidth(), rasterBuf.getHeight());
797
                        for (int i = 0; i < tileList.size(); i++) {
798
                                tiledLayer.getTile(tileList.get(i));
799
                        }
800
                } catch (TileGettingException e) {
801
                        throw new RasterDriverException("Error getting the tile list", e);
802
                } catch (TileBuildException e) {
803
                        throw new RasterDriverException("Error building the tile list", e);
804
                }
805
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
806
                return matrixBuffer.getWindow(extent, rasterBuf);
807
        }
808

    
809
        /*
810
         * (non-Javadoc)
811
         * @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)
812
         */
813
        public Buffer getWindow(int x, int y, int w, int h, 
814
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
815
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
816
                q.setAreaOfInterest(x, y, w, h);
817
                q.setBandList(bandList);
818
                q.setBuffer(rasterBuf);
819
                Buffer b = ((DefaultRasterProvider)provider).getDataSet(q);
820
                if(b != null)
821
                        return b;
822
                else {
823
                        //TODO
824
                }
825
                return null;
826
        }
827

    
828
        /*
829
         * (non-Javadoc)
830
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
831
         */
832
        public int getBlockSize() {
833
                return 0;
834
        }
835

    
836
        /*
837
         * (non-Javadoc)
838
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
839
         */
840
        public void setAffineTransform(AffineTransform t){
841
                
842
        }
843

    
844
        /*
845
         * (non-Javadoc)
846
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
847
         */
848
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
849
                return getZoomLevels();
850
        }
851

    
852
        /*
853
         * (non-Javadoc)
854
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
855
         */
856
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
857
                return provider.getTileServer().getStruct().getLayerWidthOfTileMatrixByLevel(overview) * 
858
                                provider.getTileServer().getStruct().getTileSizeByLevel(overview)[0];
859
        }
860

    
861
        /*
862
         * (non-Javadoc)
863
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
864
         */
865
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
866
                return provider.getTileServer().getStruct().getLayerHeightOfTileMatrixByLevel(overview) * 
867
                                provider.getTileServer().getStruct().getTileSizeByLevel(overview)[0];
868
        }
869

    
870
        /*
871
         * (non-Javadoc)
872
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
873
         */
874
        public boolean isOverviewsSupported() {
875
                return false;
876
        }
877

    
878
        /*
879
         * (non-Javadoc)
880
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
881
         */
882
        public String getName() {
883
                return NAME;
884
        }
885
        
886
        /**
887
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
888
         * @param pt Punto a transformar
889
         * @return punto transformado en coordenadas del mundo
890
         */
891
        public Point2D rasterToWorld(Point2D pt) {
892
                Point2D p = new Point2D.Double();
893
                getAffineTransform().transform(pt, p);
894
                return p;
895
        }
896

    
897
        /**
898
         * Convierte un punto desde del mundo a coordenadas pixel.
899
         * @param pt Punto a transformar
900
         * @return punto transformado en coordenadas pixel
901
         */
902
        public Point2D worldToRaster(Point2D pt) {
903
                Point2D p = new Point2D.Double();
904
                try {
905
                        getAffineTransform().inverseTransform(pt, p);
906
                } catch (NoninvertibleTransformException e) {
907
                        return pt;
908
                }
909
                return p;
910
        }
911
        
912
        /*
913
         * (non-Javadoc)
914
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
915
         */
916
        public void setStatus(RasterProvider provider) {
917
                if(provider instanceof TileProvider) {
918
                }
919
        }
920
        
921
        /**
922
         * ASigna el par?metro de inicializaci?n del driver.
923
         */
924
        @Override
925
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
926
                if(param instanceof RemoteStoreParameters)
927
                        this.uri = ((RasterDataParameters)param).getURI();
928
                this.param = param;
929
                this.storeServices = storeServices;
930
        }
931
        
932
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws InfoByPointException {
933
                if(provider != null)
934
                        return provider.getInfoByPoint(x, y, cancellable);
935
                return "Not implemented";
936
        }
937
        
938
        public String getInfoByPoint(int x, int y, Extent bbox, int w, int h, ICancellable cancellable) throws InfoByPointException {
939
                if(provider != null)
940
                        return provider.getInfoByPoint(x, y, bbox, w, h, cancellable);
941
                return "Not implemented";
942
        }
943
        
944
        /**
945
         * A tiled provider can't return a color table because each tile could have a different table. 
946
         * Besides, the table is not available when le provider is loaded. There could be to load 
947
         * the table from one tile because this is a property of a tile. The color table is sent to
948
         * the render with the data in a tile. 
949
         */
950
        /*public ColorTable getColorTable() {
951
                return null;
952
        }*/
953
        
954
        /*
955
         * (non-Javadoc)
956
         * @see org.gvsig.raster.impl.dataset.RasterProvider#getColorInterpretation()
957
         */
958
        public ColorInterpretation getColorInterpretation() {
959
                return provider.getColorInterpretation();
960
        }
961

    
962
        /**
963
         * Asigna el objeto que contiene que contiene la interpretaci?n de
964
         * color por banda
965
         * @param DataStoreColorInterpretation
966
         */
967
        public void setColorInterpretation(ColorInterpretation colorInterpretation) {
968
                provider.setColorInterpretation(colorInterpretation);
969
        }
970
        
971
        /*
972
         * (non-Javadoc)
973
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTileSize(int)
974
         */
975
        public int[] getTileSize(int level) {
976
                return provider.getTileServer().getStruct().getTileSizeByLevel(level);
977
        }
978
        
979
        /*
980
         * (non-Javadoc)
981
         * @see org.gvsig.raster.impl.provider.RasterProvider#deleteLayerFromCache()
982
         */
983
        public void deleteLayerFromCache() {
984
                TileCacheManager  manager = TileCacheLocator.getManager();
985
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
986
                if(tiledLayer != null)
987
                        tileCache.removeLayer(tiledLayer);
988
        }
989
        
990
        /*
991
         * (non-Javadoc)
992
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
993
         */
994
        public TileServer getTileServer() {
995
                return secondLevelTileServer;
996
        }
997
        
998
        public void setSecondLevelTileServer(TileServer tileServer) {
999
                this.secondLevelTileServer = tileServer;
1000
        }
1001
        
1002
        /*
1003
         * (non-Javadoc)
1004
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setTileServer(java.lang.Class)
1005
         */
1006
        public void setTileServer(Class<?> tileServer) throws InitializeException {
1007
                //TODO:Manejar excepciones
1008
                //Crear par?metros
1009
                TileDataParametersImpl par = new TileDataParametersImpl();
1010
                par.setDataParameters(getDataParameters());
1011
                par.setSecondLevelCache(true); //No crea un nuevo provider
1012
                
1013
                //Crea el proveedor de tiles de segundo nivel
1014
                TileProvider newProvider = null;
1015
                newProvider = new TileProvider(par, null);
1016
                newProvider.setProvider(this.provider);
1017

    
1018
                //Instancia el TileServer pasado por el cliente con el TileProvider de segundo nivel
1019
                Constructor<?> constructor;
1020
                TileServer tServer = null;
1021
                try {
1022
                        constructor = tileServer.getConstructor(new Class<?>[]{DefaultRasterProvider.class});
1023
                        Object [] args2 = {newProvider};
1024
                        tServer = (TileServer)constructor.newInstance(args2);
1025
                } catch (SecurityException e) {
1026
                        e.printStackTrace();
1027
                } catch (NoSuchMethodException e) {
1028
                        e.printStackTrace();
1029
                } catch (IllegalArgumentException e) {
1030
                        e.printStackTrace();
1031
                } catch (InstantiationException e) {
1032
                        e.printStackTrace();
1033
                } catch (IllegalAccessException e) {
1034
                        e.printStackTrace();
1035
                } catch (InvocationTargetException e) {
1036
                        e.printStackTrace();
1037
                }
1038
                
1039
                //Asigna el TileServer al nuevo provider de segundo nivel
1040
                newProvider.setSecondLevelTileServer(tServer);
1041
                
1042
                //Asigna al provider de tiles de primer nivel el de segundo. 
1043
                //Solo si las estructuras de cach? son diferentes
1044
                if(!provider.getTileServer().getStruct().compare(tServer.getStruct())) {
1045
                        this.setProvider(newProvider);
1046
                        tiledLayer = null;
1047
                }
1048
        }
1049
        
1050
}