Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.fmap / src / main / java / org / gvsig / raster / fmap / layers / DefaultFLyrRaster.java @ 1426

History | View | Annotate | Download (69 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.fmap.layers;
23

    
24
import java.awt.Dimension;
25
import java.awt.Graphics2D;
26
import java.awt.Point;
27
import java.awt.Rectangle;
28
import java.awt.geom.AffineTransform;
29
import java.awt.geom.NoninvertibleTransformException;
30
import java.awt.geom.Point2D;
31
import java.awt.geom.Rectangle2D;
32
import java.awt.image.BufferedImage;
33
import java.io.File;
34
import java.io.IOException;
35
import java.util.ArrayList;
36
import java.util.HashMap;
37
import java.util.List;
38
import java.util.Set;
39

    
40
import org.cresques.cts.IProjection;
41
import org.gvsig.compat.print.PrintAttributes;
42
import org.gvsig.fmap.crs.CRSFactory;
43
import org.gvsig.fmap.dal.DataStore;
44
import org.gvsig.fmap.dal.DataStoreParameters;
45
import org.gvsig.fmap.dal.coverage.RasterLibrary;
46
import org.gvsig.fmap.dal.coverage.RasterLocator;
47
import org.gvsig.fmap.dal.coverage.RasterManager;
48
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
49
import org.gvsig.fmap.dal.coverage.datastruct.ColorItem;
50
import org.gvsig.fmap.dal.coverage.datastruct.ColorTableLibrary;
51
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
52
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
53
import org.gvsig.fmap.dal.coverage.datastruct.Params;
54
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
55
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
56
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
57
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
58
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
59
import org.gvsig.fmap.dal.coverage.exception.GridException;
60
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
61
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
62
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
63
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
64
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
65
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
66
import org.gvsig.fmap.dal.coverage.grid.Grid;
67
import org.gvsig.fmap.dal.coverage.grid.ROI;
68
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
69
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
70
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
71
import org.gvsig.fmap.dal.coverage.grid.render.Render;
72
import org.gvsig.fmap.dal.coverage.grid.render.VisualPropertyEvent;
73
import org.gvsig.fmap.dal.coverage.grid.render.VisualPropertyListener;
74
import org.gvsig.fmap.dal.coverage.process.TaskEventManager;
75
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
76
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
77
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
78
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
79
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
80
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
81
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
82
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
83
import org.gvsig.fmap.dal.coverage.util.CRSUtils;
84
import org.gvsig.fmap.dal.coverage.util.ColorConversion;
85
import org.gvsig.fmap.dal.coverage.util.FileUtils;
86
import org.gvsig.fmap.dal.coverage.util.Historical;
87
import org.gvsig.fmap.dal.coverage.util.MathUtils;
88
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
89
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
90
import org.gvsig.fmap.dal.exception.CloseException;
91
import org.gvsig.fmap.dal.exception.DataException;
92
import org.gvsig.fmap.dal.exception.InitializeException;
93
import org.gvsig.fmap.dal.exception.ReadException;
94
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices;
95
import org.gvsig.fmap.geom.GeometryLocator;
96
import org.gvsig.fmap.geom.GeometryManager;
97
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
98
import org.gvsig.fmap.geom.Geometry.TYPES;
99
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
100
import org.gvsig.fmap.geom.primitive.Envelope;
101
import org.gvsig.fmap.geom.type.GeometryType;
102
import org.gvsig.fmap.geom.type.GeometryTypeNotSupportedException;
103
import org.gvsig.fmap.geom.type.GeometryTypeNotValidException;
104
import org.gvsig.fmap.mapcontext.MapContextLocator;
105
import org.gvsig.fmap.mapcontext.MapContextManager;
106
import org.gvsig.fmap.mapcontext.ViewPort;
107
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
108
import org.gvsig.fmap.mapcontext.exceptions.ReloadLayerException;
109
import org.gvsig.fmap.mapcontext.layers.FLayer;
110
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
111
import org.gvsig.fmap.mapcontext.layers.LayerChangeSupport;
112
import org.gvsig.fmap.mapcontext.layers.LayerListener;
113
import org.gvsig.fmap.mapcontext.layers.Tiling;
114
import org.gvsig.fmap.mapcontext.layers.operations.Classifiable;
115
import org.gvsig.fmap.mapcontext.layers.operations.InfoByPoint;
116
import org.gvsig.fmap.mapcontext.layers.operations.SingleLayer;
117
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
118
import org.gvsig.fmap.mapcontext.rendering.legend.events.listeners.LegendListener;
119
import org.gvsig.raster.fmap.legend.ColorTableLegend;
120
import org.gvsig.raster.util.RasterNotLoadException;
121
import org.gvsig.tools.ToolsLocator;
122
import org.gvsig.tools.dynobject.DynClass;
123
import org.gvsig.tools.dynobject.DynObjectManager;
124
import org.gvsig.tools.dynobject.DynObjectSet;
125
import org.gvsig.tools.dynobject.DynStruct;
126
import org.gvsig.tools.exception.BaseException;
127
import org.gvsig.tools.persistence.PersistenceManager;
128
import org.gvsig.tools.persistence.PersistentState;
129
import org.gvsig.tools.persistence.exception.PersistenceException;
130
import org.gvsig.tools.task.Cancellable;
131
import org.gvsig.tools.task.SimpleTaskStatus;
132
import org.gvsig.tools.task.TaskStatusManager;
133
import org.gvsig.tools.task.impl.BaseTaskStatus;
134
import org.slf4j.Logger;
135
import org.slf4j.LoggerFactory;
136

    
137
/**
138
 * Raster layer
139
 * 
140
 * @author Nacho Brodin (nachobrodin@gmail.com)
141
 */
142
@SuppressWarnings("deprecation")
143
public class DefaultFLyrRaster extends FLyrDefault implements FLyrRaster, Multiresolution, InfoByPoint, Classifiable,
144
                IRasterLayerActions, ILayerState, VisualPropertyListener, SingleLayer {
145
        public static final String      PERSISTENT_NAME                = "FLyrRasterSE_Persistent";
146
    public static final String      PERSISTENT_DESCRIPTION         = "FLyrRasterSE Persistent";
147
    private RasterManager           rManager                       = RasterLocator.getManager();
148
        private boolean                 mustTileDraw                   = false;
149
        private boolean                 mustTilePrint                  = true;
150
        private int                     maxTileDrawWidth               = 200;
151
        private int                     maxTileDrawHeight              = 200;
152
        private int                     maxTilePrintWidth              = 1500;
153
        private int                     maxTilePrintHeight             = 1500;
154
        private boolean                 firstLoad                      = false;
155
        private boolean                 removeRasterFlag               = true;
156
        protected RasterDataStore       dataStore                      = null;
157
        protected Render                render                         = null;
158
        private int                     posX                           = 0;
159
        private int                     posY                           = 0;
160
        private double                  posXWC                         = 0;
161
        private int                     posYWC                         = 0;
162
        private int                     r                              = 0;
163
        private int                     g                              = 0;
164
        private int                     b                              = 0;
165
        private LayerChangeSupport      layerChangeSupport             = new LayerChangeSupport();
166
        private FLyrState               state                          = new FLyrState();
167
        protected ILegend               lastLegend                     = null;
168
        protected ColorTable            colorTableLoadedFromProject    = null;
169
        protected boolean               loadedFromProject              = false;
170
        private ArrayList<ROI>          rois                           = null;
171
        private RasterDrawStrategy      strategy                       = null;
172
        static private IConfiguration   configuration                  = new DefaultLayerConfiguration();
173
        protected int                   zoomLevel                      =  1;
174
        public boolean                  recalcLevel                    = true;
175
        
176
        private BufferedImage           image                          = null;
177
        private static GeometryManager  geomManager                          = GeometryLocator.getGeometryManager();
178
        private static final Logger     logger                         = LoggerFactory.getLogger(DefaultFLyrRaster.class);
179
        protected FileUtils             fileUtil                       = RasterLocator.getManager().getFileUtils();
180
        protected RasterUtils           rasterUtil                     = RasterLocator.getManager().getRasterUtils();
181
        protected CRSUtils              crsUtil                        = RasterLocator.getManager().getCRSUtils();
182
        protected MathUtils             mathUtil                       = RasterLocator.getManager().getMathUtils();
183
        private String                  uri                            = null;
184
        //private boolean                 noDataTransparent              = true;
185
        
186
        public class RasterTaskStatus extends BaseTaskStatus {
187
                Cancellable c = null;
188
                
189
                public RasterTaskStatus(String tittle, Cancellable c) {
190
                        super(tittle);
191
                        this.c = c;
192
                }
193
                
194
                public boolean isCancellationRequested() {
195
                        return this.c.isCanceled();
196
                }
197
                
198
                public void cancelRequest() {
199
                        this.c.setCanceled(true);
200
                }
201
        }
202

    
203
        /**
204
         * Lista de transformaciones afines que son aplicadas. Esta lista es
205
         * simplemente un historico que no se utiliza. Es posible utilizarlo para
206
         * recuperar transformaciones anteriores.
207
         */
208
        private Historical              affineTransformList    = null;
209
        protected String                readingData            = null;
210
        //It is set to true if the method init has been called at least once
211
        protected boolean               layerInitialize        = false;
212
        
213
        public DefaultFLyrRaster() {
214
                affineTransformList = rManager.createHistoricalService();
215
        }
216
        
217
        public static void registerDynClass() {
218
                DynObjectManager manager = ToolsLocator.getDynObjectManager();
219
            DynClass dynClass = manager.add("RasterInfo", "Raster layer Info by point");
220
            dynClass.setNamespace("InfoByPoint");
221
            dynClass.addDynFieldString("File");
222
            dynClass.addDynFieldString("View Point");
223
            dynClass.addDynFieldString("Pixel Point");
224
            dynClass.addDynFieldString("RGB");
225
            dynClass.addDynFieldString("CMYK");
226
            dynClass.addDynFieldString("HSL");
227
            dynClass.addDynFieldString("Band Value");
228
            dynClass.addDynFieldString("World Point");
229
        }
230
        
231
        /**
232
         * Builds a new raster layer
233
         * @param fileName
234
         * @return
235
         * @throws RasterNotLoadException 
236
         * @throws LoadLayerException 
237
         */
238
        public static DefaultFLyrRaster createLayer(String layerName, File file) throws LoadLayerException {
239
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
240
                RasterDataParameters storeParameters = provServ.createParameters(file.getName());
241
                storeParameters.setURI(file.getPath());
242
                
243
                MapContextManager mcm = MapContextLocator.getMapContextManager();
244
                DefaultFLyrRaster lyr = (DefaultFLyrRaster) mcm.createLayer(layerName, storeParameters);
245

    
246
                return lyr;
247
        }
248

    
249
        /*
250
         * (non-Javadoc)
251
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setName(java.lang.String)
252
         */
253
        public void setName(String name) {
254
                super.setName(name);
255

    
256
                //Si la capa tiene nombre acivamos el estado awake
257
                if(name != null)
258
                        try {
259
                                if(isClosed())
260
                                        enableAwake();
261
                        } catch (NotAvailableStateException e) {
262
                                logger.error("Fallo el estado de open. Closed=" + isClosed() + " Active=" + isOpen(), this, e);
263
                        }
264
        }
265

    
266
        /*
267
         * (non-Javadoc)
268
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#wakeUp()
269
         */
270
        public void wakeUp(){
271
                try {
272
                        reload();
273
                } catch (ReloadLayerException e) {
274
                        // No se ha podido recuperar la capa con exito
275
                }
276
        }
277

    
278
        /*
279
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#load()
280
         */
281
        public void load() throws LoadLayerException {
282
                if (isStopped() || getDataStore() == null)
283
                        return;
284

    
285
                enableStopped(); // Paramos la capa mientras se hace un load
286

    
287
                int test = -1;
288
                DataStoreParameters params = getDataStore().getParameters();
289
                DataStoreParameters p = params;
290
                if (params != null) {
291
                        if(params instanceof TileDataParameters) {
292
                                uri = ((RasterDataParameters)params).getURI();
293
                                if(uri == null)
294
                                        p = (DataStoreParameters)((TileDataParameters)params).getDataParameters();
295
                        }
296
                        if(uri == null) {
297
                                if(params instanceof RasterDataParameters)
298
                                        uri = ((RasterDataParameters)p).getURI();
299
                        }
300
                        test = uri.indexOf("ecwp:");
301
                }
302

    
303
                if (test != -1) {
304
                        String urlECW = uri.substring(test + 6);
305
                        uri = "ecwp://" + urlECW;
306
                        System.err.println(test + " " + uri);
307
                }
308

    
309
                try {
310
                        if(!getDataStore().isOpen())
311
                                dataStore = rManager.open(params);
312
                } catch (NotSupportedExtensionException e) {
313
                        throw new LoadLayerException(this.getName());
314
                } catch (RasterDriverException e) {
315
                        throw new LoadLayerException(this.getName());
316
                }
317
        }
318

    
319
        /**
320
         * Acciones de inicializaci?n despu?s de que la fuente de datos
321
         * de la capa est? asignada. El tipo de fuente de datos es variable
322
         * puede ser MultiRasterDataset, CompositeDataset u otras que existan e
323
         * implementen IRasterDatasource.
324
         * @throws FilePaletteException 
325
         */
326
        public void init() throws LoadLayerException, FilePaletteException {
327
                layerInitialize = true;
328
                
329
                if (getDataStore() == null)
330
                        throw new LoadLayerException("Formato no valido", new IOException());
331

    
332
                render = getDataStore().getRender();
333
                render.addVisualPropertyListener(this);
334
                initFilters();
335

    
336
                //Inicializaci?n del historico de transformaciones
337
                affineTransformList.clear();
338
                affineTransformList.add(this.getAffineTransform());
339

    
340
                try {
341
                        if(!isOpen())
342
                                enableOpen();
343
                } catch (NotAvailableStateException e) {
344
                        throw new LoadLayerException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e);
345
                }
346
        }
347

    
348
        /*
349
         * (non-Javadoc)
350
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#readProjection()
351
         */
352
        public IProjection readProjection() throws RasterDriverException {
353
                try {
354
                        crsUtil.setCRSFactory(CRSFactory.cp);
355
                        if( getDataStore() == null )
356
                                return null;
357
                        return crsUtil.convertWktToIProjection(getDataStore().getWktProjection());
358
                } catch (Exception e) {
359
                        throw new RasterDriverException("Problems converting from WKT to IProjection", e);
360
                } catch (Error e) {
361
                        e.printStackTrace();
362
                        return null;
363
                }
364
        }
365

    
366
        /**
367
         * Crea el objeto renderizador de raster
368
         * @return Rendering
369
         */
370
        public Render getRender() {
371
                if (render == null) {
372
                        if(getDataStore() != null) {
373
                                render = getDataStore().getRender();
374
                                render.addVisualPropertyListener(this);
375
                        }
376
                }
377
                return render;
378
        }
379
        
380
        /*
381
         * (non-Javadoc)
382
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getURI()
383
         */
384
        public String getURI() {
385
                return uri;
386
        }
387

    
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#setNoDataTransparent(boolean)
391
         */
392
        public void setNoDataTransparent(boolean t) {
393
                getNoDataValue().setNoDataTransparent(t);
394
                if(getRender().getLastTransparency() != null) {
395
                        getRender().getLastTransparency().setNoData(getDataStore().getNoDataValue());
396
                        getRender().getLastTransparency().activeTransparency();
397
                }
398
        }
399

    
400
        /**
401
         * Initializes the filter list to render this raster layer
402
         * @throws FilePaletteException 
403
         */
404
        protected void initFilters() throws FilePaletteException {
405
                if(getDataType() == null)
406
                        return;
407
                        
408
                RasterFilterList filterList = rManager.createEmptyFilterList(getDataType()[0]);
409
                if(loadedFromProject) {
410
                        filterList = getDataStore().getRender().getFilterList();
411
                }
412
                filterList.addEnvParam("IStatistics", getDataStore().getStatistics());
413
                filterList.addEnvParam("MultiRasterDataset", getDataStore());
414

    
415
                if(getDataStore() == null)
416
                        return;
417
                
418
                if(getDataStore().getNoDataValue() != null) {
419
                        getDataStore().getNoDataValue().load();
420
                        if(getDataStore().getNoDataValue().isDefined())
421
                                setNoDataTransparent(true);
422
                }
423

    
424
                filterList.setInitDataType(getDataType()[0]);
425

    
426
                // Quitamos la leyenda
427
                lastLegend = null;
428

    
429
                try {
430
                        //Si en la carga del proyecto se carg? una tabla de color asignamos esta
431
                        if(colorTableLoadedFromProject != null) {
432
                                setLastLegend(colorTableLoadedFromProject);
433
                                RasterFilterListManager colorTableManager = filterList.getManagerByID("ColorTable");
434
                                Params params = filterList.createEmptyFilterParams();
435
                                params.setParam("colorTable", colorTableLoadedFromProject);
436
                                colorTableManager.addFilter(params);
437
                        } else
438
                                //sino ponemos la tabla asociada al raster
439
                                if (getDataStore().getColorTable() != null) {
440
                                        ColorTable table = getDataStore().getColorTable();
441
                                        setLastLegend(table);
442
                                        RasterFilterListManager colorTableManager = filterList.getManagerByID("ColorTable");
443
                                        Params params = filterList.createEmptyFilterParams();
444
                                        params.setParam("colorTable", table);
445
                                        colorTableManager.addFilter(params);
446
                                } else //sino hace lo que dice en las preferencias
447
                                        if(getDataStore().needEnhanced() || 
448
                                                        (loadedFromProject && filterList.get("enhanced_stretch") != null)) 
449
                                                loadEnhancedOrColorTable(filterList);
450
                        colorTableLoadedFromProject = null;
451

    
452
                        getRender().setFilterList(filterList);
453
                        // Inicializo la transparencia para el render
454
                        if(!loadedFromProject) {
455
                                getRender().setLastTransparency(getDataStore().getTransparency().cloneTransparency());
456
                        }
457
                        loadedFromProject = false;
458
                } catch (FilterTypeException e) {
459
                        //Ha habido un error en la asignaci?n de filtros por los que no se a?ade ninguno.
460
                        logger.error("Error a?adiendo filtros en la inicializaci?n de capa " + this.getName() + " Datatype=" + this.getDataType(), null, e);
461
                } catch (FilterManagerException e) {
462
                        //Ha habido un error en la asignaci?n de filtros por los que no se a?ade ninguno.
463
                        logger.error("Error a?adiendo filtros en la inicializaci?n de capa " + this.getName() + " Datatype=" + this.getDataType(), null, e);
464
                }
465
        }
466

    
467
        /**
468
         * Mira la configuracion para saber si debe cargar un realce o una tabla
469
         * de color por defecto
470
         * @param filterManager
471
         * @throws FilterTypeException
472
         * @throws FilePaletteException 
473
         */
474
        private void loadEnhancedOrColorTable(RasterFilterList filterList) throws FilterTypeException, FilterManagerException, FilePaletteException {
475
                String colorTableName = null;
476
                if(configuration != null)
477
                        colorTableName = configuration.getValueString("loadlayer_usecolortable", (String) null);
478

    
479
                String palettesPath = System.getProperty("user.home") +
480
                File.separator +
481
                "gvSIG" + // PluginServices.getArguments()[0] +
482
                File.separator + "colortable";
483

    
484
                Statistics stats = getDataStore().getStatistics();
485
                ColorTableLibrary colorTableLibrary = rManager.getDataStructFactory().getColorTableLibrary();
486

    
487
                if (colorTableName != null)
488
                        try {
489
                                stats.calculate(RasterLibrary.statisticsScale);
490
                                if (getDataStore().getBandCount() == 1) {
491
                                        ArrayList<String> fileList = colorTableLibrary.getPaletteFileList(palettesPath);
492
                                        for (int i = 0; i < fileList.size(); i++) {
493
                                                ArrayList<ColorItem> paletteItems = new ArrayList<ColorItem>();
494
                                                String paletteName = colorTableLibrary.loadPalette(palettesPath, (String) fileList.get(i), paletteItems);
495
                                                if (paletteName.equals(colorTableName)) {
496
                                                        if (paletteItems.size() <= 0)
497
                                                                continue;
498

    
499
                                                        ColorTable colorTable = colorTableLibrary.createColorTable();
500
                                                        colorTable.setName(paletteName);
501
                                                        colorTable.createPaletteFromColorItems(paletteItems, true);
502
                                                        colorTable.setInterpolated(true);
503

    
504
                                                        colorTable.createColorTableInRange(stats.getMinimun(), stats.getMaximun(), true);
505

    
506
                                                        setLastLegend(colorTable);
507

    
508
                                                        RasterFilterListManager colorTableManager = filterList.getManagerByID("ColorTable");
509
                                                        Params params = filterList.createEmptyFilterParams();
510
                                                        params.setParam("colorTable", colorTable);
511
                                                        colorTableManager.addFilter(params);
512
                                                        return;
513
                                                }
514
                                        }
515
                                }
516
                        } catch (FileNotOpenException e) {
517
                                // No podemos aplicar el filtro
518
                        } catch (RasterDriverException e) {
519
                                // No podemos aplicar el filtro
520
                        } catch (ProcessInterruptedException e) {
521
                                // El usuario ha cancelado el proceso
522
                        }
523

    
524
                        RasterFilterListManager enhancementManager = filterList.getManagerByID("EnhancementStretch");
525
                        RasterFilter f = filterList.getByName("enhanced_stretch");
526
                        if(f == null) {
527
                                Params params = filterList.createEmptyFilterParams();
528
                                params.setParam("stats", stats);
529
                                params.setParam("remove", new Boolean(false));
530
                                params.setParam("renderBands", getRender().getRenderBands());
531
                                params.setParam("stretchs", null);//coge el LinearStretchParams por defecto
532
                                params.setParam("rgb", new Boolean(true));
533
                                enhancementManager.addFilter(params);
534
                        }
535
        }
536

    
537
        /*
538
         * (non-Javadoc)
539
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isReproyectable()
540
         */
541
        public boolean isReproyectable() {
542
                if (getDataStore() == null)
543
                        return false;
544
                return getDataStore().isReproyectable();
545
        }
546

    
547
        /**
548
         * @throws ReadException
549
         * @throws ReadDriverException
550
         * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#draw(java.awt.image.BufferedImage,
551
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort,
552
         *                 com.iver.utiles.swing.threads.Cancellable)
553
         */
554
        public void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel, double scale) throws ReadException {
555
                this.image = image;
556
                TaskEventManager task = rManager.getRasterTask();
557
                task.setEvent(null);
558
                
559
                if(!layerInitialize) {
560
                        if (getDataStore() != null)
561
                                try {
562
                                        this.init();
563
                                } catch (FilePaletteException e) {
564
                                        throw new ReadException("Error in raster legend", e);
565
                                } catch (LoadLayerException e) {
566
                                        throw new ReadException("Error initializing the layer", e);
567
                                }
568
                }
569

    
570
                try {
571
                        if (!isOpen())
572
                                return;
573

    
574
                        enableStopped();
575
                        // callLegendChanged(null);
576
                        
577
                        //Solo el zoom normal recalcula el nivel dependiendo de la escala. El zoom por niveles asigna
578
                        //?l el nivel de zoom por lo que no habr? que recalcularlo.
579
                        if(recalcLevel) {
580
                                double pixelSize = vp.getEnvelope().getLength(0) / (double)vp.getImageWidth();
581
                                zoomLevel = getDataStore().getNearestLevel(pixelSize);
582
                        }
583
                        recalcLevel = true;
584

    
585
                        strategy = new RasterDrawStrategy(getMapContext(), this);
586
                        strategy.stackStrategy();
587
                        HashMap<DefaultFLyrRaster, Boolean> tStr = strategy.getStrategy();
588
                        if (tStr != null &&
589
                                tStr.get(this) != null &&
590
                                ((Boolean) (tStr.get(this))).booleanValue() == false) {
591
                                disableStopped();
592
                                return;
593
                        }
594

    
595
                        if (isWithinScale(scale)) {
596
                                
597
                                if (mustTileDraw) {
598
                                        Point2D p = vp.getOffset();
599
                                        Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), vp.getImageWidth(), vp.getImageHeight());
600
                                        Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
601
                                        tiles.setAffineTransform((AffineTransform) vp.getAffineTransform().clone());
602
                                        for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++)
603
                                                // drawing part
604
                                                try {
605
                                                        ViewPort vport = tiles.getTileViewPort(vp, tileNr);
606
                                                        draw(image, g, vport, cancel);
607
                                                } catch (InterruptedException e) {
608
                                                        System.out.println("Se ha cancelado el pintado");
609
                                                } catch (InvalidSetViewException e) {
610
                                                        throw new ReadException("Error reading file.", e);
611
                                                } catch (RasterDriverException e) {
612
                                                        throw new ReadException("Error reading file.", e);
613
                                                }  catch (NoninvertibleTransformException e) {
614
                                                        throw new ReadException("Error in the transformation.", e);
615
                                                }
616
                                } else
