Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wcs / trunk / org.gvsig.raster.wcs / org.gvsig.raster.wcs.app.wcsclient / src / main / java / org / gvsig / raster / wcs / app / wcsclient / layer / FLyrWCS.java @ 2849

History | View | Annotate | Download (31.3 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package org.gvsig.raster.wcs.app.wcsclient.layer;
42

    
43
import java.awt.Dimension;
44
import java.awt.Graphics2D;
45
import java.awt.Point;
46
import java.awt.Rectangle;
47
import java.awt.geom.AffineTransform;
48
import java.awt.geom.NoninvertibleTransformException;
49
import java.awt.geom.Point2D;
50
import java.awt.geom.Rectangle2D;
51
import java.awt.image.BufferedImage;
52
import java.io.IOException;
53
import java.util.HashMap;
54
import java.util.List;
55

    
56
import javax.print.attribute.PrintRequestAttributeSet;
57

    
58
import org.cresques.cts.IProjection;
59
import org.gvsig.compat.net.ICancellable;
60
import org.gvsig.fmap.dal.DALLocator;
61
import org.gvsig.fmap.dal.DataManager;
62
import org.gvsig.fmap.dal.DataParameters;
63
import org.gvsig.fmap.dal.DataStore;
64
import org.gvsig.fmap.dal.DataStoreParameters;
65
import org.gvsig.fmap.dal.coverage.RasterLocator;
66
import org.gvsig.fmap.dal.coverage.RasterManager;
67
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
68
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
69
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
70
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
71
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
72
import org.gvsig.fmap.dal.coverage.exception.QueryException;
73
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
74
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
75
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
76
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
77
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
78
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
79
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
80
import org.gvsig.fmap.dal.exception.DataException;
81
import org.gvsig.fmap.dal.exception.InitializeException;
82
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
83
import org.gvsig.fmap.dal.exception.ReadException;
84
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
85
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
86
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
87
import org.gvsig.fmap.geom.GeometryLocator;
88
import org.gvsig.fmap.geom.GeometryManager;
89
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
90
import org.gvsig.fmap.geom.primitive.Envelope;
91
import org.gvsig.fmap.mapcontext.ViewPort;
92
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
93
import org.gvsig.fmap.mapcontext.layers.FLayer;
94
import org.gvsig.fmap.mapcontext.layers.Tiling;
95
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
96
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
97
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
98
import org.gvsig.raster.util.CancelTaskImpl;
99
import org.gvsig.raster.wcs.io.WCSDataParameters;
100
import org.gvsig.raster.wcs.io.WCSProvider;
101
import org.gvsig.raster.wcs.io.WCSServerExplorer;
102
import org.gvsig.raster.wcs.io.WCSServerExplorerParameters;
103
import org.gvsig.tools.ToolsLocator;
104
import org.gvsig.tools.dynobject.DynObjectSet;
105
import org.gvsig.tools.dynobject.DynStruct;
106
import org.gvsig.tools.persistence.PersistenceManager;
107
import org.gvsig.tools.task.Cancellable;
108
import org.gvsig.tools.task.SimpleTaskStatus;
109
import org.gvsig.tools.task.TaskStatusManager;
110
import org.slf4j.Logger;
111
import org.slf4j.LoggerFactory;
112

    
113

    
114
/**
115
 * Class for the WCS layer.
116
 *
117
 * Capa para el WCS.
118
 *
119
 * Las capas WCS son tileadas para descargarlas del servidor. Esto quiere decir que
120
 * est?n formadas por multiples ficheros raster. Por esto la fuente de datos raster (IRasterDatasource)
121
 * de la capa FLyrWCS es un objeto de tipo CompositeDataset. Este objeto est? compuesto por un array
122
 * bidimensional de MultiRasterDataset. Cada uno de los MultiRasterDataset corresponde con un tile
123
 * salvado en disco. Estos MultiRasterDataset se crean cada vez que se repinta ya que en WCS a cada
124
 * zoom varian los ficheros fuente. La secuencia de creaci?n de un CompositeDataset ser?a la siguiente:
125
 * <UL>
126
 * <LI>Se hace una petici?n de dibujado por parte del usuario llamando al m?todo draw de FLyrWCS</LI>
127
 * <LI>Se tilea la petici?n</LI>
128
 * <LI>Cada tile se dibuja abriendo una FLyrRaster para ese tile</LI>
129
 * <LI>Si es el primer dibujado se guarda una referencia en la capa WCS a las propiedades de renderizado, orden de bandas,
130
 * transparencia, filtros aplicados, ...</LI>
131
 * <LI>Si no es el primer dibujado se asignan las propiedades de renderizado cuya referencia se guarda en la capa WCS</LI>
132
 * <LI>Se guarda el MultiRasterDataset de cada tile</LI>
133
 * <LI>Al acabar todos los tiles creamos un CompositeDataset con los MultiRasterDataset de todos los tiles</LI>
134
 * <LI>Asignamos a la capa la referencia de las propiedades de renderizado que tenemos almacenadas. De esta forma si hay
135
 * alguna modificaci?n desde el cuadro de propiedades ser? efectiva sobre los tiles que se dibujan.</LI>
136
 * </UL>
137
 *
138
 * @author jaume - jaume.dominguez@iver.es
139
 */
140
@SuppressWarnings("deprecation")
141
public class FLyrWCS extends DefaultFLyrRaster {
142
    private static final int             MAX_RETRY_TIMES           = 5;
143

    
144
    private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
145
    private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWCS.class);
146
    private boolean                                          isPrinting                = false;
147

    
148
    private boolean                                          mustTileDraw              = false;
149
    private int                                                  maxTileDrawWidth          = 1023;
150
    private int                                                         maxTileDrawHeight         = 1023;
151
    private final int                                          maxTilePrintWidth         = 1023;
152
    private final int                                          maxTilePrintHeight        = 1023;
153

    
154
    private boolean                                                 firstLoad                 = false;
155
    private Envelope                                         fullEnvelope              = null;
156
    private int                          callCount;
157
    private RasterManager                rManager                  = RasterLocator.getManager();
158
    private boolean                      deleteCache               = false;
159

    
160
    @SuppressWarnings("unused")
161
    private class MyCancellable implements ICancellable {
162
        private Cancellable original;
163

    
164
        public MyCancellable(Cancellable cancelOriginal) {
165
            this.original = cancelOriginal;
166
        }
167

    
168
        public boolean isCanceled() {
169
            return original.isCanceled();
170
        }
171

    
172
        public Object getID() {
173
            return this;
174
        }
175
    }
176

    
177
    public FLyrWCS() {
178
        super();
179
        this.updateDrawVersion();
180
        try {
181
            enableAwake();
182
        } catch (NotAvailableStateException e) {
183
            logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
184
        }
185
    }
186

    
187
    public FLyrWCS(DataStoreParameters dataStoreParameters) throws Exception {
188
        this();
189
        //Create the explorer and connect
190
        DataManager dataManager = DALLocator.getDataManager();
191
        WCSServerExplorerParameters explorerParams = (WCSServerExplorerParameters) 
192
        dataManager.createServerExplorerParameters(WCSProvider.NAME);
193
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));
194
        WCSServerExplorer wmsServerExplorer = 
