Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wmts / trunk / org.gvsig.raster.wmts / org.gvsig.raster.wmts.app.wmtsclient / src / main / java / org / gvsig / raster / wmts / app / wmtsclient / layer / FLyrWMTS.java @ 2851

History | View | Annotate | Download (19.9 KB)

1
package org.gvsig.raster.wmts.app.wmtsclient.layer;
2

    
3
import java.awt.Dimension;
4
import java.awt.Graphics2D;
5
import java.awt.Image;
6
import java.awt.Point;
7
import java.awt.geom.Point2D;
8
import java.awt.geom.Rectangle2D;
9
import java.awt.image.BufferedImage;
10
import java.lang.ref.WeakReference;
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.Iterator;
14
import java.util.List;
15

    
16
import javax.print.attribute.PrintRequestAttributeSet;
17

    
18
import org.cresques.cts.ICoordTrans;
19
import org.cresques.cts.IProjection;
20
import org.gvsig.fmap.dal.DALLocator;
21
import org.gvsig.fmap.dal.DataManager;
22
import org.gvsig.fmap.dal.DataParameters;
23
import org.gvsig.fmap.dal.DataStore;
24
import org.gvsig.fmap.dal.DataStoreParameters;
25
import org.gvsig.fmap.dal.coverage.RasterLocator;
26
import org.gvsig.fmap.dal.coverage.RasterManager;
27
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
28
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
29
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
30
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
31
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
32
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
33
import org.gvsig.fmap.dal.coverage.exception.QueryException;
34
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
35
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
36
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
37
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
38
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.exception.InitializeException;
41
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
42
import org.gvsig.fmap.dal.exception.ReadException;
43
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
44
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
45
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
46
import org.gvsig.fmap.geom.GeometryLocator;
47
import org.gvsig.fmap.geom.GeometryManager;
48
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
49
import org.gvsig.fmap.geom.primitive.Envelope;
50
import org.gvsig.fmap.mapcontext.ViewPort;
51
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
52
import org.gvsig.fmap.mapcontext.layers.FLayer;
53
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
54
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
55
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
56
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
57
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
58
import org.gvsig.raster.fmap.legend.ImageLegend;
59
import org.gvsig.raster.util.CancelTaskImpl;
60
import org.gvsig.raster.wmts.io.WMTSDataParameters;
61
import org.gvsig.raster.wmts.io.WMTSServerExplorer;
62
import org.gvsig.raster.wmts.io.WMTSServerExplorerParameters;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.dynobject.DynObjectSet;
65
import org.gvsig.tools.dynobject.DynStruct;
66
import org.gvsig.tools.persistence.PersistenceManager;
67
import org.gvsig.tools.task.Cancellable;
68
import org.gvsig.tools.task.SimpleTaskStatus;
69
import org.gvsig.tools.task.TaskStatusManager;
70
import org.slf4j.Logger;
71
import org.slf4j.LoggerFactory;
72

    
73
/**
74
 * WMTS Layer class.
75
 *
76
 * @author Nacho Brodin (nachobrodin@gmail.com)
77
 *
78
 */
79
public class FLyrWMTS extends DefaultFLyrRaster implements IHasImageLegend {
80
        private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
81
        private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMTS.class);
82
        private List<WeakReference<Thread>>         disableUpdateDrawVersion;
83
        private Envelope                                         fullEnvelope              = null;
84
        private boolean                                                 firstLoad                 = false;
85
        private RasterManager                rManager                  = RasterLocator.getManager();
86
        private DataStoreParameters          params                    = null;
87
        private WMTSServerExplorer           wmtsExplorer              = null;
88
        private boolean                      deleteCache               = false;
89

    
90
        public static void registerPersistent() {
91
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
92
                DynStruct definition = manager.getDefinition("FLyrWMTS_Persistent");
93
                if( definition == null ) {
94
                        if (manager.getDefinition(DefaultFLyrRaster.class) == null) {
95
                                DefaultFLyrRaster.registerPersistent();
96
                        }
97

    
98
                        definition = manager.addDefinition(
99
                                        FLyrWMTS.class,
100
                                        "FLyrWMTS_Persistent",
101
                                        "FLyrWMTS Persistent Definition",
102
                                        null, 
103
                                        null
104
                        );
105
                        
106
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
107
                }
108

    
109
                DefaultFLyrRaster.registerPersistence(definition);
110
        }
