Statistics
| Revision:

root / trunk / extensions / extRasterTools-SE / src / org / gvsig / fmap / layers / FLyrRasterSE.java @ 12182

History | View | Annotate | Download (30.5 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.fmap.layers;
20

    
21
import java.awt.Dimension;
22
import java.awt.Graphics2D;
23
import java.awt.Point;
24
import java.awt.Rectangle;
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.NoninvertibleTransformException;
27
import java.awt.geom.Point2D;
28
import java.awt.geom.Rectangle2D;
29
import java.awt.image.BufferedImage;
30
import java.io.File;
31
import java.io.IOException;
32
import java.lang.reflect.Constructor;
33
import java.lang.reflect.InvocationTargetException;
34
import java.util.ArrayList;
35

    
36
import javax.print.attribute.PrintRequestAttributeSet;
37
import javax.swing.ImageIcon;
38

    
39
import org.cresques.cts.IProjection;
40
import org.gvsig.raster.RasterLibrary;
41
import org.gvsig.raster.buffer.BufferFactory;
42
import org.gvsig.raster.dataset.FileNotOpenException;
43
import org.gvsig.raster.dataset.IBuffer;
44
import org.gvsig.raster.dataset.IStatistics;
45
import org.gvsig.raster.dataset.InvalidSetViewException;
46
import org.gvsig.raster.dataset.MultiRasterDataset;
47
import org.gvsig.raster.dataset.NotSupportedExtensionException;
48
import org.gvsig.raster.dataset.RasterDataset;
49
import org.gvsig.raster.dataset.RasterDriverException;
50
import org.gvsig.raster.dataset.properties.DatasetMetadata;
51
import org.gvsig.raster.grid.Grid;
52
import org.gvsig.raster.grid.GridPalette;
53
import org.gvsig.raster.grid.GridTransparency;
54
import org.gvsig.raster.grid.filter.RasterFilterList;
55
import org.gvsig.raster.grid.filter.RasterFilterListManager;
56
import org.gvsig.raster.grid.filter.bands.ColorTableListManager;
57
import org.gvsig.raster.grid.filter.enhancement.EnhancementListManager;
58
import org.gvsig.raster.grid.render.Rendering;
59
import org.gvsig.raster.shared.Extent;
60
import org.gvsig.raster.shared.IRasterDataset;
61
import org.gvsig.raster.shared.IRasterProperties;
62
import org.gvsig.raster.shared.ViewPortData;
63

    
64
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
65
import com.iver.andami.PluginServices;
66
import com.iver.andami.messages.NotificationManager;
67
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
68
import com.iver.cit.gvsig.fmap.MapControl;
69
import com.iver.cit.gvsig.fmap.ViewPort;
70
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
71
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
72
import com.iver.cit.gvsig.fmap.layers.LayerListener;
73
import com.iver.cit.gvsig.fmap.layers.Tiling;
74
import com.iver.cit.gvsig.fmap.layers.XMLException;
75
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
76
import com.iver.cit.gvsig.fmap.layers.layerOperations.StringXMLItem;
77
import com.iver.cit.gvsig.fmap.layers.layerOperations.XMLItem;
78
import com.iver.cit.gvsig.project.documents.view.gui.IView;
79
import com.iver.cit.gvsig.project.documents.view.gui.View;
80
import com.iver.utiles.XMLEntity;
81
import com.iver.utiles.swing.threads.Cancellable;
82
/**
83
 * Capa raster
84
 * @author Nacho Brodin (nachobrodin@gmail.com)
85
 */
86
public class FLyrRasterSE extends FLyrDefault implements IRasterProperties, IRasterDataset, InfoByPoint {
87
        boolean                       isPrinting         = false;
88
        boolean                       mustTileDraw       = false;
89
        boolean                       mustTilePrint      = true;
90
        private int                   maxTileDrawWidth   = 200;
91
        private int                   maxTileDrawHeight  = 200;
92
        int                           maxTilePrintWidth  = 1500;
93
        int                           maxTilePrintHeight = 1500;
94
        private StatusRasterInterface status             = null;
95
        private boolean               firstLoad          = false;
96
        private boolean               removeRasterFlag   = true;
97
        private Object                params             = null;
98
        private MultiRasterDataset    dataset            = null;
99
        private Rendering             render             = null;
100
        private BufferFactory         bufferFactory      = null;
101
        private int                   posX               = 0;
102
        private int                   posY               = 0;
103
        private double                posXWC             = 0;
104
        private int                   posYWC             = 0;
105
        private int                   r                  = 0;
106
        private int                   g                  = 0;
107
        private int                   b                  = 0;
108

    
109
        static {
110
                 RasterLibrary.wakeUp();
111
        }
112

    
113
        /**
114
         * Crea una capa Raster a partir del nombre driver, fichero y proyecci?n.
115
         * @param layerName Nombre de la capa.
116
         * @param d RasterDriver.
117
         * @param f Fichero.
118
         * @param proj Proyecci?n.
119
         * @return Nueva capa de tipo raster.
120
         * @throws DriverIOException
121
         */
122
        public static FLyrRasterSE createLayer(String layerName, Object params,
123
                        IProjection proj) throws LoadLayerException {
124
                FLyrRasterSE capa = new FLyrRasterSE();
125
                capa.setLoadParams(params);
126
                capa.setName(layerName);
127
                capa.setProjection(proj);
128
                capa.load();
129
                return capa;
130
        }
131

    
132
        /**
133
         * Asigna los par?metros para la carga de la capa
134
         * @param param Par?metros.
135
         */
136
        public void setLoadParams(Object param){
137
                this.params = param;
138
        }
139

    
140
        /**
141
         * Obtiene los par?metros para la carga de la capa
142
         * @return param Par?metros.
143
         */
144
        public Object getLoadParams() {
145
                return params;
146
        }
147
        
148
        /**
149
         * Redefine wakeUp de FLyrDefault
150
         */
151
        public void wakeUp(){
152
        }
153

    
154
        /**
155
         * Asignar el estado del raster
156
         * @param status
157
         */
158
        public void setStatus(StatusRasterInterface status){
159
                this.status = status;
160
        }
161

    
162
        /**
163
         * Obtiene el estado del raster
164
         * @return
165
         */
166
        public StatusRasterInterface getStatus(){
167
                return this.status;
168
        }
169

    
170
        /*
171
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#load()
172
         */
173
        public void load() throws LoadLayerException{
174
                if (getProjection() != null) {
175
                        String fName = null;
176
                        int test = -1;
177
                        if (params != null && params instanceof File) {
178
                                fName = ((File) params).getAbsolutePath();
179
                                test = fName.indexOf("ecwp:");
180
                        }
181

    
182
                        if (test != -1) {
183
                                String urlECW = fName.substring(test + 6);
184
                                fName = "ecwp://" + urlECW;
185
                                System.err.println(test + " " + fName);
186
                        }
187

    
188
                        try {
189
                                if (params == null || params instanceof File)
190
                                        dataset = MultiRasterDataset.open(getProjection(), fName);
191
                                else
192
                                        dataset = MultiRasterDataset.open(getProjection(), params);
193
                        } catch (NotSupportedExtensionException e) {
194
                                throw new LoadLayerException("Formato no valido", e);
195
                        } catch (RasterDriverException e) {
196
                                throw new LoadLayerException("Formato no valido", e);
197
                        }
198
                        if (dataset == null)
199
                                throw new LoadLayerException("Formato no valido", new IOException());
200
                        bufferFactory = new BufferFactory(dataset);
201
                        getRender();
202
                        initFilters();
203
                } else
204
                        throw new LoadLayerException("Proyecci?n no asignada", new IOException());
205
        }
206

    
207
        /**
208
         * Crea el objeto renderizador de raster
209
         * @return Rendering 
210
         */
211
        public Rendering getRender() {
212
                if (render == null)
213
                        render = new Rendering(bufferFactory);
214
                return render;
215
        }
216

    
217
        /**
218
         * Filtros a?adidos por defecto en la pila para visualizaci?n.
219
         */
220
        private void initFilters() {
221
                RasterFilterList filterList = new RasterFilterList();
222
                filterList.addParam("IStatistics", getGeoRasterMultiDataset().getStatistics());
223
                filterList.addParam("MultiRasterDataset", getGeoRasterMultiDataset());
224
                filterList.setInitDataType(getDataType()[0]);
225
                RasterFilterListManager filterManager = new RasterFilterListManager(filterList);
226

    
227
                if (this.getGeoRasterMultiDataset().getPalettes()[0] != null) {
228
                        GridPalette p = new GridPalette(getGeoRasterMultiDataset().getPalettes()[0]);
229
                        ColorTableListManager ctm = new ColorTableListManager(filterManager);
230
                        ctm.addColorTableFilter(p);
231
                } else {
232
                        if (getDataType()[0] != IBuffer.TYPE_BYTE) {
233
                                IStatistics stats = getGeoRasterMultiDataset().getStatistics();
234
                                EnhancementListManager elm = new EnhancementListManager(filterManager);
235
                                elm.addEnhancedFilter(false, stats, 0.0, getRender().getRenderBands());
236
                        }
237
                }
238

    
239
                getRender().setFilterList(filterList);
240
        }
241

    
242
        /**
243
         * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#draw(java.awt.image.BufferedImage,
244
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort,
245
         *                 com.iver.utiles.swing.threads.Cancellable)
246
         */
247
        public void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel, double scale) {
248
                if (isWithinScale(scale)) {
249

    
250
                        if (status != null && firstLoad) {
251
                                if (mustTileDraw) {
252
                                        Point2D p = vp.getOffset();
253
                                        Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), vp.getImageWidth(), vp.getImageHeight());
254
                                        Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
255
                                        tiles.setAffineTransform((AffineTransform) vp.getAffineTransform().clone());
256
                                        for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
257
                                                // drawing part
258
                                                try {
259
                                                        ViewPort vport = tiles.getTileViewPort(vp, tileNr);
260
                                                        // g.setClip(tiles.getClip(tileNr).x, tiles.getClip(tileNr).y, tiles.getClip(tileNr).width - 5, tiles.getClip(tileNr).height);
261
                                                        draw(image, g, vport, cancel);
262
                                                } catch (NoninvertibleTransformException e) {
263
                                                        e.printStackTrace();
264
                                                }
265
                                        }
266
                                } else
267
                                        draw(image, g, vp, cancel);
268
                                status.applyStatus(this);
269
                                firstLoad = false;
270
                        }