195
            (WCSServerExplorer) dataManager.openServerExplorer(WCSProvider.NAME, explorerParams);
196
        wmsServerExplorer.connect(null);
197
        wmsServerExplorer.getCoverageList();
198
        
199
        //Set the parameters
200
        setParameters((WCSDataParameters)dataStoreParameters);
201
        setExplorer(wmsServerExplorer);
202
    }
203

    
204
    public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
205
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
206
        RasterDataParameters params = null;
207
        try {
208
            params = (RasterDataParameters)dataman.createServerExplorerParameters(WCSProvider.NAME);
209
        } catch (InitializeException e) {
210
            return null;
211
        } catch (ProviderNotRegisteredException e) {
212
            return null;
213
        }
214
        params.setURI(host);
215
        params.setSRS(srs);
216

    
217
        try {
218
            return dataman.openStore(params.getDataStoreName(), params);
219
        } catch (ValidateDataParametersException e) {
220
            throw new InitializeException(e);
221
        } catch (ProviderNotRegisteredException e) {
222
            throw new InitializeException(e);
223
        }
224
    }
225

    
226
    public void setDataStore(DataStore dataStore) throws LoadLayerException {
227
        this.dataStore = (RasterDataStore) dataStore;
228
        try {
229
            if(this.dataStore.isOpen())
230
                enableOpen();
231
        } catch (NotAvailableStateException e) {
232
            logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
233
        }
234
        setProjection(this.dataStore.getProjection());
235
    }