111
        
112
        public FLyrWMTS() {
113
                super();
114
                this.updateDrawVersion();
115
                try {
116
                        enableAwake();
117
                } catch (NotAvailableStateException e) {
118
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
119
                }
120
        }
121
        
122
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
123
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
124
                RasterDataParameters params = null;
125
                try {
126
                        params = (RasterDataParameters)dataman.createServerExplorerParameters(WMTSServerExplorer.NAME);
127
                } catch (InitializeException e) {
128
                        return null;
129
                } catch (ProviderNotRegisteredException e) {
130
                        return null;
131
                }
132
                params.setURI(host);
133
                params.setSRS(srs);
134
                
135
                try {
136
                        return dataman.openStore(params.getDataStoreName(), params);
137
                } catch (ValidateDataParametersException e) {
138
                        throw new InitializeException(e);
139
                } catch (ProviderNotRegisteredException e) {
140
                        throw new InitializeException(e);
141
                }
142
        }
143

    
144
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
145
                this.dataStore = (RasterDataStore) dataStore;
146
                try {
147
                        enableOpen();
148
                } catch (NotAvailableStateException e) {
149
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
150
                }
151
                setProjection(this.dataStore.getProjection());
152
                setFullExtent(this.dataStore.getExtent().toRectangle2D());
153
        }
154

    
155
        @SuppressWarnings("deprecation")
156
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
157
                        Cancellable cancel, double scale) throws ReadException {
158
                //CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
159

    
160
                //Solo el zoom normal recalcula el nivel dependiendo de la escala. El zoom por niveles asigna
161
                //?l el nivel de zoom por lo que no habr? que recalcularlo.
162
                if(recalcLevel) {
163
                        double pixelSize = viewPort.getExtent().getWidth() / (double)viewPort.getImageWidth();
164
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
165
                }
166
                recalcLevel = true;
167
                
168
                if(!firstLoad) {
169
                        try {
170
                                initFilters();
171
                                try {
172
                                        if(!isOpen())
173
                                                enableOpen();
174
                                } catch (NotAvailableStateException e) {
175
                                        throw new ReadException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e);
176
                                }
177
                        } catch (FilePaletteException e) {
178
                                throw new ReadException(e.getMessage(), e);
179
                        }
180
                        firstLoad = true;
181
                }
182
                
183
                enableStopped();
184

    
185
                if (isWithinScale(scale)) {
186
                        if (!viewPort.getAdjustedExtent().intersects(getFullEnvelope()))
187
                                return;
188
                        Envelope adjustedExtent = viewPort.getAdjustedEnvelope();
189
                        Extent ext = rManager.getDataStructFactory().createExtent(
190
                                        adjustedExtent.getLowerCorner().getX(),
191
                                        adjustedExtent.getUpperCorner().getY(), 
192
                                        adjustedExtent.getUpperCorner().getX(),
193
                                        adjustedExtent.getLowerCorner().getY());
194
                        Dimension imgSz = viewPort.getImageSize();
195
                        ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(viewPort.getProjection(), ext, imgSz );
196
                        vp2.setMat(viewPort.getAffineTransform());
197
                        vp2.setDPI((int)viewPort.getDPI());
198
                        
199
                        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
200
                        SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
201
                        manager.add(taskStatus);
202
                        taskStatus.setAutoremove(true);
203

    
204
                        try {
205
                                WMTSDataParameters par = getWMTSParameters(getParameters());
206
                                //getParameters().setExtent(ext.toRectangle2D());
207
                                par.setWidth((int)viewPort.getImageSize().getWidth());
208
                                par.setHeight((int)viewPort.getImageSize().getHeight());
209
                                
210
                                getRender().drawTiledService(g, vp2, viewPort.getImageSize(), taskStatus);
211
                        } catch (ProcessInterruptedException e) {
212
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
213
                        } catch (QueryException e) {
214
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
215
                        } finally {
216
                                taskStatus.terminate();
217
                        }
218
                }
219
                disableStopped();
220
        }
221
        
222

    
223
        /**
224
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
225
         *                 com.iver.cit.gvsig.fmap.ViewPort,
226
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
227
         */
228
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
229
        throws ReadException {
230
                
231
        }
