Statistics
| Revision:

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

History | View | Annotate | Download (31.4 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.net.URI;
54
import java.net.URISyntaxException;
55
import java.util.HashMap;
56
import java.util.List;
57

    
58
import javax.print.attribute.PrintRequestAttributeSet;
59

    
60
import org.cresques.cts.IProjection;
61

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

    
114
import org.slf4j.Logger;
115
import org.slf4j.LoggerFactory;
116

    
117

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

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

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

    
158
    private boolean                                                 firstLoad                 = false;
159
    private Envelope                                         fullEnvelope              = null;
160
    private int                          callCount;
161
    private RasterManager                rManager                  = RasterLocator.getManager();
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(WCSProvider.NAME);
197
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));
198
        WCSServerExplorer wmsServerExplorer =
199
            (WCSServerExplorer) dataManager.openServerExplorer(WCSProvider.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(WCSProvider.NAME);
213
        } catch (InitializeException e) {
214
            return null;
215
        } catch (ProviderNotRegisteredException e) {
216
            return null;
217
        }
218
        URI uriHost;
219
        try {
220
            uriHost = new URI(host);
221
        } catch (URISyntaxException e1) {
222
            throw new InitializeException(e1);
223
        }
224
        params.setURI(uriHost);
225
        params.setSRS(srs);
226

    
227
        try {
228
            return dataman.openStore(params.getDataStoreName(), params);
229
        } catch (ValidateDataParametersException e) {
230
            throw new InitializeException(e);
231
        } catch (ProviderNotRegisteredException e) {
232
            throw new InitializeException(e);
233
        }
234
    }
235

    
236
    public void setDataStore(DataStore dataStore) throws LoadLayerException {
237
        this.dataStore = (RasterDataStore) dataStore;
238
        try {
239
            if(this.dataStore.isOpen())
240
                enableOpen();
241
        } catch (NotAvailableStateException e) {
242
            logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
243
        }
244
        setProjection(this.dataStore.getProjection());
245
    }
246

    
247
    public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale) throws ReadException {
248
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
249
                SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
250
                manager.add(taskStatus);
251
                taskStatus.setAutoremove(true);
252

    
253
        if(!firstLoad) {
254
            try {
255
                initFilters();
256
                try {
257
                                        if(!isOpen())
258
                                                enableOpen();
259
                                } catch (NotAvailableStateException e) {
260
                                        throw new ReadException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e);
261
                                }
262
            } catch (FilePaletteException e) {
263
                logger.error(e.getMessage(), this, e);
264
            }
265
            firstLoad = true;
266
        }
267

    
268
        callCount = 0;
269

    
270
        enableStopped();
271

    
272
        if(recalcLevel) {
273
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
274
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
275
                }
276
                recalcLevel = true;
277

    
278
        if (isWithinScale(scale)) {
279

    
280
            if(mustTileDraw) {
281
                Point2D p = viewPort.getOffset();
282
                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
283
                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
284
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
285

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

    
307
        /*Runtime r = Runtime.getRuntime();
308
                System.err.println("********************WCS**********************");
309
                System.err.println("Memoria Total: " + (r.totalMemory() / 1024) +"KB");
310
                System.err.println("Memoria Usada: " + ((r.totalMemory() - r.freeMemory()) / 1024) +"KB");
311
                System.err.println("Memoria Libre: " + (r.freeMemory() / 1024) +"KB");
312
                System.err.println("Memoria MaxMemory: " + (r.maxMemory() / 1024) +"KB");
313
                System.err.println("*********************************************");*/
314
    }
315

    
316
    /**
317
     * This is the method used to draw a tile in a WCS mosaic layer.
318
     * @throws LoadLayerException
319
     * @throws ReadDriverException
320
     * @return true when a tile has been painted
321
     */
322
    private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
323
        callCount++;
324

    
325
        // Compute the query geometry
326
        // 1. Check if it is within borders
327
        Envelope envelope = getFullEnvelope();
328
        Envelope vpEnv = vp.getAdjustedExtent();
329
        if (!vpEnv.intersects(envelope)) {
330
            return;
331
        }
332

    
333
        // 2. Compute extent to be requested.
334
        Rectangle2D bBox = new Rectangle2D.Double();
335
        Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
336
            getRectable2DFromEnvelope(envelope), bBox);
