Statistics
| Revision:

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

History | View | Annotate | Download (35 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.ArrayList;
54
import java.util.HashMap;
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.InvalidSetViewException;
71
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
72
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
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.GeometryLocator;
86
import org.gvsig.fmap.geom.GeometryManager;
87
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
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.slf4j.Logger;
110
import org.slf4j.LoggerFactory;
111

    
112

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

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

    
166
        public MyCancellable(Cancellable cancelOriginal) {
167
            this.original = cancelOriginal;
168
        }
169

    
170
        public boolean isCanceled() {
171
            return original.isCanceled();
172
        }
173

    
174
        public Object getID() {
175
            return this;
176
        }
177
    }
178

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

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

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

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

    
228
    /*
229
     * (non-Javadoc)
230
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#setDataStore(org.gvsig.fmap.dal.DataStore)
231
     */
232
    public void setDataStore(DataStore dataStore) throws LoadLayerException {
233
        this.dataStore = (RasterDataStore) dataStore;
234
        try {
235
            if(this.dataStore.isOpen())
236
                enableOpen();
237
        } catch (NotAvailableStateException e) {
238
            logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
239
        }
240
        setProjection(this.dataStore.getProjection());
241
    }
242

    
243
    /*
244
     *  (non-Javadoc)
245
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.operations.Cancellable, double)
246
     */
247
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale) throws ReadException {
248
        CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
249

    
250
        if(!firstLoad) {
251
            try {
252
                initFilters();
253
            } catch (FilePaletteException e) {
254
                logger.error(e.getMessage(), this, e);
255
            }
256
            firstLoad = true;
257
        }
258

    
259
        callCount = 0;  
260

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

    
269
        if (isWithinScale(scale)) {
270

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

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

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

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

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

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

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

    
336
        Dimension sz = new Dimension(wImg, hImg);
337

    
338
        if ((wImg <= 0) || (hImg <= 0)) {
339
            return;
340
        }
341

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

    
347
            Extent ex = rManager.getDataStructFactory().createExtent(
348
                vp.getAdjustedEnvelope().getMinimum(0), 
349
                vp.getAdjustedEnvelope().getMaximum(1), 
350
                vp.getAdjustedEnvelope().getMaximum(0), 
351
                vp.getAdjustedEnvelope().getMinimum(1));
352
            ViewPortData vpData = rManager.createViewPortData(vp.getProjection(), ex, sz );
353
            vpData.setMat(vp.getAffineTransform());
354

    
355
            try {
356
                getParameters().setExtent(bBox);
357
                getParameters().setWidth(wImg);
358
                getParameters().setHeight(hImg);
359
                getParameters().setCancellable(cancel);
360
                if(params instanceof WCSDataParameters)
361
                                        getRender().draw(g, vpData);
362
                                else
363
                                        getRender().drawTiledService(g, vpData, vp.getImageSize());
364
            } catch (RasterDriverException e) {
365
                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
366
            } catch (InvalidSetViewException e) {
367
                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
368
            } catch (ProcessInterruptedException e) {
369
            }
370

    
371
        } catch (RemoteServiceException e) {
372
            if (!cancel.isCanceled()) {
373
                if (callCount < MAX_RETRY_TIMES) {
374
                    logger.warn("\n[ FLyrWCS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
375
                    drawTile(g, vp, cancel, scale);
376
                } else {
377
                    if (!isPrinting) {
378
                        this.setVisible(false);
379
                    }
380
                    throw new LoadLayerException(getName(), e);
381
                }
382
            }
383
        }
384
        callCount--;
385
        return;
386
    }
387

    
388
    /**
389
     * Gets the explorer
390
     * @return
391
     */
392
    public WCSServerExplorer getExplorer() {
393
        return this.explorer;
394
    }
395

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

    
425
    private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
426
        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
427
            .getLength(0), env.getLength(1));
428
    }
429

    
430
    /**
431
     * Calcula el contenido del fichero de georreferenciaci?n de una imagen.
432
     * @param bBox Tama?o y posici?n de la imagen (en coordenadas de usuario)
433
     * @param sz Tama?o de la imagen en pixeles.
434
     * @return el 'WorldFile', como String.
435
     * @throws IOException
436
     */
437
    public String getDataWorldFile(Rectangle2D bBox, Dimension sz) throws IOException {
438
        StringBuffer data = new StringBuffer();
439
        data.append((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1) + "\n");
440
        data.append("0.0\n");
441
        data.append("0.0\n");
442
        data.append("-" + (bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1) + "\n");
443
        data.append("" + bBox.getMinX() + "\n");
444
        data.append("" + bBox.getMaxY() + "\n");
445
        return data.toString();
446
    }
447

    
448
    /*
449
     * (non-Javadoc)
450
     * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#cloneLayer()
451
     */