232

    
233
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
234
                        double scale) throws ReadException {
235
                draw(null, g, viewPort, cancel,scale);
236
        }
237

    
238
        /**
239
         * Inserta la extensi?n total de la capa.
240
         *
241
         * @param fullExtent
242
         *            Rectangulo.
243
         */
244
        public void setFullExtent(Rectangle2D fullExtent) {
245
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
246
        }
247

    
248
        /**
249
         * Inserta la extensi?n total de la capa en la proyeccion original.
250
         *
251
         * @param fullExtent
252
         *            Rect?ngulo.
253
         */
254
        public void setFullEnvelope(Envelope envelope) {
255
                Envelope cur = this.getFullEnvelope();
256
                if (cur == envelope) {
257
                        return;
258
                }
259
                if (cur != null && cur.equals(envelope)) {
260
                        return;
261
                }
262

    
263
                this.fullEnvelope = envelope;
264
                this.updateDrawVersion();
265
        }
266

    
267
        public HashMap<String, Object> getProperties() {
268
                HashMap<String, Object> info = new HashMap<String, Object>();
269
                WMTSDataParameters par = getWMTSParameters(getParameters());
270
                String layerName = par.getLayer().getTitle();
271
                try {
272
                        info.put("name", getName());
273
                        info.put("selectedLayer", layerName);
274
                        info.put("host", par.getURI());
275
                        info.put("srs", par.getSRSCode());
276
                        info.put("imageformat", par.getImageFormat());
277
                        info.put("infoformat", par.getInfoFormat());
278
                        //info.put("styles", getParameters().getStyles());
279
                        return info;
280
                } catch (Exception e) {
281
                        e.printStackTrace();
282
                }
283
                return null;
284
        }
285

    
286

    
287
        public String getTocImageIcon() {
288
                return "icon-layer-wmts";
289
        }
290

    
291
        public boolean isActionEnabled(int action) {
292
                switch (action) {
293
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
294
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
295
                case IRasterLayerActions.BANDS_FILE_LIST:
296
                case IRasterLayerActions.COLOR_TABLE:
297
                case IRasterLayerActions.GEOLOCATION:
298
                case IRasterLayerActions.PANSHARPENING:
299
                case IRasterLayerActions.SAVE_COLORINTERP:
300
                case IRasterLayerActions.SAVEAS:
301
                case IRasterLayerActions.BANDS_RGB:
302
                case IRasterLayerActions.CLIPPING:
303
                case IRasterLayerActions.ENHANCED:
304
                case IRasterLayerActions.STATS:
305
                case IRasterLayerActions.NODATA:
306
                case IRasterLayerActions.HISTOGRAM:
307
                        return false;
308
                case IRasterLayerActions.REMOTE_ACTIONS:
309
                        return true;
310
                }
311

    
312
                return super.isActionEnabled(action);
313
        }
314

    
315
        public ILegend getLegend() {
316
                if(getDataStore() != null)
317
                        return new ImageLegend(getDataStore().getImageLegend());
318
                return null;
319
        }
320

    
321
        public boolean isRemote() {
322
                return true;
323
        }
324

    
325
        public boolean overviewsSupport() {
326
                return false;
327
        }
328

    
329
        protected void updateDrawVersion() {
330
                if (this.disableUpdateDrawVersion != null){
331

    
332
                        Thread curThread = Thread.currentThread();
333

    
334
                        Thread aThread;
335

    
336
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
337
                        while (iter.hasNext()){
338
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
339
                                if (aThread == null){
340
                                        iter.remove();
341
                                } else if(aThread.equals(curThread)){
342
                                        return;
343
                                }
344
                        }
345
                }
346
                super.updateDrawVersion();
347
        }
348

    
349
        protected void disableUpdateDrawVersion() {
350
                if (this.disableUpdateDrawVersion == null) {
351
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
352
                }
353
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
354
        }
355

    
356
        protected void enableUpdateDrawVersion() {
357
                if (this.disableUpdateDrawVersion == null) {
358
                        return;
359
                }
360
                Thread curThread = Thread.currentThread();
361
                Thread aThread;
362

    
363
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
364
                while (iter.hasNext()) {
365
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
366
                        if (aThread == null) {
367
                                iter.remove();
368
                        } else if(aThread.equals(curThread)) {
369
                                iter.remove();
370
                                break;
371
                        }
372
                }
373

    
374
        }