337

    
338
        // 3. Compute size in pixels
339
        double scalex = vp.getAffineTransform().getScaleX();
340
        double scaley = vp.getAffineTransform().getScaleY();
341
        int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
342
        int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
343

    
344
        Dimension sz = new Dimension(wImg, hImg);
345

    
346
        if ((wImg <= 0) || (hImg <= 0)) {
347
            return;
348
        }
349

    
350
        try {
351
            //Rectangle2D extent = new Rectangle2D.Double();
352
            //Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
353
            //Rectangle2D.intersect(vpExtent, bBox, extent);
354

    
355
            Extent ex = rManager.getDataStructFactory().createExtent(
356
                vp.getAdjustedEnvelope().getMinimum(0),
357
                vp.getAdjustedEnvelope().getMaximum(1),
358
                vp.getAdjustedEnvelope().getMaximum(0),
359
                vp.getAdjustedEnvelope().getMinimum(1));
360
            ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), ex, sz );
361
            vpData.setMat(vp.getAffineTransform());
362
            vpData.setDPI((int)vp.getDPI());
363

    
364
            try {
365
                getParameters().setExtent(bBox);
366
                getParameters().setWidth(wImg);
367
                getParameters().setHeight(hImg);
368
                if(getDataStore().getParameters() instanceof WCSDataParameters) {
369
                                        getRender().draw(g, vpData, taskStatus);
370
                } else {
371
                        Envelope adjustedExtent = vp.getAdjustedExtent();
372
                                        Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
373
                                                        adjustedExtent.getUpperCorner().getY(), adjustedExtent.getUpperCorner().getX(),
374
                                                        adjustedExtent.getLowerCorner().getY());
375
                                        ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), e, vp.getImageSize() );
376
                                        vp2.setMat(vp.getAffineTransform());
377
                                        vp2.setDPI((int)vp.getDPI());
378
                                        getParameters().setExtent(ex.toRectangle2D());
379
                                        getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
380
                }
381
            /*} catch (RasterDriverException e) {
382
                    setAvailable(false);
383
                                JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
384
                                logger.info("Problems drawing this layer:" + e.getMessage(), e);*/
385
            } catch (ProcessInterruptedException e) {
386
            } catch (QueryException e) {
387
                    throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
388
                        } finally {
389
                    taskStatus.terminate();
390
            }
391

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

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

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

    
443

    
444
    /**
445
     * Gets the explorer
446
     * @return
447
     */
448
    public WCSServerExplorer getExplorer() {
449
            try {
450
                        return (WCSServerExplorer)getDataStore().getExplorer();
451
                } catch (ValidateDataParametersException e) {
452
                        logger.debug("Error getting the explorer", e);
453
                } catch (DataException e) {
454
                        logger.debug("Error getting the explorer", e);
455
                }
456
            return null;
457
    }
458

    
459
    /**
460
     * Calcula el contenido del fichero de georreferenciaci?n de una imagen.
461
     * @param bBox Tama?o y posici?n de la imagen (en coordenadas de usuario)
462
     * @param sz Tama?o de la imagen en pixeles.
463
     * @return el 'WorldFile', como String.
464
     * @throws IOException
465
     */
466
    public String getDataWorldFile(Rectangle2D bBox, Dimension sz) throws IOException {
467
        StringBuffer data = new StringBuffer();
468
        data.append((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1) + "\n");
469
        data.append("0.0\n");
470
        data.append("0.0\n");
471
        data.append("-" + (bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1) + "\n");
472
        data.append("" + bBox.getMinX() + "\n");
473
        data.append("" + bBox.getMaxY() + "\n");
474
        return data.toString();
475
    }