271

    
272
                        if (mustTileDraw) {
273
                                Point2D p = vp.getOffset();
274
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), vp.getImageWidth(), vp.getImageHeight());
275
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
276
                                tiles.setAffineTransform((AffineTransform) vp.getAffineTransform().clone());
277
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
278
                                        // drawing part
279
                                        try {
280
                                                ViewPort vport = tiles.getTileViewPort(vp, tileNr);
281
                                                draw(image, g, vport, cancel);
282
                                        } catch (NoninvertibleTransformException e) {
283
                                                e.printStackTrace();
284
                                        }
285
                                }
286
                        } else
287
                                draw(image, g, vp, cancel);
288

    
289
                        if (getVirtualLayers() != null) {
290
                                try {
291
                                        getVirtualLayers().draw(image, g, vp, cancel, scale);
292
                                } catch (ReadDriverException e) {
293
                                        NotificationManager.addError("Error dibujando", e);
294
                                }
295
                        }
296
                }
297
        }
298

    
299
        private void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel) {
300
                Extent e = new Extent(vp.getAdjustedExtent());
301
                Dimension imgSz = vp.getImageSize();
302
                ViewPortData vp2 = new ViewPortData(vp.getProjection(), e, imgSz );
303
                vp2.setMat(vp.getAffineTransform());
304
                getRender().draw(g, vp2);
305
        }
