Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRasterTools-SE / src / org / gvsig / fmap / layers / FLyrRasterSE.java @ 12066

History | View | Annotate | Download (30 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

    
84
/**
85
 * Capa raster
86
 * @author Nacho Brodin (nachobrodin@gmail.com)
87
 */
88
public class FLyrRasterSE extends FLyrDefault implements IRasterProperties, IRasterDataset, InfoByPoint {
89
        boolean                                                         isPrinting = false;
90
        boolean                                                         mustTileDraw = false;
91
        boolean                                                         mustTilePrint = true;
92
        private int                                                        maxTileDrawWidth = 200;
93
        private int                                                 maxTileDrawHeight = 200;
94
        int                                                                 maxTilePrintWidth = 1500;
95
        int                                                                 maxTilePrintHeight = 1500;
96
        private StatusRasterInterface                status = null;
97
        private boolean                                                firstLoad = false;
98
        private int                                                 posX = 0, posY = 0;
99
        private double                                                 posXWC = 0, posYWC = 0;
100
        private int                                                 r = 0, g = 0, b = 0;
101
        private boolean                                                removeRasterFlag = true;
102
        private Object                                                params = null;
103
        private MultiRasterDataset                         dataset = null;
104
        private Rendering                                         render = null;
105
        private BufferFactory                                bufferFactory = null;
106

    
107
        static {
108
                 RasterLibrary.wakeUp();
109
        }
110

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

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

    
138
        /**
139
         * Redefine wakeUp de FLyrDefault
140
         */
141
        public void wakeUp(){
142
        }
143

    
144
        /**
145
         * Asignar el estado del raster
146
         * @param status
147
         */
148
        public void setStatus(StatusRasterInterface status){
149
                this.status = status;
150
        }
151

    
152
        /**
153
         * Obtiene el estado del raster
154
         * @return
155
         */
156
        public StatusRasterInterface getStatus(){
157
                return this.status;
158
        }
159

    
160
        /*
161
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#load()
162
         */
163
        public void load() throws LoadLayerException{
164
                if (getProjection() != null) {
165
                        String fName = null;
166
                        int test = -1;
167
                        if(params != null && params instanceof File) {
168
                                fName = ((File)params).getAbsolutePath();
169
                                test = fName.indexOf("ecwp:");
170
                        }
171

    
172
                        if (test != -1) {
173
                                        String urlECW = fName.substring(test + 6);
174
                                        fName = "ecwp://" + urlECW;
175
                                System.err.println(test + " " + fName);
176
                                }
177

    
178
                        try {
179
                                if(params == null || params instanceof File)
180
                                        dataset = MultiRasterDataset.open(getProjection(), fName);
181
                                else
182
                                        dataset = MultiRasterDataset.open(getProjection(), params);
183
                        } catch (NotSupportedExtensionException e) {
184
                                throw new LoadLayerException("Formato no valido", e);
185
                        } catch (RasterDriverException e) {
186
                                throw new LoadLayerException("Formato no valido", e);
187
                        }
188
                        if(dataset == null)
189
                                throw new LoadLayerException("Formato no valido", new IOException());
190
                        bufferFactory = new BufferFactory(dataset);
191
                        getRender();
192
                        initFilters();
193
                } else
194
                        throw new LoadLayerException("Proyecci?n no asignada", new IOException());
195
        }
196

    
197
        /**
198
         * Crea el objeto renderizador de raster
199
         * @return Rendering 
200
         */
201
        public Rendering getRender() {
202
                if(render == null)
203
                        render = new Rendering(bufferFactory);
204
                return render;
205
        }
206

    
207
        /**
208
         * Filtros a?adidos por defecto en la pila para visualizaci?n.
209
         */
210
        private void initFilters() {
211
                RasterFilterList filterList = new RasterFilterList();
212
                filterList.addParam("IStatistics", getGeoRasterMultiDataset().getStatistics());
213
                filterList.addParam("MultiRasterDataset", getGeoRasterMultiDataset());
214
                filterList.setInitDataType(getDataType()[0]);
215
                RasterFilterListManager filterManager = new RasterFilterListManager(filterList);
216
                
217
                if(this.getGeoRasterMultiDataset().getPalettes()[0] != null) {
218
                        GridPalette p = new GridPalette(getGeoRasterMultiDataset().getPalettes()[0]);
219
                        ColorTableListManager ctm = new ColorTableListManager(filterManager);
220
                        ctm.addColorTableFilter(p, RasterFilterList.MODIFY_LAST);
221
                } else {
222
                        if(        getDataType()[0] != IBuffer.TYPE_BYTE) {
223
                                IStatistics stats = getGeoRasterMultiDataset().getStatistics();
224
                                EnhancementListManager elm = new EnhancementListManager(filterManager);
225
                                elm.addEnhancedFilter(false, stats, 0.0, RasterFilterList.MODIFY_LAST, getRender().getRenderBands());
226
                        }
227
                }
228

    
229
                getRender().setFilterList(filterList);
230
        }
231

    
232
        /**
233
         * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#draw(java.awt.image.BufferedImage,
234
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort,
235
         *                 com.iver.utiles.swing.threads.Cancellable)
236
         */
237
        public void draw(BufferedImage image, Graphics2D g, ViewPort vp,
238
                Cancellable cancel, double scale) {
239
                if (isWithinScale(scale)) {
240

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

    
263
                        if(mustTileDraw){
264
                                Point2D p = vp.getOffset();
265
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), vp.getImageWidth(), vp.getImageHeight());
266
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
267
                                tiles.setAffineTransform((AffineTransform) vp.getAffineTransform().clone());
268
                                for (int tileNr=0; tileNr < tiles.getNumTiles(); tileNr++) {
269
                                        // drawing part
270
                                        try {
271
                                                ViewPort vport = tiles.getTileViewPort(vp, tileNr);
272
                                                draw(image, g, vport, cancel);
273
                                        } catch (NoninvertibleTransformException e) {
274
                                                e.printStackTrace();
275
                                        }
276
                                }
277
                        }else
278
                                draw(image, g, vp, cancel);
279

    
280

    
281

    
282
                if (getVirtualLayers() != null) {
283
                        try {
284
                                getVirtualLayers().draw(image, g, vp, cancel,scale);
285
                        } catch (ReadDriverException e) {
286
                                NotificationManager.addError("Error dibujando", e);
287
                        }
288
                }
289
                }
290
        }