476

    
477
    public FLayer cloneLayer() throws Exception {
478
        RasterDataStore  ds = dataStore.cloneDataStore();
479
        FLyrWCS layer = new FLyrWCS();
480
        layer.setName(getParameters().getCoverageName());
481
        layer.setOpenRasterStore(ds);
482
        layer.fullEnvelope = fullEnvelope;
483
        layer.setExplorer(getExplorer());
484

    
485
        List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
486

    
487
        //Hacemos una copia de las bandas a renderizar
488
        ColorInterpretation ci = getRender().getRenderColorInterpretation();
489
                if(ci != null) {
490
                        layer.getRender().setRenderColorInterpretation(ci.cloneColorInterpretation());
491
                }
492

    
493
        //Asignamos el entorno
494
        if(layer.getRender().getFilterList() == null)
495
            layer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
496
        layer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
497
        layer.getRender().getFilterList().setStatus(filters);
498

    
499
        // Asignamos los valores noData del original
500
        layer.setNoDataValue(getNoDataValue());
501
        if(dataStore.getNoDataValue().isDefined())
502
                layer.setNoDataTransparent(true);
503
        layer.enableOpen();
504

    
505
        return layer;
506
    }
507

    
508
    public Transparency getRenderTransparency() {
509
        return getRender().getRenderingTransparency();
510
    }
511

    
512
    public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties) throws ReadException {
513
        if (isVisible() && isWithinScale(scale)){
514
            draw(null, g, viewPort, cancel, scale);
515
        }
516
    }
517

    
518
    /**
519
     * Inserta la extensi?n total de la capa en la proyeccion original.
520
     *
521
     * @param fullExtent
522
     *            Rect?ngulo.
523
     */
524
    public void setFullEnvelope(Envelope envelope) {
525
        Envelope cur = this.getFullEnvelope();
526
        if (cur == envelope) {
527
            return;
528
        }
529
        if (cur != null && cur.equals(envelope)) {
530
            return;
531
        }
532

    
533
        this.fullEnvelope = envelope;
534
        this.updateDrawVersion();
535
    }
536

    
537
    /**
538
     * Sets the layer's full extent.
539
     *
540
     * Establece la extensi?n m?xima de la capa.
541
     *
542
     * @param rect
543
     */
544
    public void setFullExtent(Rectangle2D fullExtent) {
545
        this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
546
    }
547

    
548
    private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
549
        try {
550
            return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
551
                rect.getMaxX(), rect.getMaxY(),
552
                SUBTYPES.GEOM2D);
553
        } catch (CreateEnvelopeException e) {
554
            logger.error("Error creating the envelope", e);
555
        }
556
        return null;
557
    }
558

    
559

    
560
    public HashMap<String, Object> getProperties() {
561
        HashMap<String, Object> info = new HashMap<String, Object>();
562
        try {
563
            info.put("name", getName());
564
            info.put("selectedLayers", getParameters().getCoverageName());
565
            info.put("host", getParameters().getURI());
566
            info.put("crs", getParameters().getSRSCode());
567
            info.put("format", getParameters().getFormat());
568
            info.put("time", getParameters().getTime());
569
            return info;
570
        } catch (Exception e) {
571
            e.printStackTrace();
572
        }
573
        return null;
574
    }
575

    
576
    public int[] getTileSize() {
577
        int[] size = {maxTileDrawWidth, maxTileDrawHeight};
578
        return size;
579
    }
580

    
581
    public String getTocImageIcon() {
582
        return "ico-WCS-Layer";
583
    }
584

    
585
    public boolean isTiled() {
586
        return mustTileDraw;
587
    }
588

    
589
        public boolean isRemote() {
590
                return true;
591
        }
592

    
593
    @Override