375

    
376
        @SuppressWarnings("unused")
377
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
378
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
379
                                .getLength(0), env.getLength(1));
380
        }
381

    
382
        private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
383
                try {
384
                        return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
385
                                        rect.getMaxX(), rect.getMaxY(),
386
                                        SUBTYPES.GEOM2D);
387
                } catch (CreateEnvelopeException e) {
388
                        logger.error("Error creating the envelope", e);
389
                }
390
                return null;
391
        }
392
        
393
        @Override
394
        public String getFileFormat() {
395
                return "WMTS";
396
        }
397
        
398

    
399
        /**
400
         * Devuelve el envelope en la proyeccion de la vista
401
         */
402
        public Envelope getFullEnvelope() {
403
                Envelope rAux;
404
                rAux = this.fullEnvelope;
405

    
406
                // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
407
                // y alto 0.
408
                if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
409
                                && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
410
                        try {
411
                                rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
412
                        } catch (CreateEnvelopeException e) {
413
                                logger.error("Error creating the envelope", e);
414
                        }
415
                }
416
                // Si existe reproyecci?n, reproyectar el extent
417
                ICoordTrans ct = getCoordTrans();
418
                if (ct != null) {
419
                        Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
420
                                        .getMinimum(1));
421
                        Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
422
                                        .getMaximum(1));
423
                        pt1 = ct.convert(pt1, null);
424
                        pt2 = ct.convert(pt2, null);
425
                        try {
426
                                rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
427
                                                .getX(), pt2.getY(), SUBTYPES.GEOM2D);
428
                        } catch (CreateEnvelopeException e) {
429
                                logger.error("Error creating the envelope", e);
430
                        }// new
431
                        // Rectangle2D.Double();
432
                }
433
                return rAux;
434

    
435
        }
436
        
437
        public Extent getFullRasterExtent() {
438
                Envelope env = getFullEnvelope();
439
                double minx = env.getMinimum(0);
440
                double miny = env.getMinimum(1);
441
                double maxx = env.getMaximum(0);
442
                double maxy = env.getMaximum(1);
443
                Point2D ul = new Point2D.Double(minx, maxy);
444
                Point2D ur = new Point2D.Double(maxx, maxy);
445
                Point2D ll = new Point2D.Double(minx, miny);
446
                Point2D lr = new Point2D.Double(maxx, miny);
447
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
448
        }
449

    
450
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel)
451
                throws LoadLayerException, DataException {
452
                
453
                return null;
454
        }
455
    
456
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel, boolean fast)
457
    throws LoadLayerException, DataException {
458

    
459
            Point2D pReal = getMapContext().getViewPort().toMapPoint(p);
460
            String fInfo = null;
461
            try {
462
                    fInfo = getDataStore().getInfoByPoint(pReal.getX(), pReal.getY(), new CancelTaskImpl(cancel));
463
            } catch (InfoByPointException e) {
464
                    throw new LoadLayerException("Error in getInfoByPoint", e);
465
            }
466
            int type = DynObjectSetWMTSInfo.TYPE_TEXT;
467
            WMTSDataParameters wmtsParams = getWMTSParameters(params);
468

    
469
            if(wmtsParams.getInfoFormat() != null) {
470
                    if(wmtsParams.getInfoFormat().compareTo("text/html") == 0)
471
                            type = DynObjectSetWMTSInfo.TYPE_HTML;
472
                    if(wmtsParams.getInfoFormat().compareTo("application/vnd.ogc.gml") == 0)
473
                            type = DynObjectSetWMTSInfo.TYPE_XML;
474
            }
475
            return new DynObjectSetWMTSInfo(fInfo, type);
476
    }
477
    
478
    /**
479
     * Sets the data store parameters
480
     * @param params
481
     * @throws InitializeException
482
     */