452
    public FLayer cloneLayer() throws Exception {
453
        RasterDataStore  ds = dataStore.cloneDataStore();
454
        FLyrWCS layer = new FLyrWCS();
455
        layer.setName(getParameters().getCoverageName());
456
        layer.setOpenRasterStore(ds);
457
        layer.fullEnvelope = fullEnvelope;
458
        layer.params = params;
459
        layer.explorer = explorer;
460

    
461
        ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
462

    
463
        //Hacemos una copia de las bandas a renderizar
464
        if(getRender().getRenderBands() != null) {
465
            int[] rb = new int[getRender().getRenderBands().length];
466
            for (int i = 0; i < rb.length; i++)
467
                rb[i] = getRender().getRenderBands()[i];
468
            layer.getRender().setRenderBands(rb);
469
        }
470

    
471
        //Asignamos el entorno
472
        if(layer.getRender().getFilterList() == null)
473
            layer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
474
        layer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
475
        layer.getRender().getFilterList().setStatus(filters);
476

    
477
        // Asignamos los valores noData del original
478
        layer.setNoDataValue(getNoDataValue());
479
        if(dataStore.getNoDataValue().isDefined())
480
                layer.setNoDataTransparent(true);
481
        layer.enableOpen();
482

    
483
        return layer;
484
    }
485

    
486
    public Transparency getRenderTransparency() {
487
        return getRender().getLastTransparency();
488
    }
489

    
490
    /*
491
     * (non-Javadoc)
492
     * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#print(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.utiles.swing.threads.Cancellable, double, javax.print.attribute.PrintRequestAttributeSet)
493
     */
494
    public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties) throws ReadException {
495
        if (isVisible() && isWithinScale(scale)){
496
            draw(null, g, viewPort, cancel, scale);
497
        }
498
    }
499

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

    
515
        this.fullEnvelope = envelope;
516
        this.updateDrawVersion();
517
    }
518

    
519
    /**
520
     * Sets the layer's full extent.
521
     *
522
     * Establece la extensi?n m?xima de la capa.
523
     *
524
     * @param rect
525
     */
526
    public void setFullExtent(Rectangle2D fullExtent) {
527
        this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
528
    }
529

    
530
    private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
531
        try {
532
            return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
533
                rect.getMaxX(), rect.getMaxY(),
534
                SUBTYPES.GEOM2D);
535
        } catch (CreateEnvelopeException e) {
536
            logger.error("Error creating the envelope", e);
537
        }
538
        return null;
539
    }
540

    
541

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

    
558
    /*
559
     *  (non-Javadoc)
560
     * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
561
     */
562
    public int[] getTileSize() {
563
        int[] size = {maxTileDrawWidth, maxTileDrawHeight};
564
        return size;
565
    }
566

    
567
    /*
568
     * (non-Javadoc)
569
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#getTocImageIcon()
570
     */
571
    public String getTocImageIcon() {
572
        return "icon-layer-wcs";
573
    }
574

    
575
    /*
576
     *  (non-Javadoc)
577
     * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
578
     */
579
    public boolean isTiled() {
580
        return mustTileDraw;
581
    }
582

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

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

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

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

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

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

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

    
615
        String fInfo;
616
        try {
617
            fInfo = getDataStore().getInfoByPoint(tiledPoint.getX(), tiledPoint.getY(), cancellable);
618
        } catch (RemoteServiceException e) {
619
            throw new LoadLayerException("Error in getInfoByPoint", e);
620
        }
621
        return new DynObjectSetWCSInfo(fInfo, DynObjectSetWCSInfo.TYPE_TEXT);
622
    }
623
    
624
        /*
625
         * (non-Javadoc)
626
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
627
         */
628
        @Override
629
        public String getFileFormat() {
630
                return "WCS";
631
        }
632

    
633
    /*
634
     * (non-Javadoc)
635
     * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
636
     */
637
    public boolean isActionEnabled(int action) {
638
        switch (action) {
639
        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
640
        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
641
        case IRasterLayerActions.BANDS_FILE_LIST:
642
        case IRasterLayerActions.GEOLOCATION:
643
        case IRasterLayerActions.PANSHARPENING:
644
        case IRasterLayerActions.SAVE_COLORINTERP:
645
            return false;
646
        case IRasterLayerActions.BANDS_RGB:
647
        case IRasterLayerActions.REMOTE_ACTIONS:
648
        case IRasterLayerActions.COLOR_TABLE:
649
            return true;
650
        }
651

    
652
        return super.isActionEnabled(action);
653
    }
654

    
655
    /*
656
     * (non-Javadoc)
657
     * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
658
     */
659
    public boolean overviewsSupport() {
660
        return false;
661
    }
662

    
663
    /*
664
     * (non-Javadoc)
665
     * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
666
     */