594
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
595
        boolean fast) throws LoadLayerException, DataException {
596

    
597
        //try {
598
        ViewPort viewPort = getMapContext().getViewPort();
599

    
600
        Point tiledPoint = new Point((int) p.getX() % maxTilePrintWidth, (int) p.getY() % maxTilePrintHeight);
601
        Rectangle rect = new Rectangle(0, 0, viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
602
        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, rect);
603
        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
604
        int nCols = tiles.getNumCols();
605

    
606
        int col = (int) p.getX() / maxTilePrintWidth;
607
        int row = (int) p.getY() / maxTilePrintHeight;
608
        int tileIndex = (row * nCols) + col;
609

    
610
        ViewPort vp = null;
611
        try {
612
            vp = tiles.getTileViewPort(viewPort, tileIndex);
613
        } catch (NoninvertibleTransformException e1) {
614
            throw new LoadLayerException("", e1);
615
        }
616

    
617
        getParameters().setExtent(this.getRectable2DFromEnvelope(vp.getAdjustedExtent()));
618
        getParameters().setWidth(vp.getImageWidth());
619
        getParameters().setHeight(vp.getImageHeight());
620

    
621
        CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
622
        getParameters().setCancellable(cancellable);
623

    
624
        String fInfo;
625
        try {
626
            fInfo = getDataStore().getInfoByPoint(tiledPoint.getX(), tiledPoint.getY(), cancellable);
627
        } catch (InfoByPointException e) {
628
            throw new LoadLayerException("Error in getInfoByPoint", e);
629
        }
630
        return new DynObjectSetWCSInfo(fInfo, DynObjectSetWCSInfo.TYPE_TEXT);
631
    }
632

    
633
        @Override
634
        public String getFileFormat() {
635
                return "WCS";
636
        }