306

    
307
        /**
308
         * Inserta la proyecci?n.
309
         *
310
         * @param proj Proyecci?n.
311
         */
312
        public void setProjection(IProjection proj) {
313
                super.setProjection(proj);
314
        }
315

    
316
        /*
317
         * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#getFullExtent()
318
         */
319
        public Rectangle2D getFullExtent(){
320
                return dataset.getExtent().toRectangle2D();
321
        }
322

    
323
        /**
324
         * Obtiene el valor del pixel del Image en la posici?n real x,y
325
         * @param x Posici?n x
326
         * @param y Posici?n y
327
         * @return valor de pixel
328
         */
329
        public int[] getPixel(double wcx, double wcy) {
330
                int[] argb = { -1, -1, -1, -1 };
331
                if (wcx <= getMaxX() && wcx >= getMinX() && wcy <= getMaxY() && wcy >= getMinY()) {
332
                        View theView = (View) PluginServices.getMDIManager().getActiveWindow();
333
                        if (theView instanceof IView) {
334
                                // BufferedImage buf = ((IView) theView).getMapControl().getImage();
335
                                Point2D p = ((IView) theView).getMapControl().getViewPort().fromMapPoint(wcx, wcy);
336
                                return getPixel((int) p.getX(), (int) p.getY());
337
                        }
338
                }
339
                return argb;
340
        }
341

    
342
        /**
343
         * Obtiene el valor del pixel del Image en la posici?n x,y
344
         * @param x Posici?n x
345
         * @param y Posici?n y
346
         * @return valor de pixel
347
         */
348
        public int[] getPixel(int pxx, int pxy) {
349
                int[] argb = { -1, -1, -1, -1 };
350
                View theView = (View) PluginServices.getMDIManager().getActiveWindow();
351
                BufferedImage buf = null;
352
                if (theView instanceof IView)
353
                        buf = ((IView) theView).getMapControl().getImage();
354
                if (pxx >= 0 && pxx < buf.getWidth() && pxy >= 0 && pxy < buf.getHeight()) {
355
                        if (theView instanceof IView) {
356
                                int value = buf.getRGB(pxx, pxy);
357
                                argb[0] = ((value & 0xff000000) >> 24);
358
                                argb[1] = ((value & 0x00ff0000) >> 16);
359
                                argb[2] = ((value & 0x0000ff00) >> 8);
360
                                argb[3] = (value & 0x000000ff);
361
                        }
362
                }
363
                return argb;
364
        }
365

    
366
        /*
367
         * (non-Javadoc)
368
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMaxX()
369
         */
370
        public double getMaxX(){
371
                return this.getFullExtent().getMaxX();
372
        }
373

    
374
        /*
375
         * (non-Javadoc)
376
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMaxY()
377
         */