617
                                        try {
618
                                                draw(image, g, vp, cancel);
619
                                        } catch (InterruptedException e) {
620
                                                System.out.println("Se ha cancelado el pintado");
621
                                        } catch (InvalidSetViewException e) {
622
                                                throw new ReadException("Error reading file.", e);
623
                                        } catch (RasterDriverException e) {
624
                                                throw new ReadException("Error reading file.", e);
625
                                        }
626

    
627
                        }
628
                        
629
                        //callLegendChanged(null);
630
                } finally {
631
                        disableStopped();
632
                        task.setEvent(null);
633
                }
634
        }
635

    
636
        protected void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel) throws RasterDriverException, InvalidSetViewException, InterruptedException {
637
                Envelope adjustedExtent = vp.getAdjustedExtent();
638
                if (adjustedExtent == null)
639
                        return;
640
                Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
641
                                adjustedExtent.getUpperCorner().getY(), adjustedExtent
642
                                                .getUpperCorner().getX(),
643
                                adjustedExtent
644
                                                .getLowerCorner().getY());
645
                Dimension imgSz = vp.getImageSize();
646
                ViewPortData vp2 = rManager.createViewPortData(vp.getProjection(), e, imgSz );
647
                vp2.setMat(vp.getAffineTransform());
648
                //vp2.setTime(vp.getTime()); 