637

    
638
    public boolean isActionEnabled(int action) {
639
        switch (action) {
640
        case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
641
        case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
642
        case IRasterLayerActions.BANDS_FILE_LIST:
643
        case IRasterLayerActions.GEOLOCATION:
644
        case IRasterLayerActions.PANSHARPENING:
645
        case IRasterLayerActions.SAVE_COLORINTERP:
646
            return false;
647
        case IRasterLayerActions.BANDS_RGB:
648
        case IRasterLayerActions.REMOTE_ACTIONS:
649
        case IRasterLayerActions.COLOR_TABLE:
650
            return true;
651
        }
652

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

    
656
    public boolean overviewsSupport() {
657
        return false;
658
    }
659

    
660
    public org.gvsig.fmap.dal.coverage.datastruct.Extent getFullRasterExtent() {
661
        Envelope env = getFullEnvelope();
662
        double minx = env.getMinimum(0);
663
        double miny = env.getMinimum(1);
664
        double maxx = env.getMaximum(0);
665
        double maxy = env.getMaximum(1);
666
        Point2D ul = new Point2D.Double(minx, maxy);
667
        Point2D ur = new Point2D.Double(maxx, maxy);
668
        Point2D ll = new Point2D.Double(minx, miny);
669
        Point2D lr = new Point2D.Double(maxx, miny);
670
        return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
671
    }
672

    
673
    public WCSDataParameters getParameters() {
674
        /*if(params == null) {
675
            DataManager datamanager = DALLocator.getDataManager();
676
            WCSServerExplorerParameters explorerParams = null;
677
            try {
678
                explorerParams = (WCSServerExplorerParameters) datamanager.createServerExplorerParameters(WCSServerExplorer.NAME);
679
                explorerParams.setHost("");
680
                explorer = (WCSServerExplorer) datamanager.createServerExplorer(explorerParams);
681
                DataStoreParameters parameters = explorer.getStoreParameters();
682
                if(parameters instanceof WCSDataParameters) {
683
                    params = (WCSDataParameters) parameters;
684
                }
685
            } catch (InitializeException e) {
686
            } catch (ProviderNotRegisteredException e) {
687
            } catch (ValidateDataParametersException e) {
688
            }
689
        }*/
690
        return getWCSParameters(getDataStore().getParameters());
691
    }
692

    
693
    /**
694
     * Gets <code>WCSDataParameters</code>
695
     * @param parameters
696
     * @return
697
     */
698
    private WCSDataParameters getWCSParameters(DataStoreParameters parameters) {
699
            WCSDataParameters params = null;
700
            if(parameters instanceof WCSDataParameters) {
701
                        params = (WCSDataParameters) parameters;
702
                }
703

    
704
                if(parameters instanceof TileDataParameters) {
705
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
706
                        if(p instanceof WCSDataParameters) {
707
                                params = (WCSDataParameters) p;
708
                        }
709
                }
710
                return params;
711
    }
712

    
713
    /**
714
     * Sets the explorer
715
     * @param explorer
716
     */
717
    public void setExplorer(WCSServerExplorer explorer) {
718
            if(getDataStore() != null)
719
                    getDataStore().setExplorer(explorer);
720
    }
721

    
722
    /**
723
         * Assigns the flag to delete this layer from the cache
724
         * @param selected
725
         */
726
        public void deleteCache(boolean deleteCache) {
727
                this.deleteCache = deleteCache;
728
        }
729

    
730
    /**
731
     * Sets the data store parameters
732
     * @param params
733
     * @throws InitializeException
734
     */
735
    public void setParameters(DataStoreParameters params) throws InitializeException {
736
        if(params instanceof TileDataParameters) {
737
                        ((TileDataParameters)params).deleteCache(deleteCache);
738
                }
739

    
740
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
741
        try {
742
            DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
743
            this.setDataStore(dStore);
744

    
745
                        if(params instanceof WCSDataParameters) {
746
                                this.setName((String)((WCSDataParameters)params).getURI());
747
                        }
748

    
749
                        if(params instanceof TileDataParameters) {
750
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
751
                                if(p instanceof WCSDataParameters) {
752
                                        this.setName((String)((WCSDataParameters) p).getURI());
753
                                }
754
                        }
755
        } catch (ValidateDataParametersException e) {
756
            throw new InitializeException(e);
757
        } catch (ProviderNotRegisteredException e) {
758
            throw new InitializeException(e);
759
        } catch (LoadLayerException e) {
760
            throw new InitializeException(e);
761
        }
762
    }
763

    
764
        /*@Override
765
        public void loadFromState(PersistentState state)
766
        throws PersistenceException {
767
                String host = state.getString("host");
768

769
                getParameters();
770
                ((WCSServerExplorerParameters)explorer.getParameters()).setHost(host);
771

772
                if(!explorer.isHostReachable()) {
773
                        loadDataStore = false;
774
                        super.loadFromState(state);
775
                        return;
776
                }
777

778
                try {
779
                        explorer.connect(new CancelTaskImpl());
780
                        explorer.getCoverageList();
781
                } catch (Exception e) {
782
                        loadDataStore = false;
783
                        super.loadFromState(state);
784
                        return;
785
                }
786

787
                loadDataStore = true;
788

789
                super.loadFromState(state);
790
                params = getDataStore().getParameters();
791
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
792
                try {
793
                        if(this.dataStore.isOpen())
794
                                enableOpen();
795
                } catch (NotAvailableStateException e) {
796
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
797
                }
798
                //getParameters().setCoverageName((String)state.get("name"));
799
        }*/
800

    
801
    /*@Override
802
        public void saveToState(PersistentState state) throws PersistenceException {
803
                super.saveToState(state);
804
                state.set("fullEnvelope", this.fullEnvelope);
805
                state.set("host", getParameters().getURI());
806
                state.set("name", getName());
807
        }*/
808

    
809
        /*public static void registerPersistent() {
810
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
811
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
812
                if( definition == null ) {
813
                        if (manager.getDefinition(FLyrDefault.class) == null) {
814
                                FLyrDefault.registerPersistent();
815
                        }
816

817
                        definition = manager.addDefinition(
818
                                        FLyrWCS.class,
819
                                        PERSISTENT_NAME,
820
                                        PERSISTENT_DESCRIPTION,
821
                                        null,
822
                                        null
823
                        );
824

825
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
826
                }
827

828
                DefaultFLyrRaster.registerPersistence(definition);
829
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
830
                definition.addDynFieldString("host").setMandatory(false);
831
                definition.addDynFieldString("name").setMandatory(false);
832
        }*/
833

    
834
        public static void registerPersistent() {
835
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
836
                DynStruct definition = manager.getDefinition("FLyrWCS_Persistent");
837
                if( definition == null ) {
838
                        if (manager.getDefinition(DefaultFLyrRaster.class) == null) {
839
                                DefaultFLyrRaster.registerPersistence();
840
                        }
841

    
842
                        definition = manager.addDefinition(
843
                                        FLyrWCS.class,
844
                                        "FLyrWCS_Persistent",
845
                                        "FLyrWCS Persistent Definition",
846
                                        null,
847
                                        null
848
                        );
849

    
850
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME);
851
                }
852

    
853
                DefaultFLyrRaster.registerPersistence(definition);
854
        }
855
}