378
        public double getMaxY(){
379
                return this.getFullExtent().getMaxY();
380
        }
381

    
382
        /*
383
         * (non-Javadoc)
384
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMinX()
385
         */
386
        public double getMinX(){
387
                return this.getFullExtent().getMinX();
388
        }
389

    
390
        /*
391
         * (non-Javadoc)
392
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMinY()
393
         */
394
        public double getMinY(){
395
                return this.getFullExtent().getMinY();
396
        }
397

    
398
        /* (non-Javadoc)
399
         * @deprecated. See String getInfo(Point p) throws DriverException
400
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint#queryByPoint(java.awt.Point)
401
         */
402
        public String queryByPoint(Point p) {
403
                String data = "<file:" + normalizeAsXMLTag(getName()) + ">\n";
404

    
405
                ArrayList attr = getAttributes();
406
                data += "  <raster\n";
407
                data += "    File=\"" + getFile() + "\"\n";
408
                for (int i = 0; i < attr.size(); i++) {
409
                        Object[] a = (Object[]) attr.get(i);
410

    
411
                        data += "    " + a[0].toString() + "=";
412
                        if (a[1].toString() instanceof String)
413
                                data += "\"" + a[1].toString() + "\"\n";
414
                        else
415
                                data += a[1].toString() + "\n";
416
                }
417
                data += "    Point=\"" + posX + " , " + posY + "\"\n";
418
                data += "    Point_WC=\"" + posXWC + " , " + posYWC + "\"\n";
419
                data += "    RGB=\"" + r + ", " + g + ", " + b + "\"\n";
420
                data += "  />\n";
421

    
422
                data += "</file:" + normalizeAsXMLTag(getName()) + ">\n";
423
                return data;
424
        }
425

    
426
        public XMLItem[] getInfo(Point p, double tolerance, Cancellable cancel) {
427

    
428
                Point2D pReal = getMapContext().getViewPort().toMapPoint(p);
429
                Point2D px = null;
430
                if(        pReal.getX() > this.getMinX() &&
431
                        pReal.getX() < this.getMaxX() &&
432
                        pReal.getY() > this.getMinY() &&
433
                        pReal.getY() < this.getMaxY()) {
434
                        ArrayList attr = getAttributes();
435
                        int w = 0, h = 0;
436
                        for (int i = 0; i < attr.size(); i++) {
437
                                Object[] a = (Object[]) attr.get(i);
438
                                if (a[0].toString().equals("Width"))
439
                                        w = ((Integer) a[1]).intValue();
440
                                if (a[0].toString().equals("Height"))
441
                                        h = ((Integer) a[1]).intValue();
442
                        }
443
                        px = new Point2D.Double();
444
                        px.setLocation( ((pReal.getX() - this.getMinX()) * w) / getWCWidth(),
445
                                                        ((this.getMaxY() - pReal.getY()) * h) / getWCHeight());
446
                }
447
                int[] rgb = getPixel((int) p.getX(), (int) p.getY());
448

    
449
                StringXMLItem[] item = new StringXMLItem[1];
450
                String data = "<file:" + normalizeAsXMLTag(getName()) + ">\n";
451

    
452
                data += "  <raster\n";
453
                data += "    View_Point=\"" + p.getX() + " , " + p.getY() + "\"\n";
454
                data += "    World_Point=\"" + pReal.getX() + " , " + pReal.getY() + "\"\n";
455
                if (px == null)
456
                        data += "    Pixel_Point=\"Out\"\n";
457
                else
458
                        data += "    Pixel_Point=\"" + (int) px.getX() + " , " + (int) px.getY() + "\"\n";
459
                data += "    RGB=\"" + rgb[1] + "  " + rgb[2] + "  " + rgb[3] + "\"\n";
460
                data += "    Band_Value=\"";
461
                try {
462
                        if (px != null) {
463
                                if(getDataType()[0] >= 0 && getDataType()[0] <= 3){
464
                                        for(int i = 0; i < getBandCount(); i++)
465
                                                data += ((Integer)getGeoRasterMultiDataset().getData((int)px.getX(), (int)px.getY(), i)).intValue() + "  ";
466
                                }
467
                                if(getDataType()[0] == 4){
468
                                        for(int i = 0; i < getBandCount(); i++)
469
                                                data += ((Float)getGeoRasterMultiDataset().getData((int)px.getX(), (int)px.getY(), i)).floatValue() + "  ";
470
                                }
471
                                if(getDataType()[0] == 5){
472
                                        for(int i = 0; i < getBandCount(); i++)
473
                                                data += ((Double)getGeoRasterMultiDataset().getData((int)px.getX(), (int)px.getY(), i)).doubleValue() + "  ";
474
                                }
475
                        }
476
                } catch (RasterDriverException ex) {
477

    
478
                } catch (InvalidSetViewException ex) {
479

    
480
                } catch (FileNotOpenException ex) {
481

    
482
                }
483
                data += "\"\n";
484
                data += "  />\n";
485
                data += "</file:" + normalizeAsXMLTag(getName()) + ">\n";
486

    
487
                item[0] = new StringXMLItem(data, this);
488
                return item;
489
        }