649
                
650
                TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
651
                SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
652
                manager.add(taskStatus);
653
                taskStatus.setAutoremove(true);
654
                
655
                //Crea la reproyecci?n al vuelo la primera vez
656
                RasterDataParameters params = (RasterDataParameters)getDataStore().getParameters();
657
                if(!getRender().isReprojectingOnTheFly() && 
658
                        getDataStore().getProjection() != null &&
659
                        params.getReprojectionOption() == RasterDataParameters.ON_THE_FLY) {
660
                        getRender().createReprojectionOnTheFly(getDataStore(), getCoordTrans(), taskStatus);
661
                }
662
                
663
                try {
664
                        if(getDataStore().isTiled()) {
665
                                getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
666
                        } else {
667
                                getRender().draw(g, vp2, taskStatus);
668
                        }
669
                } catch (ProcessInterruptedException e1) {
670
                } finally {
671
                        taskStatus.terminate();
672
                }
673
        }
674

    
675
        /**
676
         * Inserta la proyecci?n.
677
         *
678
         * @param proj Proyecci?n.
679
         */
680
        public void setProjection(IProjection proj) {
681
                getDataStore().setProjection(proj);
682
                super.setProjection(proj);
683
        }
684

    
685
        /*
686
         * (non-Javadoc)
687
         * @see org.gvsig.fmap.mapcontext.layers.FLayer#getFullEnvelope()
688
         */
689
        public Envelope getFullEnvelope() {
690
                //TODO:DEPURACION Comentamos !isOpen porque getFullExtent de FLayers da una excepci?n ya que siempre espera
691
                //un extent aunque la capa no est? abierta
692
                if(/*!isOpen() || */getDataStore() == null || getDataStore().getExtent() == null)
693
                        return null;
694

    
695
                Rectangle2D e = getDataStore().getExtent().toRectangle2D();
696
                try {
697
                        return geomManager.createEnvelope(e.getX(), e.getY(), e.getMaxX(), e
698
                                        .getMaxY(), SUBTYPES.GEOM2D);
699

    
700
                        /*
701
                        No es necesario 
702
                        ICoordTrans ct = getCoordTrans();
703
                        RasterDataParameters params = (RasterDataParameters)getDataStore().getParameters();
704
                        if (ct != null && params.getReprojectionOption() == RasterDataParameters.ON_THE_FLY) {
705
                                env = env.convert(ct);
706
                        }
707
                        return env;*/
708

    
709
                } catch (CreateEnvelopeException e1) {
710
                        logger.error("Error creating the envelope", e);
711
                        return null;
712
                }
713
        }
714
        
715
        /**
716
         * Obtiene el valor del pixel del Image en la posici?n x,y
717
         * @param x Posici?n x
718
         * @param y Posici?n y
719
         * @return valor de pixel
720
         */
721
        public int[] getPixel(int pxx, int pxy) {
722
                int[] argb = { -1, -1, -1, -1 };
723
                if (!isOpen() || (image == null))
724
                        return argb;
725
                if (pxx >= 0 && pxx < image.getWidth() && pxy >= 0 && pxy < image.getHeight()) {
726
                        int value = image.getRGB(pxx, pxy);
727
                        argb[0] = ((value & 0xff000000) >> 24);
728
                        argb[1] = ((value & 0x00ff0000) >> 16);
729
                        argb[2] = ((value & 0x0000ff00) >> 8);
730
                        argb[3] = (value & 0x000000ff);
731
                }
732
                return argb;
733
        }
734

    
735
        /*
736
         * (non-Javadoc)
737
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMaxX()
738
         */
739
        public double getMaxX() {
740
                if(getFullEnvelope() != null)
741
                        return getFullEnvelope().getMaximum(0);
742
                return -1;
743
        }
744

    
745
        /*
746
         * (non-Javadoc)
747
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMaxY()
748
         */
749
        public double getMaxY() {
750
                if(getFullEnvelope() != null)
751
                        return this.getFullEnvelope().getMaximum(1);
752
                return -1;
753
        }
754

    
755
        /*
756
         * (non-Javadoc)
757
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMinX()
758
         */
759
        public double getMinX() {
760
                if(getFullEnvelope() != null)
761
                        return getFullEnvelope().getMinimum(0);
762
                return -1;
763
        }
764

    
765
        /*
766
         * (non-Javadoc)
767
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMinY()
768
         */
769
        public double getMinY() {
770
                if(getFullEnvelope() != null)
771
                        return getFullEnvelope().getMinimum(1);
772
                return -1;
773
        }
774

    
775
        /* (non-Javadoc)
776
         * @deprecated. See String getInfo(Point p) throws DriverException
777
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint#queryByPoint(java.awt.Point)
778
         */
