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

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

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

    
34
import org.gvsig.compat.net.ICancellable;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.coverage.RasterLibrary;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
41
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
42
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
43
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
44
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
45
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
46
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
47
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
48
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
49
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
50
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
51
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
52
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
53
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
54
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
55
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
56
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
57
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
58
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
59
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
60
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
61
import org.gvsig.fmap.dal.coverage.util.MathUtils;
62
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
63
import org.gvsig.fmap.dal.exception.InitializeException;
64
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
65
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
66
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
67
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
68
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
69
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
70
import org.gvsig.fmap.dal.spi.DataStoreProvider;
71
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
72
import org.gvsig.metadata.MetadataLocator;
73
import org.gvsig.raster.cache.tile.Tile;
74
import org.gvsig.raster.cache.tile.TileCache;
75
import org.gvsig.raster.cache.tile.TileCacheLibrary;
76
import org.gvsig.raster.cache.tile.TileCacheLocator;
77
import org.gvsig.raster.cache.tile.TileCacheManager;
78
import org.gvsig.raster.cache.tile.exception.TileBuildException;
79
import org.gvsig.raster.cache.tile.exception.TileGettingException;
80
import org.gvsig.raster.cache.tile.layer.TiledLayer;
81
import org.gvsig.raster.cache.tile.provider.CacheStruct;
82
import org.gvsig.raster.cache.tile.provider.TileListener;
83
import org.gvsig.raster.cache.tile.provider.TileServer;
84
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
85
import org.gvsig.raster.impl.datastruct.BandListImpl;
86
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
87
import org.gvsig.raster.impl.datastruct.ExtentImpl;
88
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
89
import org.gvsig.raster.impl.provider.MemoryMatrixBuffer;
90
import org.gvsig.raster.impl.provider.RasterProvider;
91
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
92
import org.gvsig.raster.impl.provider.TiledRasterProvider;
93
import org.gvsig.raster.impl.store.DefaultStoreFactory;
94
import org.gvsig.raster.impl.store.properties.RemoteDataStoreStatistics;
95
import org.gvsig.tools.ToolsLocator;
96
import org.gvsig.tools.locator.LocatorException;
97
import org.gvsig.tools.task.TaskStatus;
98
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
100

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

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

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

    
492
        /*
493
         * (non-Javadoc)
494
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
495
         */
496
        public RasterProvider load() {
497
                return this;
498
        }
499
        
500
        /*
501
         * (non-Javadoc)
502
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
503
         */
504
        public boolean isOpen() {
505
                return open;
506
        }
507

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

    
534
        /*
535
         * (non-Javadoc)
536
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
537
         */
538
        public void setView(Extent e) {
539
                viewRequest = e;
540
        }
541

    
542
        /*
543
         * (non-Javadoc)
544
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
545
         */
546
        public Extent getView() {
547
                return viewRequest;
548
        }
549

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

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

    
566
        /*
567
         * (non-Javadoc)
568
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
569
         */
570
        public Object readCompleteLine(int line, int band)
571
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
572
                return null;
573
        }
574
        
575
        public File getFileLayer() throws RasterDriverException {
576
                return null;
577
        }
578

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

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

    
732
        /*
733
         * (non-Javadoc)
734
         * @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)
735
         */
736
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
737
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
738
                try {
739
                        ArrayList<Tile> tileList = getTileList(ex, bandList, bufWidth, bufHeight);
740
                        tiledLayer.getTiles(tileList, listener);
741
                } catch (TileGettingException e) {
742
                        throw new RasterDriverException("Error getting the tile list", e);
743
                } catch (TileBuildException e) {
744
                        throw new RasterDriverException("Error building the tile list", e);
745
                }
746
        }
747
        
748
        /*
749
         * (non-Javadoc)
750
         * @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)
751
         */
752
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
753
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
754
                //draw method
755
                ArrayList<Tile> tileList = null;
756
                try {
757
                        tileList = getTileList(extent, bandList, bufWidth, bufHeight);
758
                        for (int i = 0; i < tileList.size(); i++) {
759
                                tiledLayer.getTile(tileList.get(i));
760
                        }
761
                } catch (TileGettingException e) {
762
                        throw new RasterDriverException("Error getting the tile list", e);
763
                } catch (TileBuildException e) {
764
                        throw new RasterDriverException("Error building the tile list", e);
765
                }
766
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
767
                return matrixBuffer.getWindow(extent, rasterBuf);
768
        }
769

    
770
        /*
771
         * (non-Javadoc)
772
         * @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)
773
         */