236

    
237
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale) throws ReadException {
238
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
239
                SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
240
                manager.add(taskStatus);
241
                taskStatus.setAutoremove(true);
242

    
243
        if(!firstLoad) {
244
            try {
245
                initFilters();
246
                try {
247
                                        if(!isOpen())
248
                                                enableOpen();
249
                                } catch (NotAvailableStateException e) {
250
                                        throw new ReadException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e);
251
                                }
252
            } catch (FilePaletteException e) {
253
                logger.error(e.getMessage(), this, e);
254
            }
255
            firstLoad = true;
256
        }
257

    
258
        callCount = 0;  
259

    
260
        enableStopped();
261
        
262
        if(recalcLevel) {
263
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
264
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
265
                }
266
                recalcLevel = true;
267

    
268
        if (isWithinScale(scale)) {
269

    
270
            if(mustTileDraw) {
271
                Point2D p = viewPort.getOffset();
272
                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
273
                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
274
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
275

    
276
                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
277
                    // drawing part
278
                    try {
279
                        ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
280
                        drawTile(g, vp, taskStatus, scale);
281
                    } catch (LoadLayerException e) {
282
                        throw new ReadException(e.getMessage(), e);
283
                    } catch (NoninvertibleTransformException e) {
284
                        throw new ReadException(e.getMessage(), e);
285
                    }
286
                }
287
            } else {
288
                try {
289
                    drawTile(g, viewPort, taskStatus, scale);
290
                } catch (LoadLayerException e) {
291
                    throw new ReadException(e.getMessage(), e);
292
                }
293
            }
294
        }
295
        disableStopped();
296

    
297
        /*Runtime r = Runtime.getRuntime();
298
                System.err.println("********************WCS**********************");
299
                System.err.println("Memoria Total: " + (r.totalMemory() / 1024) +"KB");
300
                System.err.println("Memoria Usada: " + ((r.totalMemory() - r.freeMemory()) / 1024) +"KB");
301
                System.err.println("Memoria Libre: " + (r.freeMemory() / 1024) +"KB");
302
                System.err.println("Memoria MaxMemory: " + (r.maxMemory() / 1024) +"KB");
303
                System.err.println("*********************************************");*/
304
    }
305

    
306
    /**
307
     * This is the method used to draw a tile in a WCS mosaic layer.
308
     * @throws LoadLayerException
309
     * @throws ReadDriverException
310
     * @return true when a tile has been painted
311
     */
312
    private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
313
        callCount++;
314

    
315
        // Compute the query geometry
316
        // 1. Check if it is within borders
317
        Envelope envelope = getFullEnvelope();
318
        Envelope vpEnv = vp.getAdjustedExtent();
319
        if (!vpEnv.intersects(envelope)) {
320
            return;
321
        }
322

    
323
        // 2. Compute extent to be requested.
324
        Rectangle2D bBox = new Rectangle2D.Double();
325
        Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
326
            getRectable2DFromEnvelope(envelope), bBox);
327

    
328
        // 3. Compute size in pixels
329
        double scalex = vp.getAffineTransform().getScaleX();
330
        double scaley = vp.getAffineTransform().getScaleY();
331
        int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
332
        int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
333

    
334
        Dimension sz = new Dimension(wImg, hImg);
335

    
336
        if ((wImg <= 0) || (hImg <= 0)) {
337
            return;
338
        }
339

    
340
        try {
341
            //Rectangle2D extent = new Rectangle2D.Double();
342
            //Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
343
            //Rectangle2D.intersect(vpExtent, bBox, extent);
344

    
345
            Extent ex = rManager.getDataStructFactory().createExtent(
346
                vp.getAdjustedEnvelope().getMinimum(0), 
347
                vp.getAdjustedEnvelope().getMaximum(1), 
348
                vp.getAdjustedEnvelope().getMaximum(0), 
349
                vp.getAdjustedEnvelope().getMinimum(1));
350
            ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), ex, sz );
351
            vpData.setMat(vp.getAffineTransform());
352
            vpData.setDPI((int)vp.getDPI());
353
                    