779
        public String queryByPoint(Point p) {
780
                if (!isOpen())
781
                        return null;
782
                ColorConversion conv = rManager.getColorConversion();
783

    
784
                String data = "<file:" + normalizeAsXMLTag(getName()) + ">\n";
785

    
786
                ArrayList<Object> attr = getAttributes();
787
                data += "  <raster\n";
788
                data += "    File=\"" + getFile() + "\"\n";
789
                for (int i = 0; i < attr.size(); i++) {
790
                        Object[] a = (Object[]) attr.get(i);
791

    
792
                        data += "    " + a[0].toString() + "=";
793
                        if (a[1].toString() instanceof String)
794
                                data += "\"" + a[1].toString() + "\"\n";
795
                        else
796
                                data += a[1].toString() + "\n";
797
                }
798
                data += "    Point=\"" + posX + " , " + posY + "\"\n";
799
                data += "    Point_WC=\"" + mathUtil.format(posXWC, 3) + " , " + mathUtil.format(posYWC, 3) + "\"\n";
800
                data += "    RGB=\"" + r + ", " + g + ", " + b + "\"\n";
801
                double[] cmyk = conv.RGBtoCMYK(r & 0xff, g & 0xff, b & 0xff, 1D);
802
                data += "    CMYK=\"" + mathUtil.format(cmyk[0], 4) + ", " + mathUtil.format(cmyk[1], 4) + ", " + mathUtil.format(cmyk[2], 4) + "," + mathUtil.format(cmyk[3], 4) + "\"\n";
803
                double[] hsl = conv.RGBtoHSL(r & 0xff, g & 0xff, b & 0xff);
804
                hsl[0] = (int)(255.0 * hsl[0] / 360.0 + 0.5);
805
                hsl[2] = (int) (hsl[2] * 255. + 0.5);
806
                hsl[1] = (int) (hsl[1] * 255. + 0.5);
807
                data += "    HSL=\"" + mathUtil.format(hsl[0], 4) + ", " + mathUtil.format(hsl[1], 4) + ", " + mathUtil.format(hsl[2], 4) + "\"\n";
808
                data += "  />\n";
809

    
810
                data += "</file:" + normalizeAsXMLTag(getName()) + ">\n";
811
                return data;
812
        }
813

    
814
        /**
815
         * Filters a string for being suitable as XML Tag, erasing
816
         * all not alphabetic or numeric characters.
817
         * @param s
818
         * @return string normalized
819
         */
820
        private String normalizeAsXMLTag(String s) {
821
                return s.replaceAll("[^a-zA-Z0-9]", "");
822
        }
823

    
824
        /*
825
         * (non-Javadoc)
826
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getAttributes()
827
         */
828
        public ArrayList<Object> getAttributes() {
829
                ArrayList<Object> attr = new ArrayList<Object>();
830
                if(!isOpen())
831
                        return attr;
832
                Object [][] a = {
833
                        {"Filename", getDataStore().getName()},
834
                        {"Filesize", new Long(getDataStore().getFileSize())},
835
                        {"Width", new Integer((int)getDataStore().getWidth())},
836
                        {"Height", new Integer((int)getDataStore().getHeight())},
837
                        {"Bands", new Integer(getDataStore().getBandCount())}
838
                };
839
                for (int i = 0; i < a.length; i++)
840
                        attr.add(a[i]);
841
                return attr;
842
        }
843

    
844

    
845
        /* (non-Javadoc)
846
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.operations.Cancellable)
847
         */
848
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
849
                        double scale, PrintAttributes propeties) throws ReadException {
850

    
851
                if (/*!isOpen() ||*/ !isVisible() || !isWithinScale(scale))
852
                        return;
853

    
854
                if (!mustTilePrint)
855
                        draw(null, g, viewPort, cancel,scale);
856
                else {
857
                        // Para no pedir imagenes demasiado grandes, vamos
858
                        // a hacer lo mismo que hace EcwFile: chunkear.
859
                        // Llamamos a drawView con cuadraditos m?s peque?os
860
                        // del BufferedImage ni caso, cuando se imprime viene con null
861
                        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
862
                        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
863

    
864
                        //Si es la primera lectura salvamos los valores de m?ximo y m?nimo para la aplicaci?n
865
                        //de realce si la imagen es de 16 bits.
866

    
867
                        //RasterStats stats = getSource().getFilterStack().getStats();
868
                        //if(stats != null)
869
                        //stats.history.add(stats.new History(getName(), stats.minBandValue, stats.maxBandValue, stats.secondMinBandValue, stats.secondMaxBandValue));
870

    
871

    
872
                        for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++)
873
                                // Parte que dibuja
874
                                try {
875
                                        ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
876
                                        draw(null, g, vp, cancel, scale);
877
                                } catch (NoninvertibleTransformException e) {
878
                                        throw new ReadException("Error en la transformaci?n.", e);
879
                                }
880
                }
881
        }
882

    
883
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
884
                        double scale) throws ReadException {
885
                if(!isOpen())
886
                        return;
887

    
888
                // Para no pedir imagenes demasiado grandes, vamos
889
                // a hacer lo mismo que hace EcwFile: chunkear.
890
                // Llamamos a drawView con cuadraditos m?s peque?os
891
                // del BufferedImage ni caso, cuando se imprime viene con null
892

    
893
                int numW, numH;
894
                int stepX, stepY;
895
                int xProv, yProv;
896
                int A = 1500;
897
                int H = 1500;
898
                int altoAux, anchoAux;
899

    
900
                AffineTransform mat = (AffineTransform) viewPort.getAffineTransform().clone();
901

    
902
                // Vamos a hacerlo en trozos de AxH
903
                Rectangle r = g.getClipBounds();
904
                numW = (r.width) / A;
905
                numH = (r.height) / H;
906

    
907
                double[] srcPts = new double[8];
908
                double[] dstPts = new double[8];
909

    
910
                yProv = r.y;
911
                for (stepY = 0; stepY < numH + 1; stepY++) {
912
                        if ((yProv + H) > r.getMaxY())
913
                                altoAux = (int) r.getMaxY() - yProv;
914
                        else
915
                                altoAux = H;
916

    
917
                        xProv = r.x;
918
                        for (stepX = 0; stepX < numW + 1; stepX++) {
919
                                if ((xProv + A) > r.getMaxX())
920
                                        anchoAux = (int) r.getMaxX() - xProv;
921
                                else
922
                                        anchoAux = A;
923

    
924
                                //Rectangle newRect = new Rectangle(xProv, yProv, anchoAux, altoAux);
925

    
926
                                // Parte que dibuja
927
                                srcPts[0] = xProv;
928
                                srcPts[1] = yProv;
929
                                srcPts[2] = xProv + anchoAux + 1;
930
                                srcPts[3] = yProv;
931
                                srcPts[4] = xProv + anchoAux + 1;
932
                                srcPts[5] = yProv + altoAux + 1;
933
                                srcPts[6] = xProv;
934
                                srcPts[7] = yProv + altoAux + 1;
935

    
936
                                try {
937
                                        mat.inverseTransform(srcPts, 0, dstPts, 0, 4);
938
                                        Rectangle2D.Double rectCuadricula = new Rectangle2D.Double(dstPts[0], dstPts[1], dstPts[2] - dstPts[0], dstPts[5] - dstPts[3]);
939
                                        // Extent extent = new Extent(rectCuadricula);
940

    
941
                                        Dimension tam = new Dimension(anchoAux + 1, altoAux + 1);
942
                                        ViewPort vp = (ViewPort)viewPort.clone();
943
                                        vp.setImageSize(tam);
944
                                        Envelope env = geomManager.createEnvelope(rectCuadricula
945
                                                        .getMinX(), rectCuadricula.getMinY(),
946
                                                        rectCuadricula.getMaxX(), rectCuadricula.getMaxY(),
947
                                                        SUBTYPES.GEOM2D);
948
                                        vp.setEnvelope(env);
949
                                        vp.setAffineTransform(mat);
950
                                        draw(null, g, vp, cancel, scale);
951

    
952
                                } catch (NoninvertibleTransformException e) {
953
                                        //throw new ReadDriverException("Error en la transformaci?n.", e);
954
                                } catch (ReadException e) {
955
                                        //throw new ReadDriverException("Error en la transformaci?n.", e);
956
                                } catch (CreateEnvelopeException e) {
957
                                        logger.error("Error creating the envelope", e);
958
                                } catch (CloneNotSupportedException e) {
959
                                        logger.error("Error cloning the viewport", e);
960
                                }
961
                                // Fin parte que dibuja
962
                                xProv = xProv + A;
963
                        }
964
                        yProv = yProv + H;
965
                }
966
        }
967

    
968
        /**
969
         * Borra de la lista de listeners el que se pasa como par?metro.
970
         *
971
         * @param o LayerListener a borrar.
972
         *
973
         * @return True si ha sido correcto el borrado del Listener.
974
         */
975
        public boolean removeLayerListener(LayerListener o) {
976
                if (this.isRemoveRasterFlag()) {
977
                        try {
978
                                enableClosed();
979
                        } catch (NotAvailableStateException e1) {
980
                                // No se ha podido cambiar el estado de la capa a cerrado
981
                        }
982
                }
983

    
984
                // Salva a RMF
985
                if (getDataStore() != null)
986
                        // Guardamos la GeoReferenciacion de cada dataset
987
                        try {
988
                                getDataStore().saveGeoreferencingToRmf();
989
                        } catch (Exception e) {
990
                                logger.info("error_salvando_rmf", e);
991
                        }
992

    
993
                        if (this.isRemoveRasterFlag()) {
994
                                image = null;
995
                                if (getDataStore() != null) {
996
                                        String[] files = getFileName().clone();
997

    
998
                                        try {
999
                                                getDataStore().close();
1000
                                        } catch (CloseException e) {
1001
                                        }
1002

    
1003
                                        dataStore = null;
1004
                                        if(render != null)
1005
                                                render.dispose();
1006
                                        render = null;
1007
                                        // System.gc();
1008
                                        this.setRemoveRasterFlag(true);
1009

    
1010
                                        for (int i = 0; i < files.length; i++) {
1011
                                                File file = new File(files[i]);
1012
                                                File dirTemp = fileUtil.getTemporalFile();
1013
                                                if(!file.exists())
1014
                                                        continue;
1015
                                                if (dirTemp.compareTo(file.getParentFile()) == 0) {
1016
                                                        file.delete();
1017

    
1018
                                                        // Borramos todos los ficheros que puedan tener relacion con el fichero actual
1019
                                                        String basefile = file.getName();
1020
                                                        File basepath = file.getParentFile();
1021
                                                        int last = basefile.lastIndexOf(".");
1022
                                                        if (last != -1)
1023
                                                                basefile = basefile.substring(0, last + 1);
1024
                                                        File[] list = basepath.listFiles();
1025
                                                        for (int j = 0; j < list.length; j++)
1026
                                                                if (list[j].getName().startsWith(basefile))
1027
                                                                        list[j].delete();
1028
                                                }
1029
                                        }
1030
                                }
1031
                        }
1032
                        updateDrawVersion();
1033
                        return super.layerListeners.remove(o);
1034
        }
1035

    
1036
        /*
1037
         * (non-Javadoc)
1038
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemoveRasterFlag()
1039
         */
1040
        public boolean isRemoveRasterFlag() {
1041
                return removeRasterFlag;
1042
        }
1043

    
1044
        /*
1045
         * (non-Javadoc)
1046
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#setRemoveRasterFlag(boolean)
1047
         */
1048
        public void setRemoveRasterFlag(boolean removeRasterFlag) {
1049
                this.removeRasterFlag = removeRasterFlag;
1050
        }
