Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wcs / branches / org.gvsig.raster.wcs_dataaccess_refactoring / org.gvsig.raster.wcs.app.wcsclient / src / main / java / org / gvsig / raster / wcs / app / wcsclient / layer / FLyrWCS.java @ 2308

History | View | Annotate | Download (34.7 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.Transparency;
79
import org.gvsig.fmap.dal.exception.DataException;
80
import org.gvsig.fmap.dal.exception.InitializeException;
81
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
82
import org.gvsig.fmap.dal.exception.ReadException;
83
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
84
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
85
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
86
import org.gvsig.fmap.geom.GeometryLocator;
87
import org.gvsig.fmap.geom.GeometryManager;
88
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
89
import org.gvsig.fmap.geom.primitive.Envelope;
90
import org.gvsig.fmap.mapcontext.ViewPort;
91
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
92
import org.gvsig.fmap.mapcontext.layers.FLayer;
93
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
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.WCSServerExplorer;
101
import org.gvsig.raster.wcs.io.WCSServerExplorerParameters;
102
import org.gvsig.tools.ToolsLocator;
103
import org.gvsig.tools.dynobject.DynObjectSet;
104
import org.gvsig.tools.dynobject.DynStruct;
105
import org.gvsig.tools.persistence.PersistenceManager;
106
import org.gvsig.tools.persistence.PersistentState;
107
import org.gvsig.tools.persistence.exception.PersistenceException;
108
import org.gvsig.tools.task.Cancellable;
109
import org.gvsig.tools.task.SimpleTaskStatus;
110
import org.gvsig.tools.task.TaskStatusManager;
111
import org.slf4j.Logger;
112
import org.slf4j.LoggerFactory;
113

    
114

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

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

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

    
156
    private boolean                                                 firstLoad                 = false;
157
    private Envelope                                         fullEnvelope              = null;
158
    private int                          callCount;
159
    private RasterManager                rManager                  = RasterLocator.getManager();
160
    private DataStoreParameters          params                    = null;
161
    private WCSServerExplorer            explorer                  = null;
162
    private boolean                      deleteCache               = false;
163

    
164
    @SuppressWarnings("unused")
165
    private class MyCancellable implements ICancellable {
166
        private Cancellable original;
167

    
168
        public MyCancellable(Cancellable cancelOriginal) {
169
            this.original = cancelOriginal;
170
        }
171

    
172
        public boolean isCanceled() {
173
            return original.isCanceled();
174
        }
175

    
176
        public Object getID() {
177
            return this;
178
        }
179
    }
180

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

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

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

    
221
        try {
222
            return dataman.openStore(params.getDataStoreName(), params);
223
        } catch (ValidateDataParametersException e) {
224
            throw new InitializeException(e);
225
        } catch (ProviderNotRegisteredException e) {
226
            throw new InitializeException(e);
227
        }
228
    }
229

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

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

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

    
262
        callCount = 0;  
263

    
264
        enableStopped();
265
        
266
        if(recalcLevel) {
267
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
268
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
269
                }
270
                recalcLevel = true;
271

    
272
        if (isWithinScale(scale)) {
273

    
274
            if(mustTileDraw) {
275
                Point2D p = viewPort.getOffset();
276
                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
277
                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
278
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
279

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

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

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

    
320
        // Compute the query geometry
321
        // 1. Check if it is within borders
322
        Envelope envelope = getFullEnvelope();
323
        Envelope vpEnv = vp.getAdjustedExtent();
324
        if (!vpEnv.intersects(envelope)) {
325
            return;
326
        }
327

    
328
        // 2. Compute extent to be requested.
329
        Rectangle2D bBox = new Rectangle2D.Double();
330
        Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
331
            getRectable2DFromEnvelope(envelope), bBox);
332

    
333
        // 3. Compute size in pixels
334
        double scalex = vp.getAffineTransform().getScaleX();
335
        double scaley = vp.getAffineTransform().getScaleY();
336
        int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
337
        int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
338

    
339
        Dimension sz = new Dimension(wImg, hImg);
340

    
341
        if ((wImg <= 0) || (hImg <= 0)) {
342
            return;
343
        }
344

    
345
        try {
346
            //Rectangle2D extent = new Rectangle2D.Double();
347
            //Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
348
            //Rectangle2D.intersect(vpExtent, bBox, extent);
349

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

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

    
402
    /**
403
     * Gets the explorer
404
     * @return
405
     */
406
    public WCSServerExplorer getExplorer() {
407
        return this.explorer;
408
    }
409

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

    
439
    private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
440
        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
441
            .getLength(0), env.getLength(1));
442
    }