291

    
292
        private void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel) {
293
                Extent e = new Extent(vp.getAdjustedExtent());
294
                Dimension imgSz = vp.getImageSize();
295
                ViewPortData vp2 = new ViewPortData(vp.getProjection(), e, imgSz );
296
                vp2.setMat(vp.getAffineTransform());
297
                getRender().draw(g, vp2);
298
        }
299

    
300
        /**
301
         * Inserta la proyecci?n.
302
         *
303
         * @param proj Proyecci?n.
304
         */
305
        public void setProjection(IProjection proj) {
306
                super.setProjection(proj);
307
        }
308

    
309
        /*
310
         * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#getFullExtent()
311
         */
312
        public Rectangle2D getFullExtent(){
313
                return dataset.getExtent().toRectangle2D();
314
        }
315

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

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

    
359
        /*
360
         * (non-Javadoc)
361
         * @see org.gvsig.raster.shared.IRasterGeoOperations#getMaxX()
362
         */
363
        public double getMaxX(){
364
                        return this.getFullExtent().getMaxX();
365
        }
366

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

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

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

    
391
        /* (non-Javadoc)
392
         * @deprecated. See String getInfo(Point p) throws DriverException
393
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint#queryByPoint(java.awt.Point)
394
         */
395
        public String queryByPoint(Point p) {
396
                String data = "<file:"+normalizeAsXMLTag(getName())+">\n";
397

    
398
                ArrayList attr = getAttributes();
399
                data += "  <raster\n";
400
                data += "    File=\"" + getFile() + "\"\n";
401
                for (int i = 0; i < attr.size(); i++) {
402
                        Object [] a = (Object []) attr.get(i);
403

    
404
                        data += "    " + a[0].toString() + "=";
405
                        if (a[1].toString() instanceof String)
406
                                data += "\"" + a[1].toString() + "\"\n";
407
                        else
408
                                data += a[1].toString() + "\n";
409
                }
410
                data += "    Point=\"" + posX + " , " + posY + "\"\n";
411
                data += "    Point_WC=\"" + posXWC + " , " + posYWC + "\"\n";
412
                data += "    RGB=\"" + r + ", " + g + ", " + b + "\"\n";
413
                data += "  />\n";
414

    
415
                data += "</file:" + normalizeAsXMLTag(getName()) + ">\n";
416
                return data;
417
        }
418

    
419
        public XMLItem[] getInfo(Point p, double tolerance, Cancellable cancel) {
420

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

    
442
                StringXMLItem[] item = new StringXMLItem[1];
443
                String data = "<file:" + normalizeAsXMLTag(getName()) + ">\n";
444

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

    
469
                } catch (InvalidSetViewException ex) {
470

    
471
                } catch (FileNotOpenException ex) {
472

    
473
                }
474
                data += "\"\n";
475
                data += "  />\n";
476
                data += "</file:" + normalizeAsXMLTag(getName()) + ">\n";
477

    
478
                item[0] = new StringXMLItem(data, this);
479
                return item;
480

    
481
        }
482

    
483
        /**
484
         * Filters a string for being suitable as XML Tag, erasing
485
         * all not alphabetic or numeric characters.
486
         * @param s
487
         * @return string normalized
488
         */