1051

    
1052
        /*
1053
         * (non-Javadoc)
1054
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#getTocImageIcon()
1055
         */
1056
        public String getTocImageIcon() {
1057
                return "map-ok-ico";
1058
        }
1059

    
1060
        /*
1061
         * (non-Javadoc)
1062
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getTileSize()
1063
         */
1064
        public int[] getTileSize() {
1065
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
1066
                return size;
1067
        }
1068

    
1069
        /*
1070
         * (non-Javadoc)
1071
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isTiled()
1072
         */
1073
        public boolean isTiled() {
1074
                return mustTileDraw;
1075
        }
1076

    
1077
        /*
1078
         * (non-Javadoc)
1079
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isGeoreferenced()
1080
         */
1081
        public boolean isGeoreferenced() {
1082
                return getDataStore().isGeoreferenced();
1083
        }
1084

    
1085
        /*
1086
         * (non-Javadoc)
1087
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getNoDataValue()
1088
         */
1089
        public NoData getNoDataValue() {
1090
                return getDataStore().getNoDataValue();
1091
        }
1092

    
1093
        /**
1094
         * Sets the nodata value for this layer
1095
         * @param nd
1096
         */
1097
        public void setNoDataValue(NoData nd) {
1098
                if (getDataStore() != null)
1099
                        getDataStore().setNoDataValue(nd);
1100
        }
1101

    
1102
        /*
1103
         * (non-Javadoc)
1104
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getPxHeight()
1105
         */
1106
        public double getPxHeight() {
1107
                return getDataStore().getHeight();
1108
        }
1109

    
1110
        /*
1111
         * (non-Javadoc)
1112
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getPxWidth()
1113
         */
1114
        public double getPxWidth() {
1115
                return getDataStore().getWidth();
1116
        }
1117

    
1118
        /**
1119
         * Gets the height in world coordinates of this raster layer
1120
         */
1121
        public double getWCHeight() {
1122
                return getFullEnvelope().getMaximum(1);
1123
        }
1124

    
1125
        /**
1126
         * Gets the width in world coordinates of this raster layer
1127
         */
1128
        public double getWCWidth() {
1129
                return getFullEnvelope().getMaximum(0);
1130
        }
1131

    
1132
        /**
1133
         * Gets the size of all files of this raster layer
1134
         */
1135
        public long[] getFileSize() {
1136
                if (getDataStore() == null)
1137
                        return null;
1138

    
1139
                return getDataStore().getFileSizeByProvider();
1140
        }
1141

    
1142
        /**
1143
         * Gets the list of file names
1144
         */
1145
        public String[] getFileName() {
1146
                if (getDataStore() == null)
1147
                        return null;
1148

    
1149
                return getDataStore().getURIByProvider();
1150
        }
1151

    
1152
        /**
1153
         * Returns the number of files in this raster layer
1154
         */
1155
        public int getFileCount() {
1156
                return getDataStore().getProviderCount();
1157
        }
1158

    
1159
        /*
1160
         * (non-Javadoc)
1161
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
1162
         */
1163
        public String getFileFormat() {
1164
                if(getDataStore().getSourceType() == RasterDataStore.FILE) {
1165
                        String fName = getDataStore().getName();
1166
                        int index = fName.lastIndexOf(".") + 1;
1167
                        String ext = null;
1168
                        if (index > 0)
1169
                                ext = fName.substring(fName.lastIndexOf(".") + 1, fName.length());
1170
                        return ext;
1171
                }
1172
                if(getDataStore().getSourceType() == RasterDataStore.POSTGIS) {
1173
                        return "POSTGIS";
1174
                }
1175
                return null;
1176
        }
1177

    
1178
        /*
1179
         * (non-Javadoc)
1180
         * @see org.gvsig.fmap.raster.IRasterOperations#getDatatype()
1181
         */
1182
        public int[] getDataType() {
1183
                return getDataStore().getDataType();
1184
        }
1185

    
1186
        /**
1187
         * Sets the filter list
1188
         */
1189
        public void setRenderFilterList(RasterFilterList filterList) {
1190
                getRender().setFilterList(filterList);
1191
        }
1192
        
1193
        /*
1194
         * (non-Javadoc)
1195
         * @see org.gvsig.fmap.mapcontext.layers.operations.InfoByPoint#getInfo(java.awt.Point, double, org.gvsig.tools.task.Cancellable, boolean)
1196
         */
1197
        public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException {
1198
                DynObjectSetRasterInfo info = new DynObjectSetRasterInfo();
1199
                
1200
                if (!isOpen()) {
1201
                        info.addField("Layer not open", normalizeAsXMLTag(getName()), 0);
1202
                        return info;
1203
                }
1204
                
1205
                Point2D pReal = new Point2D.Double(p.getX(), p.getY());
1206
                Point2D px = new Point2D.Double();
1207
                if(        pReal.getX() > this.getMinX() &&
1208
                        pReal.getX() < this.getMaxX() &&
1209
                        pReal.getY() > this.getMinY() &&
1210
                        pReal.getY() < this.getMaxY()) {
1211
                        px = transformPoint(pReal);
1212
                }
1213
                int[] rgb = getPixel((int) p.getX(), (int) p.getY());
1214
                ColorConversion conv = rManager.getColorConversion();
1215
                info.addField("File", normalizeAsXMLTag(getName()), 0);
1216
                info.addField("View Point", "[" + p.getX() + " , " + p.getY() + "]", 1);
1217
                info.addField("World Point", "[" + mathUtil.format(pReal.getX(), 3) + " , " + mathUtil.format(pReal.getY(), 3) + "]", 2);
1218
                if (px == null)
1219
                        info.addField("Pixel Point", "Out", 3);
1220
                else
1221
                        info.addField("Pixel Point", "[" + (int) px.getX() + ",  " + (int) px.getY() + "]", 3);
1222
                info.addField("RGB", "[" + rgb[1] + ",  " + rgb[2] + ",  " + rgb[3] + "]", 4);
1223
                double[] cmyk = conv.RGBtoCMYK(rgb[1] & 0xff, rgb[2] & 0xff, rgb[3] & 0xff, 1D);
1224
                info.addField("CMYK", "[" + mathUtil.format(cmyk[0], 4) + ",  " + mathUtil.format(cmyk[1], 4) + ",  " + mathUtil.format(cmyk[2], 4) + ",  " + mathUtil.format(cmyk[3], 4) + "]", 5);
1225
                double[] hsl = conv.RGBtoHSL(rgb[1] & 0xff, rgb[2] & 0xff, rgb[3] & 0xff);
1226
                hsl[0] = (int)(255.0 * hsl[0] / 360.0 + 0.5);
1227
                hsl[2] = (int) (hsl[2] * 255. + 0.5);
1228
                hsl[1] = (int) (hsl[1] * 255. + 0.5);
1229
                info.addField("HSL", "[" + mathUtil.format(hsl[0], 4) + ",  " + mathUtil.format(hsl[1], 4) + ",  " + mathUtil.format(hsl[2], 4) + "]", 6);
1230
                String data = "[";
1231
                try {
1232
                        if (px != null) {
1233
                                if(getDataType()[0] >= 0 && getDataType()[0] <= 3) {
1234
                                        for(int i = 0; i < getDataStore().getBandCount(); i++) {
1235
                                                if(getDataStore().isInside(pReal)) {
1236
                                                        Point2D pxAux = transformPoint(pReal);
1237
                                                        int val = ((Integer)getDataStore().getData((int)pxAux.getX(), 
1238
                                                                        (int)pxAux.getY(), i)).intValue();
1239
                                                        if(getDataType()[0] == Buffer.TYPE_BYTE)
1240
                                                                data += (val & 0x000000ff) + ",  ";
1241
                                                        else
1242
                                                                data += val + ",  ";
1243
                                                }
1244
                                        }
1245
                                }
1246
                                if(getDataType()[0] == 4) {
1247
                                        for(int i = 0; i < getDataStore().getBandCount(); i++) {
1248
                                                if(getDataStore().isInside(pReal)) {
1249
                                                        Point2D pxAux = transformPoint(pReal);
1250
                                                        data += ((Float)getDataStore().getData((int)pxAux.getX(), 
1251
                                                                        (int)pxAux.getY(), i)).floatValue() + ",  ";
1252
                                                }
1253
                                        }
1254
                                }
1255
                                if(getDataType()[0] == 5) {
1256
                                        for(int i = 0; i < getDataStore().getBandCount(); i++) {
1257
                                                if(getDataStore().isInside(pReal)) {
1258
                                                        Point2D pxAux = transformPoint(pReal);
1259
                                                        data += ((Double)getDataStore().getData((int)pxAux.getX(), 
1260
                                                                        (int)pxAux.getY(), i)).doubleValue() + ",  ";
1261
                                                }
1262
                                        }
1263
                                }
1264
                        }
1265
                        data +=  "]";
1266
                        info.addField("Band Value", data, 7);
1267
                } catch (RasterDriverException ex) {
1268
                        throw new LoadLayerException("Error en el acceso al dataset", ex);
1269
                } catch (InvalidSetViewException ex) {
1270
                        throw new LoadLayerException("Error en la asignaci?n de la vista en getData", ex);
1271
                } catch (FileNotOpenException ex) {
1272
                        throw new LoadLayerException("Fichero no abierto en el dataset", ex);
1273
                }
1274
                return info;
1275
        }
1276
        
1277
        /**
1278
         * Transforma un punto real a coordenadas pixel
1279
         * 
1280
         * @param numberBand
1281
         * @param pReal
1282
         * @return
1283
         * @throws LoadLayerException 
1284
         * @throws ReadDriverException
1285
         */
1286
        private Point2D transformPoint(Point2D pReal) throws LoadLayerException {
1287
                AffineTransform at = getDataStore().getAffineTransform();
1288
                Point2D px = new Point2D.Double();
1289
                //px = new Point2D.Double(pReal.getX(), pReal.getY());
1290
                try {
1291
                        at.inverseTransform(pReal, px);
1292
                        return px;
1293
                } catch (NoninvertibleTransformException e) {
1294
                        throw new LoadLayerException("Error en la transformaci?n del punto", e);
1295
                }
1296
        }
1297
        
1298
        /*
1299
         * (non-Javadoc)
1300
         * @see org.gvsig.fmap.raster.IRasterDataset#getInfo(java.lang.String)
1301
         */
1302
        public Object getInfo(String key) {
1303
                if (key.equals("DriverName"))
1304
                        return "gvSIG Raster Driver";
1305
                return null;
1306
        }
1307

    
1308
        /*
1309
         * (non-Javadoc)
1310
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getBandCountFromDataset()
1311
         */