490

    
491
        /**
492
         * Filters a string for being suitable as XML Tag, erasing
493
         * all not alphabetic or numeric characters.
494
         * @param s
495
         * @return string normalized
496
         */
497
        public String normalizeAsXMLTag(String s) {
498
                return s.replaceAll("[^a-zA-Z0-9]", "");
499
        }
500

    
501
        /**
502
         * Obtiene atributos a partir de un georasterfile
503
         * @return
504
         */
505
        public ArrayList getAttributes() {
506
                ArrayList attr = new ArrayList();
507
                Object [][] a = {
508
                        {"Filename", dataset.getDataset(0).getFName()},
509
                        {"Filesize", new Long(dataset.getFileSize())},
510
                        {"Width", new Integer((int)dataset.getWidth()[0])},
511
                        {"Height", new Integer((int)dataset.getHeight()[0])},
512
                        {"Bands", new Integer(dataset.getBandCount())}
513
                };
514
                for (int i = 0; i < a.length; i++)
515
                        attr.add(a[i]);
516
                return attr;
517
        }
518

    
519
        /**
520
         * @throws XMLException
521
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
522
         */
523
        public XMLEntity getXMLEntity() throws XMLException {
524
                XMLEntity xml = super.getXMLEntity();
525
                xml.putProperty("file", getFile());
526
                xml.putProperty("driverName", "gvSIG Raster Driver");
527

    
528
                // Si no hay ning?n Status aplicamos el StatusLayerRaster que se usa por defecto
529
                if (status == null)
530
                        status = new StatusLayerRaster();
531
                status.getXMLEntity(xml, true, this);
532

    
533
                return xml;
534
        }
535

    
536
        public void setXMLEntity03(XMLEntity xml) throws XMLException {
537
        }
538

    
539
        public void setXMLEntity(XMLEntity xml)throws XMLException {
540
                super.setXMLEntity(xml);
541

    
542
                params = new File(xml.getStringProperty("file"));
543

    
544
                // Para notificar al adapter-driver cual es la proyecci?n.
545
                setProjection(super.getProjection());
546

    
547
                //Inicializamos la clase a la que se usa por defecto para
548
                //compatibilidad con proyectos antiguos
549
                String claseStr = StatusLayerRaster.defaultClass;
550
                if (xml.contains("raster.class"))
551
                        claseStr = xml.getStringProperty("raster.class");
552

    
553
                if (status != null)
554
                        status.setXMLEntity(xml, this);
555
                else {
556
                        // Cuando cargamos un proyecto
557

    
558
                        if (claseStr != null && !claseStr.equals("")) {
559
                                try {
560
                                        Class clase = Class.forName(claseStr);
561
                                        Constructor constr = clase.getConstructor(null);
562
                                        status = (StatusRasterInterface) constr.newInstance(null);
563
                                        if (status != null)
564
                                                status.setXMLEntity(xml, this);
565
                                } catch (ClassNotFoundException exc) {
566
                                        exc.printStackTrace();
567
                                } catch (InstantiationException exc) {
568
                                        exc.printStackTrace();
569
                                } catch (IllegalAccessException exc) {
570
                                        exc.printStackTrace();
571
                                } catch (NoSuchMethodException exc) {
572
                                        exc.printStackTrace();
573
                                } catch (InvocationTargetException exc) {
574
                                        exc.printStackTrace();
575
                                }
576
                        }
577
                }
578
                firstLoad = true;
579

    
580
        }
581

    
582
        /* (non-Javadoc)
583
         * @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)
584
         */
585
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet propeties) {
586

    
587
                if (!isVisible() || !isWithinScale(scale))
588
                        return;
589

    
590
                isPrinting = true;
591
                if (!mustTilePrint) {
592
                        draw(null, g, viewPort, cancel,scale);
593
                } else {
594
                        // Para no pedir imagenes demasiado grandes, vamos
595
                        // a hacer lo mismo que hace EcwFile: chunkear.
596
                        // Llamamos a drawView con cuadraditos m?s peque?os
597
                        // del BufferedImage ni caso, cuando se imprime viene con null
598
                        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
599
                        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
600

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

    
604
                        //RasterStats stats = getSource().getFilterStack().getStats();
605
                        //if(stats != null)
606
                        //stats.history.add(stats.new History(getName(), stats.minBandValue, stats.maxBandValue, stats.secondMinBandValue, stats.secondMaxBandValue));
607

    
608

    
609
                        for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
610
                                // Parte que dibuja
611
                                try {
612
                                        ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
613
                                        draw(null, g, vp, cancel, scale);
614
                                } catch (NoninvertibleTransformException e) {
615
                                        e.printStackTrace();
616
                                }
617
                        }
618
                        /*if(stats != null){
619
                                getSource().getFilterStack().getStats().history.clear();
620
                                stats = getSource().getFilterStack().getStats();
621
                        }*/
622
                }