443

    
444
    /**
445
     * Calcula el contenido del fichero de georreferenciaci?n de una imagen.
446
     * @param bBox Tama?o y posici?n de la imagen (en coordenadas de usuario)
447
     * @param sz Tama?o de la imagen en pixeles.
448
     * @return el 'WorldFile', como String.
449
     * @throws IOException
450
     */
451
    public String getDataWorldFile(Rectangle2D bBox, Dimension sz) throws IOException {
452
        StringBuffer data = new StringBuffer();
453
        data.append((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1) + "\n");
454
        data.append("0.0\n");
455
        data.append("0.0\n");
456
        data.append("-" + (bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1) + "\n");
457
        data.append("" + bBox.getMinX() + "\n");
458
        data.append("" + bBox.getMaxY() + "\n");
459
        return data.toString();
460
    }
461

    
462
    public FLayer cloneLayer() throws Exception {
463
        RasterDataStore  ds = dataStore.cloneDataStore();
464
        FLyrWCS layer = new FLyrWCS();
465
        layer.setName(getParameters().getCoverageName());
466
        layer.setOpenRasterStore(ds);
467
        layer.fullEnvelope = fullEnvelope;
468
        layer.params = params;
469
        layer.explorer = explorer;
470

    
471
        List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
472

    
473
        //Hacemos una copia de las bandas a renderizar
474
        if(getRender().getRenderBands() != null) {
475
            int[] rb = new int[getRender().getRenderBands().length];
476
            for (int i = 0; i < rb.length; i++)
477
                rb[i] = getRender().getRenderBands()[i];
478
            layer.getRender().setRenderBands(rb);
479
        }
480

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

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

    
493
        return layer;
494
    }
495

    
496
    public Transparency getRenderTransparency() {
497
        return getRender().getRenderingTransparency();
498
    }
499

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

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

    
521
        this.fullEnvelope = envelope;
522
        this.updateDrawVersion();
523
    }
524

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

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

    
547

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

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

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

    
573
    public boolean isTiled() {
574
        return mustTileDraw;
575
    }
576

    
577
    @SuppressWarnings("deprecation")
578
    @Override
579
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
580
        boolean fast) throws LoadLayerException, DataException {
581

    
582
        //try {
583
        ViewPort viewPort = getMapContext().getViewPort();
584

    
585
        Point tiledPoint = new Point((int) p.getX() % maxTilePrintWidth, (int) p.getY() % maxTilePrintHeight);
586
        Rectangle rect = new Rectangle(0, 0, viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
587
        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, rect);
588
        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
589
        int nCols = tiles.getNumCols();
590

    
591
        int col = (int) p.getX() / maxTilePrintWidth;
592
        int row = (int) p.getY() / maxTilePrintHeight;
593
        int tileIndex = (row * nCols) + col;
594

    
595
        ViewPort vp = null;
596
        try {
597
            vp = tiles.getTileViewPort(viewPort, tileIndex);
598
        } catch (NoninvertibleTransformException e1) {
599
            throw new LoadLayerException("", e1);
600
        }
601

    
602
        getParameters().setExtent(this.getRectable2DFromEnvelope(vp.getAdjustedExtent()));
603
        getParameters().setWidth(vp.getImageWidth());
604
        getParameters().setHeight(vp.getImageHeight());
605

    
606
        CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
607
        getParameters().setCancellable(cancellable);
608

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

    
623
    public boolean isActionEnabled(int action) {
624
        switch (action) {
625
        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
626
        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
627
        case IRasterLayerActions.BANDS_FILE_LIST:
628
        case IRasterLayerActions.GEOLOCATION:
629
        case IRasterLayerActions.PANSHARPENING:
630
        case IRasterLayerActions.SAVE_COLORINTERP:
631
            return false;
632
        case IRasterLayerActions.BANDS_RGB:
633
        case IRasterLayerActions.REMOTE_ACTIONS:
634
        case IRasterLayerActions.COLOR_TABLE:
635
            return true;
636
        }
637

    
638
        return super.isActionEnabled(action);
639
    }
640

    
641
    public boolean overviewsSupport() {
642
        return false;
643
    }
644

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

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

    
699
    /**
700
     * Sets the explorer
701
     * @param explorer
702
     */
703
    public void setExplorer(WCSServerExplorer explorer) {
704
        this.explorer = explorer;
705
    }
706
    
707
    /**
708
         * Assigns the flag to delete this layer from the cache
709
         * @param selected
710
         */
711
        public void deleteCache(boolean deleteCache) {
712
                this.deleteCache = deleteCache;
713
        }
714

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

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

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

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

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

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

829
                        definition = manager.addDefinition(
830
                                        FLyrWCS.class,
831
                                        PERSISTENT_NAME,
832
                                        PERSISTENT_DESCRIPTION,
833
                                        null, 
834
                                        null
835
                        );
836
                        
837
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
838
                }