1312
        public int[] getBandCountFromDataset() {
1313
                return getDataStore().getBandCountByProvider();
1314
        }
1315

    
1316
        /*
1317
         * (non-Javadoc)
1318
         * @see org.gvsig.raster.shared.IRasterOperations#getColourInterpretation(int, int)
1319
         */
1320
        public String getColorInterpretation(int band, int dataset) {
1321
                if (this.getDataStore().getColorInterpretation().get(band) == null)
1322
                        return "Undefined";
1323
                return this.getDataStore().getColorInterpretation().get(band);
1324
        }
1325

    
1326
        /*
1327
         * (non-Javadoc)
1328
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getWktProjection()
1329
         */
1330
        public String getWktProjection() throws RasterDriverException {
1331
                return getDataStore().getWktProjection();
1332
        }
1333

    
1334
        /*
1335
         * (non-Javadoc)
1336
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRGB()
1337
         */
1338
        public boolean isRGB() {
1339
                if ((getDataStore() == null) || (render == null))
1340
                        return false;
1341

    
1342
                if (getDataStore().getDataType()[0] != Buffer.TYPE_BYTE)
1343
                        return false;
1344

    
1345
                boolean R = false;
1346
                boolean G = false;
1347
                boolean B = false;
1348

    
1349
                int[] renderBands = render.getRenderBands();
1350
                for (int i = 0; i < renderBands.length; i++)
1351
                        if (renderBands[i] >= 0)
1352
                                switch (i) {
1353
                                        case 0:
1354
                                                R = true;
1355
                                                break;
1356
                                        case 1:
1357
                                                G = true;
1358
                                                break;
1359
                                        case 2:
1360
                                                B = true;
1361
                                                break;
1362
                                }
1363

    
1364
                if (R && G && B)
1365
                        return true;
1366

    
1367
                return false;
1368
        }
1369

    
1370
        /**
1371
         * Obtiene el grid de la capa completa. Hay que tener cuidado porque cuando se hace esta
1372
         * petici?n se carga un buffer con todos los datos de la capa. Este buffer puede ser
1373
         * cacheado o no dependiendo del tama?o de esta.
1374
         * @param interpolated true si se solicita un grid interpolado y false si se solicita sin interpolar.
1375
         * @return Grid.
1376
         * @throws InterruptedException
1377
         */
1378
        public Grid getFullGrid(boolean interpolated) throws GridException, InterruptedException {
1379
                RasterQuery query = rManager.createQuery();
1380
                query.setAllDrawableBands();
1381
                Buffer bf = null;
1382
                try {
1383
                        query.setAreaOfInterest();
1384
                        bf = getDataStore().query(query);
1385
                } catch (RasterDriverException e) {
1386
                        throw new GridException("Error reading buffer");
1387
                } catch (ProcessInterruptedException e) {
1388
                        throw new InterruptedException("Carga interrumpida");
1389
                } catch (InvalidSetViewException e) {
1390
                        throw new GridException("Error reading buffer");
1391
                }
1392
                return rManager.createGrid(bf, getDataStore(), interpolated);
1393
        }
1394

    
1395
        /*
1396
         * (non-Javadoc)
1397
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getReadOnlyFullGrid(boolean)
1398
         */
1399
        public Grid getReadOnlyFullGrid(boolean interpolated) throws GridException, InterruptedException {
1400
                RasterQuery query = rManager.createQuery();
1401
                query.setReadOnly(true);
1402
                query.setAllDrawableBands();
1403
                Buffer bf = null;
1404
                try {
1405
                        query.setAreaOfInterest();
1406
                        bf = getDataStore().query(query);
1407
                } catch (RasterDriverException e) {
1408
                        throw new GridException("Error reading buffer");
1409
                } catch (ProcessInterruptedException e) {
1410
                        throw new InterruptedException("Carga interrumpida");
1411
                } catch (InvalidSetViewException e) {
1412
                        throw new GridException("Error reading buffer");
1413
                }
1414
                return rManager.createGrid(bf, getDataStore(), interpolated);
1415
        }
1416

    
1417
        /**
1418
         * Obtiene el tama?o de celda de la fuente de datos
1419
         * @return double con el tama?o de celda
1420
         */
1421
        public double getCellSize() {
1422
                return (getDataStore() != null) ? getDataStore().getCellSize() : 1;
1423
        }
1424

    
1425
        /*
1426
         * (non-Javadoc)
1427
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1428
         */
1429
        public Extent getFullRasterExtent() {
1430
                return this.getDataStore().getExtent();
1431
        }
1432

    
1433

    
1434
        /**
1435
         * Devuelve el fichero asociado a la capa o null si no tiene.
1436
         * @return Fichero.
1437
         */
1438
        public File getFile() {
1439
                if(getDataStore().getParameters() instanceof RasterFileStoreParameters)
1440
                        return ((RasterFileStoreParameters)getDataStore().getParameters()).getFile();
1441
                return new File("");
1442
        }
1443

    
1444
        /**
1445
         * Consulta si un fichero es aceptado o no para este tipo de capa.
1446
         * @param file Fichero a consultar
1447
         * @return true si es aceptado y false si no lo es.
1448
         */
1449
        public boolean isFileAccepted(File file) {
1450
                return getDataStore().isFileSupported(file.getName());
1451
        }
1452
        
1453
        /**
1454
         * Consulta si un fichero es aceptado o no para este tipo de capa.
1455
         * @param file Fichero a consultar
1456
         * @return true si es aceptado y false si no lo es.
1457
         */
1458
        public static boolean isFileSupported(File file) {
1459
                return RasterLocator.getManager().isExtensionSupported(file.getName());
1460
        }
1461

    
1462
        /*
1463
         * (non-Javadoc)
1464
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#existColorTable()
1465
         */
1466
        public boolean existColorTable() {
1467
                return getRender().existColorTable();
1468
        }
1469

    
1470
        /**
1471
         * Returns true if the data store has an alpha band
1472
         */
1473
        public boolean existsAlphaBand() {
1474
                if(getDataStore().getColorInterpretation() != null)
1475
                        return getDataStore().getColorInterpretation().hasAlphaBand();
1476
                else
1477
                        return false;
1478
        }
1479

    
1480
        /*
1481
         * (non-Javadoc)
1482
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getAlphaBandNumber()
1483
         */
1484
        public int getAlphaBandNumber() {
1485
                if(getDataStore().getColorInterpretation() != null)
1486
                        return getDataStore().getColorInterpretation().getBand(ColorInterpretation.ALPHA_BAND);
1487
                return -1;
1488
        }
1489

    
1490
        /**
1491
         * Define la ultima leyenda valida de la capa o se pone a null para que la
1492
         * capa busque una leyenda valida.
1493
         * @param ct
1494
         */
1495
        public void setLastLegend(ColorTable ct) {
1496
                lastLegend = ColorTableLegend.createLegend(ct);
1497
        }
1498

    
1499
        /**
1500
         * Devuelve la Leyenda de la capa.
1501
         * @return Leyenda.
1502
         */
1503
        public ILegend getLegend() {
1504
                if (lastLegend != null)
1505
                        return lastLegend;
1506

    
1507
                return null;
1508
        }
1509

    
1510
        /*
1511
         * (non-Javadoc)
1512
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable#addLegendListener(com.iver.cit.gvsig.fmap.layers.LegendListener)
1513
         */
1514
        public void addLegendListener(LegendListener listener) {
1515
                layerChangeSupport.addLayerListener(listener);
1516
        }
1517

    
1518
        /*
1519
         *  (non-Javadoc)
1520
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable#getShapeType()
1521
         */
1522
        public int getShapeType() {
1523
                return TYPES.SURFACE;
1524
        }
1525

    
1526
        /*
1527
         * (non-Javadoc)
1528
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable#removeLegendListener(com.iver.cit.gvsig.fmap.layers.LegendListener)
1529
         */
1530
        public void removeLegendListener(LegendListener listener) {
1531
                if(layerChangeSupport != null)
1532
                        layerChangeSupport.removeLayerListener(listener);
1533
        }
1534

    
1535
        /*
1536
         * (non-Javadoc)
1537
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isInside(java.awt.geom.Point2D)
1538
         */
1539
        public boolean isInside(Point2D p) {
1540
                 return getDataStore().isInside(p);
1541
        }
1542

    
1543
        /*
1544
         * (non-Javadoc)
1545
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getAffineTransform()
1546
         */
1547
        public AffineTransform getAffineTransform() {
1548
                return getDataStore().getAffineTransform();
1549
        }
1550

    
1551
        /*
1552
         * (non-Javadoc)
1553
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#setAffineTransform(java.awt.geom.AffineTransform)
1554
         */
1555
        public void setAffineTransform(AffineTransform transf) {
1556
                if(transf == null)
1557
                        return;
1558
                affineTransformList.add(transf);
1559
                getDataStore().setAffineTransform(transf);
1560
                updateDrawVersion();
1561
        }
1562

    
1563
        /*
1564
         * (non-Javadoc)
1565
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#setAffineTransformWithoutHistorical(java.awt.geom.AffineTransform)
1566
         */
1567
        public void setAffineTransformWithoutHistorical(AffineTransform transf) {
1568
                getDataStore().setAffineTransform(transf);
1569
                updateDrawVersion();
1570
        }
1571

    
1572
        /*
1573
         * (non-Javadoc)
1574
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getAffineTransformHistorical()
1575
         */
1576
        public Historical getAffineTransformHistorical() {
1577
                return this.affineTransformList;
1578
        }
1579

    
1580
        /*
1581
         * (non-Javadoc)
1582
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#saveGeoToRmf()
1583
         */
1584
        public void saveGeoToRmf() throws RmfSerializerException {
1585
                if (!isOpen())
1586
                        return;
1587

    
1588
                getDataStore().saveGeoreferencingToRmf();
1589
                
1590
                affineTransformList.clear();
1591
                affineTransformList.add(this.getAffineTransform());
1592
        }
1593

    
1594
        /*
1595
         * (non-Javadoc)
1596
         * @see org.gvsig.fmap.raster.layers.IRasterLayerActions#isActionEnabled(int)
1597
         */
