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

History | View | Annotate | Download (28.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.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.Tiling;
94
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
95
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
96
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
97
import org.gvsig.raster.util.CancelTaskImpl;
98
import org.gvsig.raster.wcs.io.WCSDataParameters;
99
import org.gvsig.raster.wcs.io.WCSServerExplorer;
100
import org.gvsig.raster.wcs.io.WCSServerExplorerParameters;
101
import org.gvsig.tools.dynobject.DynObjectSet;
102
import org.gvsig.tools.task.Cancellable;
103
import org.slf4j.Logger;
104
import org.slf4j.LoggerFactory;
105

    
106

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

    
138
    private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
139
    private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWCS.class);
140
    private boolean                                          isPrinting                = false;
141

    
142
    private boolean                                          mustTileDraw              = false;
143
    private int                                                  maxTileDrawWidth          = 1023;
144
    private int                                                         maxTileDrawHeight         = 1023;
145
    private final int                                          maxTilePrintWidth         = 1023;
146
    private final int                                          maxTilePrintHeight        = 1023;
147

    
148
    private boolean                                                 firstLoad                 = false;
149
    private Envelope                                         fullEnvelope              = null;
150
    private int                          callCount;
151
    private RasterManager                rManager                  = RasterLocator.getManager();
152
    private DataStoreParameters          params                    = null;
153
    private WCSServerExplorer            explorer                  = null;
154
    private boolean                      deleteCache               = false;
155

    
156
    @SuppressWarnings("unused")
157
    private class MyCancellable implements ICancellable {
158
        private Cancellable original;
159

    
160
        public MyCancellable(Cancellable cancelOriginal) {
161
            this.original = cancelOriginal;
162
        }
163

    
164
        public boolean isCanceled() {
165
            return original.isCanceled();
166
        }
167

    
168
        public Object getID() {
169
            return this;
170
        }
171
    }
172

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

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

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

    
213
        try {
214
            return dataman.openStore(params.getDataStoreName(), params);
215
        } catch (ValidateDataParametersException e) {
216
            throw new InitializeException(e);
217
        } catch (ProviderNotRegisteredException e) {
218
            throw new InitializeException(e);
219
        }
220
    }
221

    
222
    /*
223
     * (non-Javadoc)
224
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#setDataStore(org.gvsig.fmap.dal.DataStore)
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
    /*
238
     *  (non-Javadoc)
239
     * @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)
240
     */
241
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale) throws ReadException {
242
        CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
243

    
244
        if(!firstLoad) {
245
            try {
246
                initFilters();
247
            } catch (FilePaletteException e) {
248
                logger.error(e.getMessage(), this, e);
249
            }
250
            firstLoad = true;
251
        }
252

    
253
        callCount = 0;  
254

    
255
        enableStopped();
256
        
257
        if(recalcLevel) {
258
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
259
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
260
                }
261
                recalcLevel = true;
262

    
263
        if (isWithinScale(scale)) {
264

    
265
            if(mustTileDraw) {
266
                Point2D p = viewPort.getOffset();
267
                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
268
                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
269
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
270

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

    
292
        /*Runtime r = Runtime.getRuntime();
293
                System.err.println("********************WCS**********************");
294
                System.err.println("Memoria Total: " + (r.totalMemory() / 1024) +"KB");
295
                System.err.println("Memoria Usada: " + ((r.totalMemory() - r.freeMemory()) / 1024) +"KB");
296
                System.err.println("Memoria Libre: " + (r.freeMemory() / 1024) +"KB");
297
                System.err.println("Memoria MaxMemory: " + (r.maxMemory() / 1024) +"KB");
298
                System.err.println("*********************************************");*/
299
    }
300

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

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

    
319
        // 2. Compute extent to be requested.
320
        Rectangle2D bBox = new Rectangle2D.Double();
321
        Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
322
            getRectable2DFromEnvelope(envelope), bBox);
323

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

    
330
        Dimension sz = new Dimension(wImg, hImg);
331

    
332
        if ((wImg <= 0) || (hImg <= 0)) {
333
            return;
334
        }
335

    
336
        try {
337
            //Rectangle2D extent = new Rectangle2D.Double();
338
            //Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
339
            //Rectangle2D.intersect(vpExtent, bBox, extent);
340

    
341
            Extent ex = rManager.getDataStructFactory().createExtent(
342
                vp.getAdjustedEnvelope().getMinimum(0), 
343
                vp.getAdjustedEnvelope().getMaximum(1), 
344
                vp.getAdjustedEnvelope().getMaximum(0), 
345
                vp.getAdjustedEnvelope().getMinimum(1));
346
            ViewPortData vpData = rManager.createViewPortData(vp.getProjection(), ex, sz );
347
            vpData.setMat(vp.getAffineTransform());
348

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

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

    
382
    /**
383
     * Gets the explorer
384
     * @return
385
     */
386
    public WCSServerExplorer getExplorer() {
387
        return this.explorer;
388
    }
389

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

    
419
    private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
420
        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
421
            .getLength(0), env.getLength(1));
422
    }
423

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

    
442
    /*
443
     * (non-Javadoc)
444
     * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#cloneLayer()
445
     */