839

840
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(true);
841
                definition.addDynFieldString("host").setMandatory(true);
842
                definition.addDynFieldBoolean("deleteCache").setMandatory(false);
843
                definition.addDynFieldString("time").setMandatory(false);
844
                definition.addDynFieldObject("maxres").setClassOfValue(Point2D.class).setMandatory(false);
845
                definition.addDynFieldString("parameter").setMandatory(false);
846
                definition.addDynFieldString("srsstr").setMandatory(false);
847
                definition.addDynFieldString("format").setMandatory(false);
848
                definition.addDynFieldString("name").setMandatory(false);
849
                definition.addDynFieldObject("extent").setClassOfValue(Rectangle2D.class).setMandatory(false);
850
                definition.addDynFieldInt("width").setMandatory(true);
851
                definition.addDynFieldInt("height").setMandatory(true);
852
                definition.addDynFieldBoolean("override").setMandatory(false);
853
                definition.addDynFieldMap("onlineResources").setClassOfItems(String.class).setMandatory(false);
854
                definition.addDynFieldString("depth").setMandatory(false);
855
        }*/
856
    
857
    /*
858
     * (non-Javadoc)
859
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
860
     */
861
        /*public void saveToState(PersistentState state) throws PersistenceException {
862
                super.saveToState(state);
863
                state.set("fullEnvelope", this.fullEnvelope);
864
                state.set("host", getParameters().getURI());
865
                state.set("time", getParameters().getTime());
866
                state.set("deleteCache", getParameters().isDeletingCache());
867
                state.set("maxres", getParameters().getMaxResolution());
868
                state.set("parameter", getParameters().getParameter());
869
                state.set("srsstr", getParameters().getSRSCode());
870
                state.set("format", getParameters().getFormat());
871
                state.set("name", getParameters().getCoverageName());
872
                state.set("extent", getParameters().getExtent());
873
                state.set("width", getParameters().getWidth());
874
                state.set("height", getParameters().getHeight());
875
                state.set("override", getParameters().isOverridingHost());
876
                state.set("onlineResources", getParameters().getOnlineResource());
877
                state.set("depth", getParameters().getDepth());
878
        }*/
879
    
880
        /*
881
         * (non-Javadoc)
882
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
883
         */
884
   /* public void loadFromState(PersistentState state)
885
        throws PersistenceException {
886
                super.loadFromState(state);
887

888
                this.fullEnvelope = (Envelope) state.get("fullExtent");
889
                getParameters().setURI(state.getString("host"));
890
                getParameters().setTime(state.getString("time"));
891
                getParameters().setFormat(state.getString("format"));
892
                getParameters().deleteCache(state.getBoolean("deleteCache"));
893
                getParameters().setMaxResolution((Point2D)state.get("maxres"));
894
                getParameters().setParameter(state.getString("parameter"));
895
                getParameters().setSRS(state.getString("srsstr"));
896
                getParameters().setFormat(state.getString("format"));
897
                getParameters().setCoverageName(state.getString("name"));
898
                getParameters().setExtent((Rectangle2D)state.get("extent"));
899
                getParameters().setWidth(state.getInt("width"));
900
                getParameters().setHeight(state.getInt("height"));
901
                getParameters().setOverrideHost(state.getBoolean("override"));
902
                getParameters().setOnlineResources(new Hashtable(state.getMap("onlineResources")));
903
                getParameters().setDepth(state.getString("depth"));
904
        }*/
905
}