1598
        public boolean isActionEnabled(int action) {
1599
                switch (action) {
1600
                        case IRasterLayerActions.BANDS_FILE_LIST:
1601
                                if (existColorTable() || getDataStore().isMosaic() || getDataStore().isTiled())
1602
                                        return false;
1603
                                break;
1604
                        case IRasterLayerActions.BANDS_RGB:
1605
                                if (existColorTable())
1606
                                        return false;
1607
                                break;
1608
                        case IRasterLayerActions.REPROJECT:
1609
                                if (!isReproyectable())
1610
                                        return false;
1611
                                break;
1612
                        case IRasterLayerActions.CREATEOVERVIEWS:
1613
                                return overviewsSupport();
1614
                        case IRasterLayerActions.OPACITY:
1615
                        case IRasterLayerActions.TRANSPARENCY:
1616
                        case IRasterLayerActions.BRIGHTNESSCONTRAST:
1617
                        case IRasterLayerActions.ENHANCED:
1618
                        case IRasterLayerActions.PANSHARPENING:
1619
                        case IRasterLayerActions.SELECT_LAYER:
1620
                        case IRasterLayerActions.SAVE_COLORINTERP:
1621
                                return true;
1622
                        case IRasterLayerActions.REMOTE_ACTIONS:
1623
                                return false;
1624
                        case IRasterLayerActions.TAILTRIM:
1625
                        case IRasterLayerActions.GEOLOCATION:
1626
                                return !(getDataStore().isTiled());
1627
                }
1628
                return true;
1629
        }
1630

    
1631
        /*
1632
         * (non-Javadoc)
1633
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setVisible(boolean)
1634
         */
1635
        public void setVisible(boolean visibility) {
1636
                if(visibility)
1637
                        state.disableStopped();
1638
                else
1639
                        enableStopped();
1640

    
1641
                if(isAwake() || isClosed())
1642
                        try {
1643
                                this.load();
1644
                        } catch (LoadLayerException e) {
1645
                                e.printStackTrace();
1646
                        }
1647

    
1648
                /*
1649
                 * Cuando se modifica la visibilidad de una capa raster se hace un updateDrawVersion de todas las
1650
                 * capas raster de ese MapContext. Esto es porque la estrategia utilizada por RasterDrawStrategy hace
1651
                 * que se cacheen en blanco las capas raster que est?n ocultas debajo de otras. Al hacer invisibles las
1652
                 * de arriba la cache que estaba en blanco hace que no se pinte nada. Para evitar esto las marcamos todas
1653
                 * como que han sido modificadas para que se vuelvan a leer.
1654
                 */
1655
                if(getMapContext() != null) {
1656
                        ArrayList<FLayer> listLayers = new ArrayList<FLayer>();
1657
                        listLayers = RasterDrawStrategy.getLayerList(getMapContext().getLayers(), listLayers);
1658
                        for (int i = 0; i < listLayers.size(); i++)
1659
                                if(listLayers.get(i) instanceof DefaultFLyrRaster)
1660
                                        ((DefaultFLyrRaster)listLayers.get(i)).updateDrawVersion();
1661
                }
1662

    
1663
                super.setVisible(visibility);
1664
        }
1665

    
1666
        /**
1667
         * Consulta la transparencia asignada en la ?ltima renderizaci?n de la capa
1668
         * @return valor de transparencia
1669
         */
1670
        public int getTransparency() {
1671
                try {
1672
                        return getRender().getLastTransparency().getOpacity();
1673
                } catch (NullPointerException e) {
1674
                        return super.getTransparency();
1675
                }
1676
        }
1677

    
1678
        /**
1679
         * Consulta si tiene aplicada alguna transparencia en la ?ltima renderizaci?n
1680
         * o no.
1681
         * @return true si se aplic? alguna transparencia en la ?ltima renderizaci?n.
1682
         */
1683
        public boolean isTransparent() {
1684
                return getRender().getLastTransparency().isTransparencyActive();
1685
        }
1686

    
1687
        /**
1688
         * Asigna la transparencia de la siguiente renderizaci?n
1689
         * @param valor de transparencia
1690
         */
1691
        public void setTransparency(int trans) {
1692
                super.setTransparency(trans);
1693
                try {
1694
                        getRender().getLastTransparency().setOpacity(trans);
1695
                } catch (NullPointerException e) {
1696
                        //Solo asigna la transparencia a la clase padre y no a la renderizaci?n
1697
                }
1698
        }
1699

    
1700
        /**
1701
         * Gets the last buffer which was rendered
1702
         */
1703
        public Buffer getLastRenderBuffer() {
1704
                return getRender().getLastRenderBuffer();
1705
        }
1706

    
1707
        /**
1708
         *
1709
         * @return ROIs asociadas a la capa raster.
1710
         */
1711
        public ArrayList<ROI> getRois() {
1712
                return rois;
1713
        }
1714

    
1715
        /**
1716
         * Establece las ROI asociadas a la capa raster.
1717
         *
1718
         * @param rois ArrayList de ROIs a asociar a la capa raster.
1719
         */
1720
        public void setRois(ArrayList<ROI> rois) {
1721
                this.rois = rois;
1722
        }
1723

    
1724
        /**
1725
         * Si ya tiene una estrategia de dibujado de raster calculada la devuelve, sino
1726
         * devolver? null.
1727
         * @return TreeMap con la lista de capas a dibujar
1728
         */
1729
        public HashMap<DefaultFLyrRaster, Boolean> getRasterStrategy() {
1730
                if(strategy != null)
1731
                        return strategy.getStrategy();
1732
                return null;
1733
        }
1734

    
1735
        /**
1736
         * @return the configuration
1737
         */
1738
        static public IConfiguration getConfiguration() {
1739
                return configuration;
1740
        }
1741

    
1742
        /**
1743
         * @param configuration the configuration to set
1744
         */
1745
        static public void setConfiguration(IConfiguration configuration) {
1746
                DefaultFLyrRaster.configuration = configuration;
1747
        }
1748

    
1749
        /*
1750
         * (non-Javadoc)
1751
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#reload()
1752
         */
1753
        public void reload() throws ReloadLayerException {
1754
                try {
1755
                        super.reload();
1756
                        if (getMapContext() == null)
1757
                                return;
1758
                        if (isStopped())
1759
                                disableStopped();
1760
                        load();
1761
                        getMapContext().invalidate();
1762
                } catch (LoadLayerException e) {
1763
                        setAvailable(false);
1764
                        throw new ReloadLayerException(getName(), e);
1765
                }
1766
        }
1767

    
1768
        /**
1769
         * Devuelve si la capa tiene soporte para poder generar overviews
1770
         * @return
1771
         */
1772
        public boolean overviewsSupport() {
1773
                if ((getDataStore() != null) && (getDataStore().overviewsSupport()))
1774
                        return true;
1775

    
1776
                return false;
1777
        }
1778

    
1779
        /**
1780
         * Devuelve si la asignacion de las bandas a renderizar representa una capa
1781
         * en escala de grises
1782
         * @return
1783
         */
1784
        public boolean isRenderingAsGray() {
1785
                int[] renderBands = getRender().getRenderBands();
1786
                if ((renderBands != null) && (renderBands.length == 3) && (renderBands[0] >= 0) &&
1787
                                (renderBands[0] == renderBands[1]) && (renderBands[1] == renderBands[2]))
1788
                        return true;
1789
                return false;
1790
        }
1791

    
1792
        /*
1793
         * (non-Javadoc)
1794
         * @see org.gvsig.raster.grid.render.VisualPropertyListener#actionValueChanged(org.gvsig.raster.grid.render.VisualPropertyEvent)
1795
         */
1796
        public void visualPropertyValueChanged(VisualPropertyEvent e) {
1797
                updateDrawVersion();
1798
        }
1799

    
1800
        /*
1801
         * (non-Javadoc)
1802
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#adjustWorldRequest(java.awt.geom.Point2D)
1803
         */
1804
        public Point2D adjustWorldRequest(Point2D req) {
1805
                Envelope ext = null;
1806

    
1807
                ext = getFullEnvelope();
1808
                req.setLocation(Math.max(ext.getMinimum(0), req.getX()), Math.max(ext.getMinimum(1), req.getY()));
1809
                req.setLocation(Math.min(ext.getMaximum(0), req.getX()), Math.min(ext.getMaximum(1), req.getY()));
1810
                return req;
1811
        }
1812

    
1813
        /*
1814
         * (non-Javadoc)
1815
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
1816
         */
1817
        public FLayer cloneLayer() throws Exception {
1818
                RasterDataStore  ds = getDataStore().cloneDataStore();
1819
                DefaultFLyrRaster newLayer = new DefaultFLyrRaster();
1820
                newLayer.setName(getName());
1821
                newLayer.setOpenRasterStore(ds);
1822
                newLayer.firstLoad = firstLoad;
1823
                
1824
                List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
1825

    
1826
                //Hacemos una copia de las bandas a renderizar
1827
                if(getRender().getRenderBands() != null) {
1828
                        int[] rb = new int[getRender().getRenderBands().length];
1829
                        for (int i = 0; i < rb.length; i++)
1830
                                rb[i] = getRender().getRenderBands()[i];
1831
                        newLayer.getRender().setRenderBands(rb);
1832
                }
1833

    
1834
                //Asignamos el entorno
1835
                if(newLayer.getRender().getFilterList() == null)
1836
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1837
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1838
                newLayer.getRender().getFilterList().setStatus(filters);
1839

    
1840
                // Asignamos los valores noData del original
1841
                newLayer.setNoDataValue(getNoDataValue());
1842
                if(getDataStore().getNoDataValue().isDefined())
1843
                        newLayer.setNoDataTransparent(true);
1844
                newLayer.enableOpen();
1845
                
1846
                return newLayer;
1847
        }
1848
        
1849
        /*
1850
         * (non-Javadoc)
1851
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileLayer()
1852
         */
1853
        public FLayer getFileLayer() throws RasterDriverException {
1854
                try {
1855
                        return cloneLayer();
1856
                } catch (Exception e) {
1857
                }
1858
                return null;
1859
        }
1860
        
1861
        /*
1862
         * (non-Javadoc)
1863
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#addFile(java.lang.String)
1864
         */
1865
        public void addFile(String file) throws InvalidSourceException {
1866
                getDataStore().addFile(file);
1867
        }
1868
        
1869
        /*
1870
         * (non-Javadoc)
1871
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#removeFile(java.lang.String)
1872
         */
1873
        public void removeFile(String file) {
1874
                getDataStore().removeFile(file);
1875
        }
1876

    
1877
        /*****************************************************/
1878

    
1879
        public void disableStopped() {
1880
                if(state != null)
1881
                        state.disableStopped();
1882
        }
1883

    
1884
        public void enableAwake() throws NotAvailableStateException {state.enableAwake();}
1885

    
1886
        public void enableClosed() throws NotAvailableStateException {
1887
                if(state != null)
1888
                        state.enableClosed();
1889
        }
1890

    
1891
        public void enableOpen() throws NotAvailableStateException {state.enableOpen();}
1892

    
1893
        public void enableStopped() {state.enableStopped();}
1894

    
1895
        public boolean isAwake() {return state.isAwake();}
1896

    
1897
        public boolean isClosed() {return state.isClosed();}
1898

    
1899
        public boolean isOpen() {return state.isOpen();}
1900

    
1901
        public boolean isStopped() {return state.isStopped();}