483
    public void setParameters(DataStoreParameters params) throws InitializeException {
484
            this.params = params;
485

    
486
                if(params instanceof TileDataParameters) {
487
                        ((TileDataParameters)params).deleteCache(deleteCache);
488
                }
489
                
490
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
491
                try {
492
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
493
                        this.setDataStore(dStore);
494
                        
495
                        if(params instanceof WMTSDataParameters) {
496
                                this.setName(((WMTSDataParameters) params).getURI());
497
                        }
498
                        
499
                        if(params instanceof TileDataParameters) {
500
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
501
                                if(p instanceof WMTSDataParameters) {
502
                                        this.setName(((WMTSDataParameters) p).getURI());
503
                                }
504
                        }
505
                        
506
                } catch (ValidateDataParametersException e) {
507
                        throw new InitializeException(e);
508
                } catch (ProviderNotRegisteredException e) {
509
                        throw new InitializeException(e);
510
                } catch (InitializeException e) {
511
                        throw new InitializeException(e);
512
                } catch (LoadLayerException e) {
513
                        throw new InitializeException(e);
514
                }
515
    }
516
    
517
    @SuppressWarnings("deprecation")
518
        public DataStoreParameters getParameters() {
519
            if(params == null) {
520
                    DataManager datamanager = DALLocator.getDataManager();
521
                        WMTSServerExplorerParameters explorerParams = null;
522
                        try {
523
                                explorerParams = (WMTSServerExplorerParameters) datamanager.createServerExplorerParameters(WMTSServerExplorer.NAME);
524
                                explorerParams.setHost("");
525
                                wmtsExplorer = (WMTSServerExplorer) datamanager.createServerExplorer(explorerParams);
526
                                params = wmtsExplorer.getStoredParameters();
527
                        } catch (InitializeException e) {
528
                        } catch (ProviderNotRegisteredException e) {
529
                        } catch (ValidateDataParametersException e) {
530
                        }
531
            }
532
            return getWMTSParameters(params);
533
    }
534
    
535
    /**
536
     * Gets <code>WMTSDataParameters</code>
537
     * @param parameters
538
     * @return
539
     */
540
    private WMTSDataParameters getWMTSParameters(DataStoreParameters parameters) {
541
            WMTSDataParameters params = null;
542
            if(parameters instanceof WMTSDataParameters) {
543
                        params = (WMTSDataParameters) parameters;
544
                }
545
                
546
                if(parameters instanceof TileDataParameters) {
547
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
548
                        if(p instanceof WMTSDataParameters) {
549
                                params = (WMTSDataParameters) p;
550
                        }
551
                }
552
                return params;
553
    }
554
    
555
    /**
556
     * Sets the explorer
557
     * @param explorer
558
     */
559
    public void setExplorer(WMTSServerExplorer explorer) {
560
            this.wmtsExplorer = explorer;
561
    }
562
    
563
    /**
564
     * Gets the explorer
565
     * @return
566
     */
567
    public WMTSServerExplorer getExplorer() {
568
            return this.wmtsExplorer;
569
    }
570

    
571
        public Image getImageLegend() {
572
                return dataStore.getImageLegend();
573
        }
574

    
575
        public String getPathImage() {
576
                return null;
577
        }
578
        
579
        public FLayer cloneLayer() throws Exception {
580
                RasterDataStore  ds = dataStore.cloneDataStore();
581
                FLyrWMTS newLayer = new FLyrWMTS();
582
                newLayer.setName(getName());
583
                newLayer.setOpenRasterStore(ds);
584
                newLayer.fullEnvelope = fullEnvelope;
585
                newLayer.params = params;
586
                newLayer.firstLoad = firstLoad;
587
                newLayer.wmtsExplorer = wmtsExplorer;
588
                
589
                List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
590

    
591
                //Hacemos una copia de las bandas a renderizar
592
                ColorInterpretation ci = getRender().getRenderColorInterpretation();
593
                if(ci != null) {
594
                        newLayer.getRender().setRenderColorInterpretation(ci.cloneColorInterpretation());
595
                }
596

    
597
                //Asignamos el entorno
598
                if(newLayer.getRender().getFilterList() == null)
599
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
600
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
601
                newLayer.getRender().getFilterList().setStatus(filters);
602

    
603
                // Asignamos los valores noData del original
604
                NoData nd = (NoData)getNoDataValue().clone();
605
                newLayer.setNoDataValue(nd);
606
                newLayer.enableOpen();
607
                
608
                return newLayer;
609
        }
610

    
611
        /**
612
         * Assigns the flag to delete this layer from the cache
613
         * @param selected
614
         */
615
        public void deleteCache(boolean deleteCache) {
616
                this.deleteCache = deleteCache;
617
        }
618
}