354
            try {
355
                getParameters().setExtent(bBox);
356
                getParameters().setWidth(wImg);
357
                getParameters().setHeight(hImg);
358
                if(getDataStore().getParameters() instanceof WCSDataParameters) {
359
                                        getRender().draw(g, vpData, taskStatus);
360
                } else {
361
                        Envelope adjustedExtent = vp.getAdjustedExtent();
362
                                        Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
363
                                                        adjustedExtent.getUpperCorner().getY(), adjustedExtent.getUpperCorner().getX(),
364
                                                        adjustedExtent.getLowerCorner().getY());
365
                                        ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), e, vp.getImageSize() );
366
                                        vp2.setMat(vp.getAffineTransform());
367
                                        vp2.setDPI((int)vp.getDPI());
368
                                        getParameters().setExtent(ex.toRectangle2D());
369
                                        getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
370
                }
371
            /*} catch (RasterDriverException e) {
372
                    setAvailable(false);
373
                                JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
374
                                logger.info("Problems drawing this layer:" + e.getMessage(), e);*/
375
            } catch (ProcessInterruptedException e) {
376
            } catch (QueryException e) {
377
                    throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
378
                        } finally {
379
                    taskStatus.terminate();                    
380
            }
381

    
382
        } catch (RemoteServiceException e) {
383
            if (!taskStatus.isCancellationRequested()) {
384
                if (callCount < MAX_RETRY_TIMES) {
385
                    logger.warn("\n[ FLyrWCS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
386
                    drawTile(g, vp, taskStatus, scale);
387
                } else {
388
                    if (!isPrinting) {
389
                        this.setVisible(false);
390
                    }
391
                    throw new LoadLayerException(getName(), e);
392
                }
393
            }
394
        }
395
        callCount--;
396
        return;
397
    }
398

    
399
    /**
400
     * <p>
401
     * Gets the max resolution allowed by the coverage. Requesting a higher resolution
402
     * than this value does not cause any error, but the info responsed is just an
403
     * interpolation. <br>
404
     * </p>
405
     *
406
     * <p>
407
     * In exchange for obtaining a greater file and without additional information,
408
     * we can easily fit it into the View. <br>
409
     * </p>
410
     *
411
     * <p>
412
     * Obtiene la resoluci?n m?xima soportada por la cobertura. La petici?n
413
     * de una resoluci?n superior a la soportada no provoca ning?n error, aunque
414
     * la informaci?n obtenida s?lo es una mera interpolaci?n de informaci?n. <br>
415
     * </p>
416
     *
417
     * <p>
418
     * A cambio de obtener un archivo mayor y sin informaci?n adicional, podemos
419
     * f?cilmente acoplarlo a la vista. <br>
420
     * </p>
421
     *
422
     * @return double
423
     */
424
    public Point2D getMaxResolution() {
425
        return getExplorer().getMaxResolution(getName());
426
    }
427

    
428
    private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
429
        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
430
            .getLength(0), env.getLength(1));
431
    }
432

    
433
    
434
    /**
435
     * Gets the explorer
436
     * @return
437
     */
438
    public WCSServerExplorer getExplorer() {
439
            try {
440
                        return (WCSServerExplorer)getDataStore().getExplorer();
441
                } catch (ValidateDataParametersException e) {
442
                        logger.debug("Error getting the explorer", e);
443
                } catch (DataException e) {
444
                        logger.debug("Error getting the explorer", e);
445
                }
446
            return null;
447
    }
448
    
449
    /**
450
     * Calcula el contenido del fichero de georreferenciaci?n de una imagen.
451
     * @param bBox Tama?o y posici?n de la imagen (en coordenadas de usuario)
452
     * @param sz Tama?o de la imagen en pixeles.
453
     * @return el 'WorldFile', como String.
454
     * @throws IOException
455
     */
456
    public String getDataWorldFile(Rectangle2D bBox, Dimension sz) throws IOException {
457
        StringBuffer data = new StringBuffer();
458
        data.append((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1) + "\n");
459
        data.append("0.0\n");
460
        data.append("0.0\n");
461
        data.append("-" + (bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1) + "\n");
462
        data.append("" + bBox.getMinX() + "\n");
463
        data.append("" + bBox.getMaxY() + "\n");
464
        return data.toString();
465
    }