623
                isPrinting = false;
624
        }
625

    
626
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,double scale) {
627
                // Para no pedir imagenes demasiado grandes, vamos
628
                // a hacer lo mismo que hace EcwFile: chunkear.
629
                // Llamamos a drawView con cuadraditos m?s peque?os
630
                // del BufferedImage ni caso, cuando se imprime viene con null
631

    
632
                int numW, numH;
633
                int stepX, stepY;
634
                int xProv, yProv;
635
                int A = 1500;
636
                int H = 1500;
637
                int altoAux, anchoAux;
638

    
639
                AffineTransform mat = (AffineTransform) viewPort.getAffineTransform().clone();
640

    
641
                // Vamos a hacerlo en trozos de AxH
642
                Rectangle r = g.getClipBounds();
643
                numW = (int) (r.width) / A;
644
                numH = (int) (r.height) / H;
645

    
646
                double[] srcPts = new double[8];
647
                double[] dstPts = new double[8];
648

    
649
                yProv = (int) r.y;
650
                for (stepY = 0; stepY < numH + 1; stepY++) {
651
                        if ((yProv + H) > r.getMaxY())
652
                                altoAux = (int) r.getMaxY() - yProv;
653
                        else
654
                                altoAux = H;
655

    
656
                        xProv = (int) r.x;
657
                        for (stepX = 0; stepX < numW + 1; stepX++) {
658
                                if ((xProv + A) > r.getMaxX())
659
                                        anchoAux = (int) r.getMaxX() - xProv;
660
                                else
661
                                        anchoAux = A;
662

    
663
                                //Rectangle newRect = new Rectangle(xProv, yProv, anchoAux, altoAux);
664

    
665
                                // Parte que dibuja
666
                                srcPts[0] = xProv;
667
                                srcPts[1] = yProv;
668
                                srcPts[2] = xProv + anchoAux + 1;
669
                                srcPts[3] = yProv;
670
                                srcPts[4] = xProv + anchoAux + 1;
671
                                srcPts[5] = yProv + altoAux + 1;
672
                                srcPts[6] = xProv;
673
                                srcPts[7] = yProv + altoAux + 1;
674

    
675
                                try {
676
                                        mat.inverseTransform(srcPts, 0, dstPts, 0, 4);
677
                                        Rectangle2D.Double rectCuadricula = new Rectangle2D.Double(dstPts[0], dstPts[1], dstPts[2] - dstPts[0], dstPts[5] - dstPts[3]);
678
                                        // Extent extent = new Extent(rectCuadricula);
679

    
680
                                        Dimension tam = new Dimension(anchoAux + 1, altoAux + 1);
681
                                        ViewPort vp = viewPort.cloneViewPort();
682
                                        vp.setImageSize(tam);
683
                                        vp.setExtent(rectCuadricula);
684
                                        vp.setAffineTransform(mat);
685
                                        draw(null, g, vp, cancel, scale);
686

    
687
                                } catch (NoninvertibleTransformException e) {
688
                                        e.printStackTrace();
689
                                }
690
                                // Fin parte que dibuja
691
                                xProv = xProv + A;
692
                        }
693
                        yProv = yProv + H;
694
                }
695
        }
696

    
697
        /**
698
         * Borra de la lista de listeners el que se pasa como par?metro.
699
         *
700
         * @param o LayerListener a borrar.
701
         *
702
         * @return True si ha sido correcto el borrado del Listener.
703
         */
704
        public boolean removeLayerListener(LayerListener o) {
705
                if (this.isRemoveRasterFlag()) {
706
                        dataset.close();
707
                        this.setRemoveRasterFlag(true);
708
                }
709
                return super.layerListeners.remove(o);
710
        }
711

    
712
        /**
713
         * @return Returns the removeRasterFlag.
714
         */
715
        public boolean isRemoveRasterFlag() {
716
                return removeRasterFlag;
717
        }
718

    
719
        /**
720
         * Asigna el valor del flag que dice si destruimos la memoria del raster
721
         * al eliminarlo del TOC o  no.
722
         * @param removeRasterFlag The removeRasterFlag to set.
723
         */
724
        public void setRemoveRasterFlag(boolean removeRasterFlag) {
725
                this.removeRasterFlag = removeRasterFlag;
726
        }
727

    
728
        public ImageIcon getTocImageIcon() {
729
                return new ImageIcon(MapControl.class.getResource("images/icolayerRaster.PNG"));
730
        }
731

    
732
        /*
733
         *  (non-Javadoc)
734
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
735
         */
736
        public int[] getTileSize() {
737
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
738
                return size;
739
        }
740

    
741
        /*
742
         *  (non-Javadoc)
743
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
744
         */
745
        public boolean isTiled() {
746
                return mustTileDraw;
747
        }