667
    public org.gvsig.fmap.dal.coverage.datastruct.Extent getFullRasterExtent() {
668
        Envelope env = getFullEnvelope();
669
        double minx = env.getMinimum(0);
670
        double miny = env.getMinimum(1);
671
        double maxx = env.getMaximum(0);
672
        double maxy = env.getMaximum(1);
673
        Point2D ul = new Point2D.Double(minx, maxy);
674
        Point2D ur = new Point2D.Double(maxx, maxy);
675
        Point2D ll = new Point2D.Double(minx, miny);
676
        Point2D lr = new Point2D.Double(maxx, miny);
677
        return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
678
    }
679

    
680
    @SuppressWarnings("deprecation")
681
    public WCSDataParameters getParameters() {
682
        if(params == null) {
683
            DataManager datamanager = DALLocator.getDataManager();
684
            WCSServerExplorerParameters explorerParams = null;
685
            try {
686
                explorerParams = (WCSServerExplorerParameters) datamanager.createServerExplorerParameters(WCSServerExplorer.NAME);
687
                explorerParams.setHost("");
688
                explorer = (WCSServerExplorer) datamanager.createServerExplorer(explorerParams);
689
                DataStoreParameters parameters = explorer.getStoreParameters();
690
                if(parameters instanceof WCSDataParameters) {
691
                    params = (WCSDataParameters) parameters;
692
                }
693
            } catch (InitializeException e) {
694
            } catch (ProviderNotRegisteredException e) {
695
            } catch (ValidateDataParametersException e) {
696
            }
697
        }
698
        return getWCSParameters(params);
699
    }
700
    
701
    /**
702
     * Gets <code>WCSDataParameters</code>
703
     * @param parameters
704
     * @return
705
     */
706
    private WCSDataParameters getWCSParameters(DataStoreParameters parameters) {
707
            WCSDataParameters params = null;
708
            if(parameters instanceof WCSDataParameters) {
709
                        params = (WCSDataParameters) parameters;
710
                }
711
                
712
                if(parameters instanceof TileDataParameters) {
713
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
714
                        if(p instanceof WCSDataParameters) {
715
                                params = (WCSDataParameters) p;
716
                        }
717
                }
718
                return params;
719
    }
720

    
721
    /**
722
     * Sets the explorer
723
     * @param explorer
724
     */
725
    public void setExplorer(WCSServerExplorer explorer) {
726
        this.explorer = explorer;
727
    }
728
    
729
    /**
730
         * Assigns the flag to delete this layer from the cache
731
         * @param selected
732
         */
733
        public void deleteCache(boolean deleteCache) {
734
                this.deleteCache = deleteCache;
735
        }
736

    
737
    /**
738
     * Sets the data store parameters
739
     * @param params
740
     * @throws InitializeException
741
     */
742
    public void setParameters(DataStoreParameters params) throws InitializeException {
743
        this.params = params;
744
        
745
        if(params instanceof TileDataParameters) {
746
                        ((TileDataParameters)params).deleteCache(deleteCache);
747
                }
748
        
749
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
750
        try {
751
            DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
752
            this.setDataStore(dStore);
753

    
754
                        if(params instanceof WCSDataParameters) {
755
                                this.setName((String)((WCSDataParameters)params).getURI());
756
                        }
757
                        
758
                        if(params instanceof TileDataParameters) {
759
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
760
                                if(p instanceof WCSDataParameters) {
761
                                        this.setName((String)((WCSDataParameters) p).getURI());
762
                                }
763
                        }
764
        } catch (ValidateDataParametersException e) {
765
            throw new InitializeException(e);
766
        } catch (ProviderNotRegisteredException e) {
767
            throw new InitializeException(e);
768
        } catch (InitializeException e) {
769
            throw new InitializeException(e);
770
        } catch (LoadLayerException e) {
771
            throw new InitializeException(e);
772
        }
773
    }
774
    
775
        /*
776
         * (non-Javadoc)
777
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
778
         */
779
        @Override
780
        public void loadFromState(PersistentState state)
781
        throws PersistenceException {
782
                String host = state.getString("host");
783
                try {
784
                        getParameters();
785
                        WCSServerExplorerParameters params = (WCSServerExplorerParameters)explorer.getParameters();
786
                        params.setHost(host);
787
                        explorer.connect(new CancelTaskImpl());
788
                        explorer.getCoverageList();
789
                } catch (Exception e) {
790
                        throw new PersistenceException("Server comunication error", e);
791
                }
792

    
793
                super.loadFromState(state);
794
                params = getDataStore().getParameters();
795
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
796
                //getParameters().setCoverageName((String)state.get("name"));
797
        }
798

    
799
        /*
800
         * (non-Javadoc)
801
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
802
         */
803
        @Override
804
        public void saveToState(PersistentState state) throws PersistenceException {
805
                super.saveToState(state);
806
                state.set("fullEnvelope", this.fullEnvelope);
807
                state.set("host", getParameters().getURI());
808
                state.set("name", getName());
809
        }