466

    
467
    public FLayer cloneLayer() throws Exception {
468
        RasterDataStore  ds = dataStore.cloneDataStore();
469
        FLyrWCS layer = new FLyrWCS();
470
        layer.setName(getParameters().getCoverageName());
471
        layer.setOpenRasterStore(ds);
472
        layer.fullEnvelope = fullEnvelope;
473
        layer.setExplorer(getExplorer());
474

    
475
        List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
476

    
477
        //Hacemos una copia de las bandas a renderizar
478
        ColorInterpretation ci = getRender().getRenderColorInterpretation();
479
                if(ci != null) {
480
                        layer.getRender().setRenderColorInterpretation(ci.cloneColorInterpretation());
481
                }
482

    
483
        //Asignamos el entorno
484
        if(layer.getRender().getFilterList() == null)
485
            layer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
486
        layer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
487
        layer.getRender().getFilterList().setStatus(filters);
488

    
489
        // Asignamos los valores noData del original
490
        layer.setNoDataValue(getNoDataValue());
491
        if(dataStore.getNoDataValue().isDefined())
492
                layer.setNoDataTransparent(true);
493
        layer.enableOpen();
494

    
495
        return layer;
496
    }
497

    
498
    public Transparency getRenderTransparency() {
499
        return getRender().getRenderingTransparency();
500
    }
501

    
502
    public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties) throws ReadException {
503
        if (isVisible() && isWithinScale(scale)){
504
            draw(null, g, viewPort, cancel, scale);
505
        }
506
    }
507

    
508
    /**
509
     * Inserta la extensi?n total de la capa en la proyeccion original.
510
     *
511
     * @param fullExtent
512
     *            Rect?ngulo.
513
     */
514
    public void setFullEnvelope(Envelope envelope) {
515
        Envelope cur = this.getFullEnvelope();
516
        if (cur == envelope) {
517
            return;
518
        }
519
        if (cur != null && cur.equals(envelope)) {
520
            return;
521
        }
522

    
523
        this.fullEnvelope = envelope;
524
        this.updateDrawVersion();
525
    }
526

    
527
    /**
528
     * Sets the layer's full extent.
529
     *
530
     * Establece la extensi?n m?xima de la capa.
531
     *
532
     * @param rect
533
     */
534
    public void setFullExtent(Rectangle2D fullExtent) {
535
        this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
536
    }
537

    
538
    private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
539
        try {
540
            return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
541
                rect.getMaxX(), rect.getMaxY(),
542
                SUBTYPES.GEOM2D);
543
        } catch (CreateEnvelopeException e) {
544
            logger.error("Error creating the envelope", e);
545
        }
546
        return null;
547
    }
548

    
549

    
550
    public HashMap<String, Object> getProperties() {
551
        HashMap<String, Object> info = new HashMap<String, Object>();
552
        try {
553
            info.put("name", getName());
554
            info.put("selectedLayers", getParameters().getCoverageName());
555
            info.put("host", getParameters().getURI());
556
            info.put("crs", getParameters().getSRSCode());
557
            info.put("format", getParameters().getFormat());
558
            info.put("time", getParameters().getTime());
559
            return info;
560
        } catch (Exception e) {
561
            e.printStackTrace();
562
        }
563
        return null;
564
    }
565

    
566
    public int[] getTileSize() {
567
        int[] size = {maxTileDrawWidth, maxTileDrawHeight};
568
        return size;
569
    }
570

    
571
    public String getTocImageIcon() {
572
        return "ico-WCS-Layer";
573
    }
574

    
575
    public boolean isTiled() {
576
        return mustTileDraw;
577
    }
578
    
579
        public boolean isRemote() {
580
                return true;
581
        }
582

    
583
    @Override