1902

    
1903

    
1904
        @SuppressWarnings("unchecked")
1905
        public Set getMetadataChildren() {
1906
                return null;
1907
        }
1908

    
1909
        public Object getMetadataID() {
1910
                return getName();
1911
        }
1912

    
1913
        public String getMetadataName() {
1914
                return null;
1915
        }
1916

    
1917
        /*
1918
         * (non-Javadoc)
1919
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getDataStore()
1920
         */
1921
        public RasterDataStore getDataStore() {
1922
                if(dataStore != null) {
1923
                        RasterDataParameters params = (RasterDataParameters)dataStore.getParameters();
1924
                        if (getCoordTrans() != null && params.getReprojectionOption() == RasterDataParameters.ON_THE_FLY) {
1925
                                this.dataStore.setCoordTrans(getCoordTrans());
1926
                        }
1927
                }
1928
                return this.dataStore;
1929
        }
1930
        
1931
        /*
1932
         * (non-Javadoc)
1933
         * @see org.cresques.geo.Projected#getProjection()
1934
         */
1935
        public IProjection getProjection() {
1936
                RasterDataParameters p = (RasterDataParameters)getDataStore().getParameters();
1937
                if(p.getReprojectionOption() == RasterDataParameters.DONT_CHANGE_PROJECTION)
1938
                        return null;
1939
                return getDataStore().getProjection();
1940
        }
1941

    
1942
        public void setOpenRasterStore(DataStore dataStore) throws LoadLayerException {
1943
                if(dataStore instanceof CoverageStoreProviderServices) {
1944
                        try {
1945
                                this.dataStore = rManager.open(((CoverageStoreProviderServices) dataStore).getProvider(), dataStore.getParameters());
1946
                        } catch (NotSupportedExtensionException e) {
1947
                                throw new LoadLayerException("Extension not supported", e);
1948
                        } catch (RasterDriverException e) {
1949
                                throw new LoadLayerException("Error opening the DataStore", e);
1950
                        }
1951
                } else
1952
                        this.dataStore = (RasterDataStore) dataStore;
1953
                try {
1954
                        enableAwake();
1955
                } catch (NotAvailableStateException e) {
1956
                        throw new LoadLayerException("Fallo el estado de open. Closed=" + isClosed() + " Active=" + isOpen(), e);
1957
                }
1958
                setProjection(getDataStore().getProjection());
1959
        }
1960
        
1961
        /*
1962
         * (non-Javadoc)
1963
         * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
1964
         */
1965
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
1966
                setOpenRasterStore(dataStore);
1967
                load();
1968
        }
1969
        
1970
        /*
1971
         * (non-Javadoc)
1972
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
1973
         */
1974
        public boolean isRemote() {
1975
                return false;
1976
        }
1977
        
1978
        /**
1979
         * Returns true if exists a process reading data from this layer
1980
         * @return
1981
         */
1982
        public boolean isReadingData() {
1983
                return readingData != null;
1984
        }
1985

    
1986
        /**
1987
         * When a process is using information of this layer this variable will contain
1988
         * the thread ID.
1989
         * @param readingData
1990
         */
1991
        public synchronized void setReadingData(String readingData) {
1992
                this.readingData = readingData;
1993
        }
1994
        
1995
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1996
                        boolean fast)
1997
                        throws LoadLayerException, DataException {
1998
                return null;
1999
        }
2000

    
2001
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel)
2002
                        throws LoadLayerException, DataException {
2003
                return null;
2004
        }
2005

    
2006
        @Override
2007
        protected void doDispose() throws BaseException {
2008
                if(render != null)
2009
                        render.dispose();
2010
                if(getDataStore() != null)
2011
                        getDataStore().dispose();
2012
                finalize();
2013
        }
2014

    
2015
        /*
2016
         * (non-Javadoc)
2017
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#getZoomLevel()
2018
         */
2019
        public int getZoomLevel() {
2020
                return zoomLevel;
2021
        }
2022

    
2023
        /*
2024
         * (non-Javadoc)
2025
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#setZoomLevel(int)
2026
         */
2027
        public void setZoomLevel(int zoomLevel) {
2028
                this.zoomLevel = zoomLevel;
2029
        }
2030
        
2031
        /*
2032
         * (non-Javadoc)
2033
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#increaseZoomLevel()
2034
         */
2035
        public boolean increaseZoomLevel() {
2036
                if(zoomLevel < (this.getDataStore().getZoomLevels() - 1)) { 
2037
                        zoomLevel ++;
2038
                        recalcLevel = false;
2039
                        return true;
2040
                }
2041
                return false;
2042
        }
2043
        
2044
        /*
2045
         * (non-Javadoc)
2046
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#decreaseZoomLevel()
2047
         */
2048
        public boolean decreaseZoomLevel() {
2049
                if(zoomLevel > 0) { 
2050
                        zoomLevel --;
2051
                        recalcLevel = false;
2052
                        return true;
2053
                }
2054
                return false;
2055
        }
2056
        
2057
        /*
2058
         * (non-Javadoc)
2059
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
2060
         */
2061
        public Envelope getCoordsInLevel(Point2D center, int level, int w, int h) throws CreateEnvelopeException {
2062
                Extent ex = getDataStore().getCoordsInLevel(center, level, w, h);
2063
                return geomManager.createEnvelope(ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), SUBTYPES.GEOM2D);
2064
        }
2065
        
2066
        /*
2067
         * (non-Javadoc)
2068
         * @see org.gvsig.fmap.mapcontext.layers.Multiresolution#isEnabledMultiresolution()
2069
         */
2070
        public boolean isEnabledMultiresolution() {
2071
                return getDataStore().isTiled();
2072
        }
2073
        
2074
        /*
2075
         * (non-Javadoc)
2076
         * @see org.gvsig.raster.fmap.layers.Multiresolution#setTileServer(java.lang.Class)
2077
         */
2078
        public void setTileServer(Class<?> tileServer) throws InitializeException {
2079
                getDataStore().setTileServer(tileServer);
2080
        }
2081
        
2082
        @SuppressWarnings("unchecked")
2083
        @Override
2084
        public void loadFromState(PersistentState state)
2085
                        throws PersistenceException {
2086
                super.loadFromState(state);
2087
                
2088
                //this.status = (IStatusRaster)state.get("status");
2089
                List<ROI> rois = state.getList("rois");
2090
                if(rois != null) {
2091
                        this.rois = new ArrayList<ROI>();
2092
                        this.rois.addAll(rois);
2093
                }
2094
                this.zoomLevel = state.getInt("zoomLevel");
2095
                this.recalcLevel = state.getBoolean("recalcLevel");
2096
                if(getDataStore() == null)
2097
                        this.dataStore = (RasterDataStore)state.get("rasterdatastore");
2098
                this.lastLegend = (ILegend)state.get("legend");
2099
                this.colorTableLoadedFromProject = (ColorTable)state.get("colortable");
2100
                this.zoomLevel = state.getInt("zoomLevel");
2101
                this.recalcLevel = state.getBoolean("recalcLevel");
2102
                loadedFromProject = true;
2103
        }
2104

    
2105
        @Override
2106
        public void saveToState(PersistentState state) throws PersistenceException {
2107
                super.saveToState(state);
2108
                
2109
                //state.set("status", status);
2110
                state.set("rasterdatastore", getDataStore());        
2111
                state.set("legend", lastLegend);        
2112
                state.set("rois", rois);        
2113
                state.set("colortable", getRender().getColorTable());        
2114
                state.set("zoomLevel", zoomLevel);        
2115
                state.set("recalcLevel", recalcLevel);        
2116
        }        
2117
        
2118
        public static void registerPersistence() {
2119
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
2120
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
2121
                if( definition == null ) {
2122
                        if (manager.getDefinition(FLyrDefault.class) == null) {
2123
                                FLyrDefault.registerPersistent();
2124
                        }
2125
                        definition = manager.addDefinition(
2126
                                        DefaultFLyrRaster.class,
2127
                                        PERSISTENT_NAME,
2128
                                        PERSISTENT_DESCRIPTION,
2129
                                        null, 
2130
                                        null
2131
                        );
2132
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
2133
                        
2134
                        registerPersistence(definition);
2135
                }
2136
        }
2137
        
2138
        public static void registerPersistence(DynStruct definition) {
2139
                //definition.addDynFieldObject("status").setClassOfValue(StatusLayerRaster.class).setMandatory(false);
2140
                definition.addDynFieldObject("rasterdatastore").setClassOfValue(RasterDataStore.class).setMandatory(true);
2141
                definition.addDynFieldObject("legend").setClassOfValue(ILegend.class).setMandatory(false);
2142
                definition.addDynFieldList("rois").setClassOfItems(ROI.class).setMandatory(false);
2143
                definition.addDynFieldObject("colortable").setClassOfValue(ColorTable.class).setMandatory(false);
2144
                definition.addDynFieldInt("zoomlevel").setMandatory(false);
2145
                definition.addDynFieldBoolean("recalcLevel").setMandatory(false);
2146
        }
2147

    
2148
        /*
2149
         * (non-Javadoc)
2150
         * @see org.gvsig.fmap.mapcontext.layers.operations.Classifiable#getGeometryType()
2151
         */
2152
        public GeometryType getGeometryType() throws ReadException {
2153
                try {
2154
                        return GeometryLocator.getGeometryManager().getGeometryType(TYPES.SURFACE, SUBTYPES.GEOM2D);
2155
                } catch (GeometryTypeNotSupportedException e) {
2156
                        throw new ReadException(getDataStore().getName(), e);
2157
                } catch (GeometryTypeNotValidException e) {
2158
                        throw new ReadException(getDataStore().getName(), e);
2159
                } 
2160
        }
2161
        
2162
        /*
2163
         * (non-Javadoc)
2164
         * @see java.lang.Object#finalize()
2165
         */
2166
        protected void finalize() {
2167
                layerChangeSupport             = null;
2168
                state                          = null;
2169
                lastLegend                     = null;
2170
                colorTableLoadedFromProject    = null;
2171
                if(rois != null) {
2172
                        rois.clear();
2173
                        rois = null;
2174
                }
2175
                strategy                       = null;
2176
                configuration                  = null;
2177
                image                          = null;
2178
                fileUtil                       = null;
2179
                rasterUtil                     = null;
2180
                crsUtil                        = null;
2181
                mathUtil                       = null;
2182
                uri                            = null;
2183
                affineTransformList            = null;
2184
                readingData                    = null;
2185
                dataStore                      = null;
2186
                render                         = null;
2187
        }
2188

    
2189
        public void setDataStore(DataStore dataStore, String domain)
2190
                        throws LoadLayerException {
2191
                setDataStore(dataStore);
2192
        }
2193

    
2194
}