748

    
749
        /**
750
         * Obtiene el flag que dice si la imagen est? o no georreferenciada
751
         * @return true si est? georreferenciada y false si no lo est?.
752
         */
753
        public boolean isGeoreferenced() {
754
                return dataset.isGeoreferenced();
755
        }
756

    
757
        /**
758
         * Get datasource object
759
         * @return
760
         */
761
        public BufferFactory getDatasource(){
762
                return bufferFactory;
763
        }
764

    
765
        /*
766
         * (non-Javadoc)
767
         * @see org.gvsig.fmap.raster.IRasterOperations#getPXHeight()
768
         */
769
        public double getPxHeight() {
770
                return (dataset.getHeight() != null && dataset.getHeight().length >= 1) ? dataset.getHeight()[0] : 0;
771
        }
772

    
773
        /*
774
         * (non-Javadoc)
775
         * @see org.gvsig.fmap.raster.IRasterOperations#getPxWidth()
776
         */
777
        public double getPxWidth() {
778
                return (dataset.getWidth() != null && dataset.getWidth().length >= 1) ? dataset.getWidth()[0] : 0;
779
        }
780

    
781
        /*
782
         * (non-Javadoc)
783
         * @see org.gvsig.fmap.raster.IGeoDimension#getWCHeight()
784
         */
785
        public double getWCHeight() {
786
                return getFullExtent().getHeight();
787
        }
788

    
789
        /*
790
         * (non-Javadoc)
791
         * @see org.gvsig.fmap.raster.IGeoDimension#getWCWidth()
792
         */
793
        public double getWCWidth() {
794
                return getFullExtent().getWidth();
795
        }
796

    
797
        /*
798
         * (non-Javadoc)
799
         * @see org.gvsig.fmap.raster.IRasterFile#getFileSize()
800
         */
801
        public long[] getFileSize(){
802
                int nFiles = dataset.getDatasetCount();
803
                long[] s = new long[nFiles];
804
                for (int i = 0; i < nFiles; i++)
805
                        s[i] = dataset.getDataset(i).getFileSize();
806
                return s;
807
        }
808

    
809
        /*
810
         * (non-Javadoc)
811
         * @see org.gvsig.fmap.raster.IRasterFile#getFileName()
812
         */
813
        public String[] getFileName(){
814
                int nFiles = dataset.getDatasetCount();
815
                String[] s = new String[nFiles];
816
                for (int i = 0; i < nFiles; i++)
817
                        s[i] = dataset.getDataset(i).getFName();
818
                return s;
819
        }
820

    
821
        /*
822
         * (non-Javadoc)
823
         * @see org.gvsig.fmap.raster.IRasterFile#getFileCount()
824
         */
825
        public int getFileCount(){
826
                return dataset.getDatasetCount();
827
        }
828

    
829
        /*
830
         * (non-Javadoc)
831
         * @see org.gvsig.fmap.raster.IRasterFile#getFileFormat()
832
         */
833
        public String getFileFormat(){
834
                String fName = dataset.getDataset(0).getFName();
835
                int index = fName.lastIndexOf(".") + 1;
836
                String ext = null;
837
                if (index > 0)
838
                        ext = fName.substring(fName.lastIndexOf(".") + 1, fName.length());
839
                return ext;
840
        }
841

    
842
        /*
843
         * (non-Javadoc)
844
         * @see org.gvsig.fmap.raster.IRasterOperations#getBandCount()
845
         */
846
        public int getBandCount(){
847
                return dataset.getBandCount();
848
        }
849

    
850
        /*
851
         * (non-Javadoc)
852
         * @see org.gvsig.fmap.raster.IRasterOperations#getDatatype()
853
         */
854
        public int[] getDataType(){
855
                return dataset.getDataType();
856
        }
857

    
858
        /*
859
         * (non-Javadoc)
860
         * @see org.gvsig.fmap.raster.IRasterRendering#getRenderTransparency()
861
         */
862
        public GridTransparency getRenderTransparency(){
863
                return render.getLastTransparency();
864
        }
865

    
866
        /*
867
         * (non-Javadoc)
868
         * @see org.gvsig.fmap.raster.IRasterDataset#getGeoRasterMultiDataset()
869
         */
870
        public MultiRasterDataset getGeoRasterMultiDataset() {
871
                return dataset;
872
        }
873

    
874
        /*
875
         * (non-Javadoc)
876
         * @see org.gvsig.fmap.raster.IRasterDataset#addFile(java.lang.String)
877
         */
878
        public void addFile(String fileName) {
879
                try {
880
                        if (getRender() != null)
881
                                bufferFactory.addFile(RasterDataset.open(getProjection(), fileName));
882
                } catch (NotSupportedExtensionException e) {
883
                        NotificationManager.addError("Formato no valido", e);
884
                } catch (RasterDriverException e) {
885
                        NotificationManager.addError("Formato no valido", e);
886
                }
887
        }