584
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
585
        boolean fast) throws LoadLayerException, DataException {
586

    
587
        //try {
588
        ViewPort viewPort = getMapContext().getViewPort();
589

    
590
        Point tiledPoint = new Point((int) p.getX() % maxTilePrintWidth, (int) p.getY() % maxTilePrintHeight);
591
        Rectangle rect = new Rectangle(0, 0, viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
592
        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, rect);
593
        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
594
        int nCols = tiles.getNumCols();
595

    
596
        int col = (int) p.getX() / maxTilePrintWidth;
597
        int row = (int) p.getY() / maxTilePrintHeight;
598
        int tileIndex = (row * nCols) + col;
599

    
600
        ViewPort vp = null;
601
        try {
602
            vp = tiles.getTileViewPort(viewPort, tileIndex);
603
        } catch (NoninvertibleTransformException e1) {
604
            throw new LoadLayerException("", e1);
605
        }
606

    
607
        getParameters().setExtent(this.getRectable2DFromEnvelope(vp.getAdjustedExtent()));
608
        getParameters().setWidth(vp.getImageWidth());
609
        getParameters().setHeight(vp.getImageHeight());
610

    
611
        CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
612
        getParameters().setCancellable(cancellable);
613

    
614
        String fInfo;
615
        try {
616
            fInfo = getDataStore().getInfoByPoint(tiledPoint.getX(), tiledPoint.getY(), cancellable);
617
        } catch (InfoByPointException e) {
618
            throw new LoadLayerException("Error in getInfoByPoint", e);
619
        }
620
        return new DynObjectSetWCSInfo(fInfo, DynObjectSetWCSInfo.TYPE_TEXT);
621
    }
622
    
623
        @Override
624
        public String getFileFormat() {
625
                return "WCS";
626
        }
627

    
628
    public boolean isActionEnabled(int action) {
629
        switch (action) {
630
        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
631
        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
632
        case IRasterLayerActions.BANDS_FILE_LIST:
633
        case IRasterLayerActions.GEOLOCATION:
634
        case IRasterLayerActions.PANSHARPENING:
635
        case IRasterLayerActions.SAVE_COLORINTERP:
636
            return false;
637
        case IRasterLayerActions.BANDS_RGB:
638
        case IRasterLayerActions.REMOTE_ACTIONS:
639
        case IRasterLayerActions.COLOR_TABLE:
640
            return true;
641
        }
642

    
643
        return super.isActionEnabled(action);
644
    }
645

    
646
    public boolean overviewsSupport() {
647
        return false;
648
    }
649

    
650
    public org.gvsig.fmap.dal.coverage.datastruct.Extent getFullRasterExtent() {
651
        Envelope env = getFullEnvelope();
652
        double minx = env.getMinimum(0);
653
        double miny = env.getMinimum(1);
654
        double maxx = env.getMaximum(0);
655
        double maxy = env.getMaximum(1);
656
        Point2D ul = new Point2D.Double(minx, maxy);
657
        Point2D ur = new Point2D.Double(maxx, maxy);
658
        Point2D ll = new Point2D.Double(minx, miny);
659
        Point2D lr = new Point2D.Double(maxx, miny);
660
        return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
661
    }
662

    
663
    public WCSDataParameters getParameters() {
664
        /*if(params == null) {
665
            DataManager datamanager = DALLocator.getDataManager();
666
            WCSServerExplorerParameters explorerParams = null;
667
            try {
668
                explorerParams = (WCSServerExplorerParameters) datamanager.createServerExplorerParameters(WCSServerExplorer.NAME);
669
                explorerParams.setHost("");
670
                explorer = (WCSServerExplorer) datamanager.createServerExplorer(explorerParams);
671
                DataStoreParameters parameters = explorer.getStoreParameters();
672
                if(parameters instanceof WCSDataParameters) {
673
                    params = (WCSDataParameters) parameters;
674
                }
675
            } catch (InitializeException e) {
676
            } catch (ProviderNotRegisteredException e) {
677
            } catch (ValidateDataParametersException e) {
678
            }
679
        }*/
680
        return getWCSParameters(getDataStore().getParameters());
681
    }
682
    
683
    /**
684
     * Gets <code>WCSDataParameters</code>
685
     * @param parameters
686
     * @return
687
     */
688
    private WCSDataParameters getWCSParameters(DataStoreParameters parameters) {
689
            WCSDataParameters params = null;
690
            if(parameters instanceof WCSDataParameters) {
691
                        params = (WCSDataParameters) parameters;
692
                }
693
                
694
                if(parameters instanceof TileDataParameters) {
695
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
696
                        if(p instanceof WCSDataParameters) {
697
                                params = (WCSDataParameters) p;
698
                        }
699
                }
700
                return params;
701
    }
702

    
703
    /**
704
     * Sets the explorer
705
     * @param explorer
706
     */