774
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
775
                throws ProcessInterruptedException, RasterDriverException {
776
                //return ((DefaultRasterProvider)provider).getWindow(ex, bandList, rasterBuf);
777
                return null;
778
        }
779

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

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

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

    
829
        /*
830
         * (non-Javadoc)
831
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
832
         */
833
        public void setAffineTransform(AffineTransform t){
834
                
835
        }
836

    
837
        /*
838
         * (non-Javadoc)
839
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
840
         */
841
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
842
                return getZoomLevels();
843
        }
844

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

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

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

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

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

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

    
959
        /**
960
         * Asigna el objeto que contiene que contiene la interpretaci?n de
961
         * color por banda
962
         * @param DataStoreColorInterpretation
963
         */
964
        public void setColorInterpretation(ColorInterpretation colorInterpretation) {
965
                provider.setColorInterpretation(colorInterpretation);
966
        }
967
        
968
        /*
969
         * (non-Javadoc)
970
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTileSize(int)
971
         */
972
        public int[] getTileSize(int level) {
973
                return provider.getTileServer().getStruct().getTileSizeByLevel(level);
974
        }
975
        
976
        /*
977
         * (non-Javadoc)
978
         * @see org.gvsig.raster.impl.provider.RasterProvider#deleteLayerFromCache()
979
         */
980
        public void deleteLayerFromCache() {
981
                TileCacheManager  manager = TileCacheLocator.getManager();
982
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
983
                if(tiledLayer != null)
984
                        tileCache.removeLayer(tiledLayer);
985
        }
986
        
987
        /*
988
         * (non-Javadoc)
989
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
990
         */
991
        public TileServer getTileServer() {
992
                return secondLevelTileServer;
993
        }
994
        
995
        public void setSecondLevelTileServer(TileServer tileServer) {
996
                this.secondLevelTileServer = tileServer;
997
        }
998
        
999
        /*
1000
         * (non-Javadoc)
1001
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setTileServer(java.lang.Class)
1002
         */
1003
        public void setTileServer(Class<?> tileServer) {
1004
                //TODO:Manejar excepciones
1005
                //Crear par?metros
1006
                TileDataParametersImpl par = new TileDataParametersImpl();
1007
                par.setDataParameters(getDataParameters());
1008
                par.setSecondLevelCache(true); //No crea un nuevo provider
1009
                
1010
                //Crea el proveedor de tiles de segundo nivel
1011
                TileProvider newProvider = null;
1012
                try {
1013
                        newProvider = new TileProvider(par, null);
1014
                        newProvider.setProvider(this.provider);
1015
                } catch (NotSupportedExtensionException e1) {
1016
                        e1.printStackTrace();
1017
                } catch (FileNotSupportedException e) {
1018
                        //No se puede dar. Si el padre es soportado este tambi?n
1019
                        e.printStackTrace();
1020
                }
1021
                
1022
                //Instancia el TileServer pasado por el cliente con el TileProvider de segundo nivel
1023
                Constructor<?> constructor;
1024
                TileServer tServer = null;
1025
                try {
1026
                        constructor = tileServer.getConstructor(new Class<?>[]{DefaultRasterProvider.class});
1027
                        Object [] args2 = {newProvider};
1028
                        tServer = (TileServer)constructor.newInstance(args2);
1029
                } catch (SecurityException e) {
1030
                        e.printStackTrace();
1031
                } catch (NoSuchMethodException e) {
1032
                        e.printStackTrace();
1033
                } catch (IllegalArgumentException e) {
1034
                        e.printStackTrace();
1035
                } catch (InstantiationException e) {
1036
                        e.printStackTrace();
1037
                } catch (IllegalAccessException e) {
1038
                        e.printStackTrace();
1039
                } catch (InvocationTargetException e) {
1040
                        e.printStackTrace();
1041
                }
1042
                
1043
                //Asigna el TileServer al nuevo provider de segundo nivel
1044
                newProvider.setSecondLevelTileServer(tServer);
1045
                
1046
                //Asigna al provider de tiles de primer nivel el de segundo. 
1047
                //Solo si las estructuras de cach? son diferentes
1048
                try {
1049
                        if(!provider.getTileServer().getStruct().compare(tServer.getStruct())) {
1050
                                this.setProvider(newProvider);
1051
                                tiledLayer = null;
1052
                        }
1053
                } catch (NotSupportedExtensionException e) {
1054
                        e.printStackTrace();
1055
                }
1056
        }
1057
        
1058
}