446
    public FLayer cloneLayer() throws Exception {
447
        RasterDataStore  ds = dataStore.cloneDataStore();
448
        FLyrWCS layer = new FLyrWCS();
449
        layer.setName(getParameters().getCoverageName());
450
        layer.setOpenRasterStore(ds);
451
        layer.fullEnvelope = fullEnvelope;
452
        layer.params = params;
453
        layer.explorer = explorer;
454

    
455
        ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
456

    
457
        //Hacemos una copia de las bandas a renderizar
458
        if(getRender().getRenderBands() != null) {
459
            int[] rb = new int[getRender().getRenderBands().length];
460
            for (int i = 0; i < rb.length; i++)
461
                rb[i] = getRender().getRenderBands()[i];
462
            layer.getRender().setRenderBands(rb);
463
        }
464

    
465
        //Asignamos el entorno
466
        if(layer.getRender().getFilterList() == null)
467
            layer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
468
        layer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
469
        layer.getRender().getFilterList().setStatus(filters);
470

    
471
        // Asignamos los valores noData del original
472
        layer.setNoDataValue(getNoDataValue());
473
        layer.setNoDataType(getNoDataType());
474
        layer.applyNoData();
475
        layer.enableOpen();
476

    
477
        return layer;
478
    }
479

    
480
    public Transparency getRenderTransparency() {
481
        return getRender().getLastTransparency();
482
    }
483

    
484
    /*
485
     * (non-Javadoc)
486
     * @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)
487
     */
488
    public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties) throws ReadException {
489
        if (isVisible() && isWithinScale(scale)){
490
            draw(null, g, viewPort, cancel, scale);
491
        }
492
    }
493

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

    
509
        this.fullEnvelope = envelope;
510
        this.updateDrawVersion();
511
    }
512

    
513
    /**
514
     * Sets the layer's full extent.
515
     *
516
     * Establece la extensi?n m?xima de la capa.
517
     *
518
     * @param rect
519
     */
520
    public void setFullExtent(Rectangle2D fullExtent) {
521
        this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
522
    }
523

    
524
    private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
525
        try {
526
            return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
527
                rect.getMaxX(), rect.getMaxY(),
528
                SUBTYPES.GEOM2D);
529
        } catch (CreateEnvelopeException e) {
530
            logger.error("Error creating the envelope", e);
531
        }
532
        return null;
533
    }
534

    
535

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

    
552
    /*
553
     *  (non-Javadoc)
554
     * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
555
     */
556
    public int[] getTileSize() {
557
        int[] size = {maxTileDrawWidth, maxTileDrawHeight};
558
        return size;
559
    }
560

    
561
    /*
562
     * (non-Javadoc)
563
     * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#getTocImageIcon()
564
     */
565
    public String getTocImageIcon() {
566
        return "icon-layer-wcs";
567
    }
568

    
569
    /*
570
     *  (non-Javadoc)
571
     * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
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 (RemoteServiceException e) {
613
            throw new LoadLayerException("Error in getInfoByPoint", e);
614
        }
615
        return new DynObjectSetWCSInfo(fInfo, DynObjectSetWCSInfo.TYPE_TEXT);
616
    }
617

    
618
    /*
619
     * (non-Javadoc)
620
     * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
621
     */
622
    public boolean isActionEnabled(int action) {
623
        switch (action) {
624
        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
625
        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
626
        case IRasterLayerActions.BANDS_FILE_LIST:
627
        case IRasterLayerActions.GEOLOCATION:
628
        case IRasterLayerActions.PANSHARPENING:
629
        case IRasterLayerActions.SAVE_COLORINTERP:
630
            return false;
631
        case IRasterLayerActions.BANDS_RGB:
632
        case IRasterLayerActions.REMOTE_ACTIONS:
633
        case IRasterLayerActions.COLOR_TABLE:
634
            return true;
635
        }
636

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

    
640
    /*
641
     * (non-Javadoc)
642
     * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
643
     */
644
    public boolean overviewsSupport() {
645
        return false;
646
    }
647

    
648
    /*
649
     * (non-Javadoc)
650
     * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
651
     */
652
    public org.gvsig.fmap.dal.coverage.datastruct.Extent getFullRasterExtent() {
653
        Envelope env = getFullEnvelope();
654
        double minx = env.getMinimum(0);
655
        double miny = env.getMinimum(1);
656
        double maxx = env.getMaximum(0);
657
        double maxy = env.getMaximum(1);
658
        Point2D ul = new Point2D.Double(minx, maxy);
659
        Point2D ur = new Point2D.Double(maxx, maxy);
660
        Point2D ll = new Point2D.Double(minx, miny);
661
        Point2D lr = new Point2D.Double(maxx, miny);
662
        return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
663
    }
664

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

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

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

    
739
                        if(params instanceof WCSDataParameters) {
740
                                this.setName((String)((WCSDataParameters)params).getURI());
741
                        }
742
                        
743
                        if(params instanceof TileDataParameters) {
744
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
745
                                if(p instanceof WCSDataParameters) {
746
                                        this.setName((String)((WCSDataParameters) p).getURI());
747
                                }
748
                        }
749
        } catch (ValidateDataParametersException e) {
750
            throw new InitializeException(e);
751
        } catch (ProviderNotRegisteredException e) {
752
            throw new InitializeException(e);
753
        } catch (InitializeException e) {
754
            throw new InitializeException(e);
755
        } catch (LoadLayerException e) {
756
            throw new InitializeException(e);
757
        }
758
    }
759
}