888

    
889
        /*
890
         * (non-Javadoc)
891
         * @see org.gvsig.fmap.raster.IRasterDataset#delFile(java.lang.String)
892
         */
893
        public void delFile(String fileName) {
894
                if (getRender() != null)
895
                        bufferFactory.removeFile(fileName);
896
        }
897

    
898
        /*
899
         * (non-Javadoc)
900
         * @see org.gvsig.fmap.raster.IRasterDataset#getInfo(java.lang.String)
901
         */
902
        public Object getInfo(String key) {
903
                if (key.equals("DriverName"))
904
                        return "gvSIG Raster Driver";
905
                return null;
906
        }
907

    
908
        /*
909
         * (non-Javadoc)
910
         * @see org.gvsig.fmap.raster.IRasterRendering#getRenderFilterList()
911
         */
912
        public RasterFilterList getRenderFilterList(){
913
                return getRender().getFilterList();
914
        }
915

    
916
        /*
917
         * (non-Javadoc)
918
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getPixelSizeX()
919
         */
920
        public double[] getPxWidthByDataset() {
921
                return dataset.getWidth();
922
        }
923

    
924
        /*
925
         * (non-Javadoc)
926
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getPixelSizeY()
927
         */
928
        public double[] getPxHeightByDataset() {
929
                return dataset.getHeight();
930
        }
931

    
932
        /*
933
         * (non-Javadoc)
934
         * @see org.gvsig.raster.shared.IRasterOperations#getMetadata()
935
         */
936
        public DatasetMetadata[] getMetadata() {
937
                int count = dataset.getDatasetCount();
938
                DatasetMetadata[] metadata = new DatasetMetadata[count];
939
                for (int i = 0; i < count; i++) {
940
                        metadata[i] = dataset.getDataset(i).getMetadata();
941
                }
942
                return metadata;
943
        }
944

    
945
        /*
946
         * (non-Javadoc)
947
         * @see org.gvsig.raster.shared.IRasterOperations#getBandCountFromDataset()
948
         */
949
        public int[] getBandCountFromDataset() {
950
                int count = dataset.getDatasetCount();
951
                int[] bands = new int[count];
952
                for (int i = 0; i < count; i++) {
953
                        bands[i] = dataset.getDataset(i).getBandCount();
954
                }
955
                return bands;
956
        }
957

    
958
        /*
959
         * (non-Javadoc)
960
         * @see org.gvsig.raster.shared.IRasterOperations#getColourInterpretation(int, int)
961
         */
962
        public String getColourInterpretation(int band, int dataset) {
963
                if (this.dataset.getColorInterpretation(dataset) == null)
964
                        return "Undefined";
965
                return this.dataset.getColorInterpretation(dataset).get(band);
966
        }
967

    
968
        /*
969
         * (non-Javadoc)
970
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getStringProjection()
971
         */
972
        public String getStringProjection() {
973
                try {
974
                        return dataset.getStringProjection();
975
                } catch (RasterDriverException e) {
976
                        NotificationManager.addError("No puedo obtener la proyecci?n asociada al dataset.", e);
977
                }
978
                return null;
979
        }
980

    
981
        /**
982
         * Obtiene el grid de la capa completa. Hay que tener cuidado porque cuando se hace esta
983
         * petici?n se carga un buffer con todos los datos de la capa. Este buffer puede ser 
984
         * cacheado o no dependiendo del tama?o de esta.
985
         * @param interpolated true si se solicita un grid interpolado y false si se solicita sin interpolar.
986
         * @return Grid.
987
         */
988
        public Grid getFullGrid(boolean interpolated) {
989
                BufferFactory bf = getDatasource();
990
                bf.clearDrawableBand();
991
                bf.setAllDrawableBands();
992
                bf.setAreaOfInterest();
993
                return new Grid(bf, interpolated);
994
        }
995

    
996
        /*
997
         * (non-Javadoc)
998
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getFullRasterExtent()
999
         */
1000
        public Extent getFullRasterExtent() {
1001
                return new Extent(getFullExtent());
1002
        }
1003

    
1004

    
1005
        /**
1006
         * Devuelve el fichero asociado a la capa o null si no tiene.
1007
         * @return Fichero.
1008
         */
1009
        public File getFile() {
1010
                return (params instanceof File) ? ((File)params) : null;
1011
        }
1012

    
1013
        /**
1014
         * Consulta si un fichero es aceptado o no para este tipo de capa.
1015
         * @param file Fichero a consultar
1016
         * @return true si es aceptado y false si no lo es.
1017
         */
1018
        public static boolean isFileAccepted(File file) {
1019
                return RasterDataset.fileIsSupported(file.getName());
1020
        }
1021

    
1022
        /*
1023
         * (non-Javadoc)
1024
         * @see org.gvsig.raster.shared.IRasterRendering#existColorTable()
1025
         */
1026
        public boolean existColorTable() {
1027
                return this.getRender().existColorTable();
1028
        }
1029
}