489
        public String normalizeAsXMLTag(String s) {
490
                return s.replaceAll("[^a-zA-Z0-9]", "");
491
        }
492

    
493
        /**
494
         * Obtiene atributos a partir de un georasterfile
495
         * @return
496
         */
497
        public ArrayList getAttributes() {
498
                ArrayList attr = new ArrayList();
499
                Object [][] a = {
500
                        {"Filename", dataset.getDataset(0).getFName()},
501
                        {"Filesize", new Long(dataset.getFileSize())},
502
                        {"Width", new Integer((int)dataset.getWidth()[0])},
503
                        {"Height", new Integer((int)dataset.getHeight()[0])},
504
                        {"Bands", new Integer(dataset.getBandCount())}
505
                };
506
                for (int i = 0; i < a.length; i++)
507
                        attr.add(a[i]);
508
                return attr;
509
        }
510

    
511
        /**
512
         * @throws XMLException
513
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
514
         */
515
        public XMLEntity getXMLEntity() throws XMLException {
516
                XMLEntity xml = super.getXMLEntity();
517
                xml.putProperty("file", getFile());
518
                xml.putProperty("driverName", "gvSIG Raster Driver");
519

    
520
                //Si no hay ning?n Status aplicamos el StatusLayerRaster que se usa por defecto
521
                if(status == null)
522
                        status = new StatusLayerRaster();
523
                status.getXMLEntity(xml, true, this);
524

    
525
                return xml;
526
        }
527

    
528
        public void setXMLEntity03(XMLEntity xml)
529
        throws XMLException {
530

    
531
        }
532

    
533
        public void setXMLEntity(XMLEntity xml)throws XMLException {
534
                super.setXMLEntity(xml);
535

    
536
                params = new File(xml.getStringProperty("file"));
537

    
538
                // Para notificar al adapter-driver cual es la proyecci?n.
539
                setProjection(super.getProjection());
540

    
541
                //Inicializamos la clase a la que se usa por defecto para
542
                //compatibilidad con proyectos antiguos
543
                String claseStr = StatusLayerRaster.defaultClass;
544
                if (xml.contains("raster.class"))
545
                        claseStr = xml.getStringProperty("raster.class");
546

    
547
                if(status != null)
548
                        status.setXMLEntity(xml, this);
549
                else{
550
                        //Cuando cargamos un proyecto
551

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

    
574
        }
575

    
576
        /* (non-Javadoc)
577
         * @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)
578
         */
579
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet propeties){
580

    
581
                if (isVisible() && isWithinScale(scale)){
582
                isPrinting = true;
583
                if (!mustTilePrint) {
584
                                draw(null, g, viewPort, cancel,scale);
585
                } else {
586
                                        // Para no pedir imagenes demasiado grandes, vamos
587
                                        // a hacer lo mismo que hace EcwFile: chunkear.
588
                                        // Llamamos a drawView con cuadraditos m?s peque?os
589
                                        // del BufferedImage ni caso, cuando se imprime viene con null
590
                        Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
591
                        tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
592

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

    
596
                        //RasterStats stats = getSource().getFilterStack().getStats();
597
                        //if(stats != null)
598
                                //stats.history.add(stats.new History(getName(), stats.minBandValue, stats.maxBandValue, stats.secondMinBandValue, stats.secondMaxBandValue));
599

    
600

    
601
                        for (int tileNr=0; tileNr < tiles.getNumTiles(); tileNr++) {
602
                                        // Parte que dibuja
603
                                        try {
604
                                                        ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
605
                                                        draw(null, g, vp, cancel,scale);
606
                                } catch (NoninvertibleTransformException e) {
607
                                        e.printStackTrace();
608
                                }
609
                                        }
610

    
611
                        /*if(stats != null){
612
                                getSource().getFilterStack().getStats().history.clear();
613
                                stats = getSource().getFilterStack().getStats();
614
                        }*/
615

    
616
                }
617
                        isPrinting = false;
618
                }
619
        }
620

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

    
628
                                        int numW, numH;
629
                                        int stepX, stepY;
630
                                        int xProv, yProv;
631
                                        int A = 1500;
632
                                        int H = 1500;
633
                                        int altoAux, anchoAux;
634

    
635
                                        AffineTransform mat = (AffineTransform) viewPort.getAffineTransform().clone();
636

    
637
                                        // Vamos a hacerlo en trozos de AxH
638
                                        Rectangle r = g.getClipBounds();
639
                                        numW = (int) (r.width) / A;
640
                                        numH = (int) (r.height) / H;
641

    
642

    
643
                                        double[] srcPts = new double[8];
644
                                        double[] dstPts= new double[8];
645

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

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

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

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

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

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

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

    
697
        }
698

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1006

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

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

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

    
1032
}