707
    public void setExplorer(WCSServerExplorer explorer) {
708
            if(getDataStore() != null)
709
                    getDataStore().setExplorer(explorer);
710
    }
711
    
712
    /**
713
         * Assigns the flag to delete this layer from the cache
714
         * @param selected
715
         */
716
        public void deleteCache(boolean deleteCache) {
717
                this.deleteCache = deleteCache;
718
        }
719

    
720
    /**
721
     * Sets the data store parameters
722
     * @param params
723
     * @throws InitializeException
724
     */
725
    public void setParameters(DataStoreParameters params) throws InitializeException {
726
        if(params instanceof TileDataParameters) {
727
                        ((TileDataParameters)params).deleteCache(deleteCache);
728
                }
729
        
730
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
731
        try {
732
            DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
733
            this.setDataStore(dStore);
734

    
735
                        if(params instanceof WCSDataParameters) {
736
                                this.setName((String)((WCSDataParameters)params).getURI());
737
                        }
738
                        
739
                        if(params instanceof TileDataParameters) {
740
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
741
                                if(p instanceof WCSDataParameters) {
742
                                        this.setName((String)((WCSDataParameters) p).getURI());
743
                                }
744
                        }
745
        } catch (ValidateDataParametersException e) {
746
            throw new InitializeException(e);
747
        } catch (ProviderNotRegisteredException e) {
748
            throw new InitializeException(e);
749
        } catch (LoadLayerException e) {
750
            throw new InitializeException(e);
751
        }
752
    }
753
    
754
        /*@Override
755
        public void loadFromState(PersistentState state)
756
        throws PersistenceException {
757
                String host = state.getString("host");
758
                
759
                getParameters();
760
                ((WCSServerExplorerParameters)explorer.getParameters()).setHost(host);
761
                
762
                if(!explorer.isHostReachable()) {
763
                        loadDataStore = false;
764
                        super.loadFromState(state);
765
                        return;
766
                }
767
                
768
                try {
769
                        explorer.connect(new CancelTaskImpl());
770
                        explorer.getCoverageList();
771
                } catch (Exception e) {
772
                        loadDataStore = false;
773
                        super.loadFromState(state);
774
                        return;
775
                }
776
                
777
                loadDataStore = true;
778

779
                super.loadFromState(state);
780
                params = getDataStore().getParameters();
781
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
782
                try {
783
                        if(this.dataStore.isOpen())
784
                                enableOpen();
785
                } catch (NotAvailableStateException e) {
786
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
787
                }
788
                //getParameters().setCoverageName((String)state.get("name"));
789
        }*/
790

    
791
    /*@Override
792
        public void saveToState(PersistentState state) throws PersistenceException {
793
                super.saveToState(state);
794
                state.set("fullEnvelope", this.fullEnvelope);
795
                state.set("host", getParameters().getURI());
796
                state.set("name", getName());
797
        }*/
798
    
799
        /*public static void registerPersistent() {
800
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
801
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
802
                if( definition == null ) {
803
                        if (manager.getDefinition(FLyrDefault.class) == null) {
804
                                FLyrDefault.registerPersistent();
805
                        }
806

807
                        definition = manager.addDefinition(
808
                                        FLyrWCS.class,
809
                                        PERSISTENT_NAME,
810
                                        PERSISTENT_DESCRIPTION,
811
                                        null, 
812
                                        null
813
                        );
814
                        
815
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
816
                }
817

818
                DefaultFLyrRaster.registerPersistence(definition);
819
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
820
                definition.addDynFieldString("host").setMandatory(false);
821
                definition.addDynFieldString("name").setMandatory(false);
822
        }*/
823
        
824
        public static void registerPersistent() {
825
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
826
                DynStruct definition = manager.getDefinition("FLyrWCS_Persistent");
827
                if( definition == null ) {
828
                        if (manager.getDefinition(DefaultFLyrRaster.class) == null) {
829
                                DefaultFLyrRaster.registerPersistent();
830
                        }
831

    
832
                        definition = manager.addDefinition(
833
                                        FLyrWCS.class,
834
                                        "FLyrWCS_Persistent",
835
                                        "FLyrWCS Persistent Definition",
836
                                        null, 
837
                                        null
838
                        );
839
                        
840
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
841
                }
842

    
843
                DefaultFLyrRaster.registerPersistence(definition);
844
        }
845
}