810
    
811
        public static void registerPersistent() {
812
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
813
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
814
                if( definition == null ) {
815
                        if (manager.getDefinition(FLyrDefault.class) == null) {
816
                                FLyrDefault.registerPersistent();
817
                        }
818

    
819
                        definition = manager.addDefinition(
820
                                        FLyrWCS.class,
821
                                        PERSISTENT_NAME,
822
                                        PERSISTENT_DESCRIPTION,
823
                                        null, 
824
                                        null
825
                        );
826
                        
827
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
828
                }
829

    
830
                DefaultFLyrRaster.registerPersistence(definition);
831
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
832
                definition.addDynFieldString("host").setMandatory(false);
833
                definition.addDynFieldString("name").setMandatory(false);
834
        }
835
    
836
   /* public static void registerPersistent() {
837
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
838
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
839
                if( definition == null ) {
840
                        if (manager.getDefinition(DefaultFLyrRaster.class) == null) {
841
                                DefaultFLyrRaster.registerPersistence();
842
                        }
843

844
                        definition = manager.addDefinition(
845
                                        FLyrWCS.class,
846
                                        PERSISTENT_NAME,
847
                                        PERSISTENT_DESCRIPTION,
848
                                        null, 
849
                                        null
850
                        );
851
                        
852
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
853
                }
854

855
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(true);
856
                definition.addDynFieldString("host").setMandatory(true);
857
                definition.addDynFieldBoolean("deleteCache").setMandatory(false);
858
                definition.addDynFieldString("time").setMandatory(false);
859
                definition.addDynFieldObject("maxres").setClassOfValue(Point2D.class).setMandatory(false);
860
                definition.addDynFieldString("parameter").setMandatory(false);
861
                definition.addDynFieldString("srsstr").setMandatory(false);
862
                definition.addDynFieldString("format").setMandatory(false);
863
                definition.addDynFieldString("name").setMandatory(false);
864
                definition.addDynFieldObject("extent").setClassOfValue(Rectangle2D.class).setMandatory(false);
865
                definition.addDynFieldInt("width").setMandatory(true);
866
                definition.addDynFieldInt("height").setMandatory(true);
867
                definition.addDynFieldBoolean("override").setMandatory(false);
868
                definition.addDynFieldMap("onlineResources").setClassOfItems(String.class).setMandatory(false);
869
                definition.addDynFieldString("depth").setMandatory(false);
870
        }*/
871
    
872
    /*
873
     * (non-Javadoc)
874
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
875
     */
876
        /*public void saveToState(PersistentState state) throws PersistenceException {
877
                super.saveToState(state);
878
                state.set("fullEnvelope", this.fullEnvelope);
879
                state.set("host", getParameters().getURI());
880
                state.set("time", getParameters().getTime());
881
                state.set("deleteCache", getParameters().isDeletingCache());
882
                state.set("maxres", getParameters().getMaxResolution());
883
                state.set("parameter", getParameters().getParameter());
884
                state.set("srsstr", getParameters().getSRSCode());
885
                state.set("format", getParameters().getFormat());
886
                state.set("name", getParameters().getCoverageName());
887
                state.set("extent", getParameters().getExtent());
888
                state.set("width", getParameters().getWidth());
889
                state.set("height", getParameters().getHeight());
890
                state.set("override", getParameters().isOverridingHost());
891
                state.set("onlineResources", getParameters().getOnlineResource());
892
                state.set("depth", getParameters().getDepth());
893
        }*/
894
    
895
        /*
896
         * (non-Javadoc)
897
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
898
         */
899
   /* public void loadFromState(PersistentState state)
900
        throws PersistenceException {
901
                super.loadFromState(state);
902

903
                this.fullEnvelope = (Envelope) state.get("fullExtent");
904
                getParameters().setURI(state.getString("host"));
905
                getParameters().setTime(state.getString("time"));
906
                getParameters().setFormat(state.getString("format"));
907
                getParameters().deleteCache(state.getBoolean("deleteCache"));
908
                getParameters().setMaxResolution((Point2D)state.get("maxres"));
909
                getParameters().setParameter(state.getString("parameter"));
910
                getParameters().setSRS(state.getString("srsstr"));
911
                getParameters().setFormat(state.getString("format"));
912
                getParameters().setCoverageName(state.getString("name"));
913
                getParameters().setExtent((Rectangle2D)state.get("extent"));
914
                getParameters().setWidth(state.getInt("width"));
915
                getParameters().setHeight(state.getInt("height"));
916
                getParameters().setOverrideHost(state.getBoolean("override"));
917
                getParameters().setOnlineResources(new Hashtable(state.getMap("onlineResources")));
918
                getParameters().setDepth(state.getString("depth"));
919
        }*/
920
}