Statistics
| Revision:

root / branches / CqCMSDvp / libraries / libCq CMS for java.old / src / org / cresques / px / PxRaster.java @ 2669

History | View | Annotate | Download (41.1 KB)

1
/*
2
 * Cresques Mapping Suite. Graphic Library for constructing mapping applications.
3
 *
4
 * Copyright (C) 2004-5.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 *
22
 * cresques@gmail.com
23
 */
24
package org.cresques.px;
25

    
26
import org.cresques.cts.ICoordTrans;
27
import org.cresques.cts.IProjection;
28

    
29
import org.cresques.geo.Projected;
30
import org.cresques.geo.ViewPortData;
31

    
32
import org.cresques.io.EcwFile;
33
import org.cresques.io.GdalFile;
34
import org.cresques.io.GeoRasterFile;
35
import org.cresques.io.raster.RasterBuf;
36
import org.cresques.io.raster.RasterFilterStack;
37
import org.cresques.io.raster.RasterFilterStackManager;
38
import org.cresques.io.raster.RasterStats;
39
import org.cresques.io.raster.RasterToImageFilter;
40

    
41
import java.awt.Color;
42
import java.awt.Component;
43
import java.awt.Graphics2D;
44
import java.awt.Image;
45
import java.awt.geom.GeneralPath;
46
import java.awt.geom.Point2D;
47
import java.awt.image.BufferedImage;
48
import java.awt.image.DataBuffer;
49
import java.awt.image.ImageObserver;
50

    
51
import java.util.ArrayList;
52
import java.util.Date;
53
import java.util.Vector;
54

    
55

    
56
/**
57
 *
58
 * @author Luis W. Sevilla (sevilla_lui@gva.es)
59
 * @author Nacho Brodin (brodin_ign@gva.es)
60
 *
61
 */
62
public class PxRaster extends PxObj implements Projected {
63
    protected GeoRasterFile[] geoFile = null;
64
    protected ImageObserver component = null;
65
    Vector pts = null;
66

    
67
    // Soporte para n bandas, visibles de 3 en 3, en ficheros separados
68
    //protected GeoRasterFile [] colorBand = null;
69
    protected int rBand = 1;
70

    
71
    // Soporte para n bandas, visibles de 3 en 3, en ficheros separados
72
    //protected GeoRasterFile [] colorBand = null;
73
    protected int gBand = 2;
74

    
75
    // Soporte para n bandas, visibles de 3 en 3, en ficheros separados
76
    //protected GeoRasterFile [] colorBand = null;
77
    protected int bBand = 3;
78
    public RasterStats stats = new RasterStats();
79
    int transparente = 0x10ffff80;
80
    String vName = null;
81
    protected boolean pintaMarco = false; //true;
82
    IProjection proj = null;
83
    protected Extent extentOrig = null;
84
    ICoordTrans rp = null;
85
    public RasterFilterStack filterStack = new RasterFilterStack(stats);
86
    private BandSwitch bandSwitch = new BandSwitch();
87
    private boolean firstPxRaster = true;
88
    private final double percentFilterInit = 0.02;
89
    private RasterFilterStackManager stackManager = null;
90
    private Image geoImage = null;
91
    private ViewPortData lastViewPort = null;
92

    
93
    /*public boolean transparencyFilterEnabled = false;
94
    public boolean enhancedFilterEnabled = false;
95
    public boolean tailFilterEnabled = false;*/
96

    
97
    /**
98
     * Constructor.
99
     * @param component
100
     */
101
    public PxRaster(ImageObserver component) {
102
        this.component = component;
103
    }
104

    
105
    /**
106
     * Contructor para un solo fichero
107
     * @param proj        Proyeccci?n
108
     * @param fname Nombre del fichero
109
     * @param component
110
     */
111
    public PxRaster(IProjection proj, String fname, ImageObserver component) {
112
        geoFile = new GeoRasterFile[1];
113
        geoFile[0] = GeoRasterFile.openFile(proj, fname); //loadECW(fname);
114
        geoFile[0].setUpdatable((Component) component);
115
        this.proj = proj;
116
        this.component = component;
117
        setExtent(geoFile[0].getExtent());
118
        geoFile[0].setView(geoFile[0].getExtent());
119
        extentOrig = extent;
120
        bandSwitch.addFile(geoFile[0]);
121

    
122
        if (geoFile[0].getBandCount() >= 3) {
123
            setBand(GeoRasterFile.RED_BAND, 0);
124
            setBand(GeoRasterFile.GREEN_BAND, 1);
125
            setBand(GeoRasterFile.BLUE_BAND, 2);
126
        } else if (geoFile[0].getBandCount() == 2) {
127
            setBand(GeoRasterFile.RED_BAND, 0);
128
            setBand(GeoRasterFile.GREEN_BAND, 1);
129
            setBand(GeoRasterFile.BLUE_BAND, 1);
130
        } else if (geoFile[0].getBandCount() == 1) {
131
            //setBand(GeoRasterFile.RED_BAND|GeoRasterFile.GREEN_BAND|GeoRasterFile.BLUE_BAND, 0);
132
            setBand(GeoRasterFile.RED_BAND, 0);
133
            setBand(GeoRasterFile.GREEN_BAND, 0);
134
            setBand(GeoRasterFile.BLUE_BAND, 0);
135
        }
136
    }
137

    
138
    /**
139
     * Constructor para multiples ficheros
140
     */
141
    public PxRaster(IProjection proj, String[] fnames, ImageObserver component) {
142
        this.proj = proj;
143
        this.component = component;
144
        geoFile = new GeoRasterFile[fnames.length];
145

    
146
        for (int i = 0; i < geoFile.length; i++) {
147
            geoFile[i] = GeoRasterFile.openFile(proj, fnames[i]); //loadECW(fname);
148
            geoFile[i].setUpdatable((Component) component);
149
            setExtent(geoFile[i].getExtent());
150
            geoFile[i].setView(geoFile[i].getExtent());
151
            bandSwitch.addFile(geoFile[i]);
152
        }
153

    
154
        //geoFile = geoFile[0];
155
        extentOrig = extent;
156

    
157
        if ((fnames.length >= 3) || (geoFile[0].getBandCount() > 2)) {
158
            setBand(GeoRasterFile.RED_BAND, 0);
159
            setBand(GeoRasterFile.GREEN_BAND, 1);
160
            setBand(GeoRasterFile.BLUE_BAND, 2);
161
        } else {
162
            setBand(GeoRasterFile.RED_BAND | GeoRasterFile.GREEN_BAND |
163
                    GeoRasterFile.BLUE_BAND, 0);
164
        }
165
    }
166

    
167
    public PxRaster(GeoRasterFile eFile, ImageObserver component, Extent view) {
168
        geoFile = new GeoRasterFile[1];
169
        geoFile[0] = eFile; //loadECW(fname);
170
        geoFile[0].setUpdatable((Component) component);
171
        setProjection(geoFile[0].getProjection());
172
        this.component = component;
173

    
174
        setExtent(geoFile[0].getExtent());
175
        geoFile[0].setView(view); //geoFile.getExtent());
176
        extentOrig = extent;
177
        bandSwitch.addFile(eFile);
178

    
179
        if (geoFile[0].getBandCount() >= 3) {
180
            setBand(GeoRasterFile.RED_BAND, 0);
181
            setBand(GeoRasterFile.GREEN_BAND, 1);
182
            setBand(GeoRasterFile.BLUE_BAND, 2);
183
        } else if (geoFile[0].getBandCount() == 2) {
184
            setBand(GeoRasterFile.RED_BAND, 0);
185
            setBand(GeoRasterFile.GREEN_BAND, 1);
186
            setBand(GeoRasterFile.BLUE_BAND, 1);
187
        } else if (geoFile[0].getBandCount() == 1) {
188
            //setBand(GeoRasterFile.RED_BAND|GeoRasterFile.GREEN_BAND|GeoRasterFile.BLUE_BAND, 0);
189
            setBand(GeoRasterFile.RED_BAND, 0);
190
            setBand(GeoRasterFile.GREEN_BAND, 0);
191
            setBand(GeoRasterFile.BLUE_BAND, 0);
192
        }
193
    }
194

    
195
    /**
196
     * A?ade un GeoRasterFile al PxRaster
197
     * @param fileName Nombre del fichero
198
     */
199
    public void addFile(String fileName) {
200
        if (geoFile != null) {
201
            GeoRasterFile[] listFiles = new GeoRasterFile[geoFile.length + 1];
202

    
203
            for (int i = 0; i < geoFile.length; i++)
204
                listFiles[i] = geoFile[i];
205

    
206
            listFiles[geoFile.length] = GeoRasterFile.openFile(proj, fileName);
207
            listFiles[geoFile.length].setUpdatable((Component) component);
208
            setExtent(listFiles[geoFile.length].getExtent());
209
            listFiles[geoFile.length].setView(listFiles[geoFile.length].getExtent());
210
            bandSwitch.addFile(listFiles[geoFile.length]);
211
            geoFile = listFiles;
212
        } else {
213
            System.err.println("PxRaster.addFile(): Imagen no cargada.");
214

    
215
            return;
216
        }
217
    }
218

    
219
    /**
220
     * Devuelve el Extent de un fichero son necesidad de a?adirlo
221
     * al PxRaster
222
     * @param fileName
223
     * @return
224
     */
225
    public Extent testExtentFile(String fileName) {
226
        GeoRasterFile grf = GeoRasterFile.openFile(proj, fileName);
227

    
228
        return grf.getExtent();
229
    }
230

    
231
    /**
232
     * Obtiene el valor del pixel del Image en la posici?n wcx,wcy
233
     * @param wcx Posici?n x
234
     * @param wcx Posici?n y
235
     * @return valor de pixel
236
     */
237
    public int[] getPixel(double wcx, double wcy) {
238
        if (geoImage != null) {
239
            int ptox = 0;
240
            int ptoy = 0;
241

    
242
            try {
243
                //Extent de la imagen completa
244
                Extent extOrtofoto = geoFile[0].getExtent();
245

    
246
                //Variables q definen el extent del objeto image
247
                double minx = 0;
248

    
249
                //Variables q definen el extent del objeto image
250
                double miny = 0;
251

    
252
                //Variables q definen el extent del objeto image
253
                double maxx = 0;
254

    
255
                //Variables q definen el extent del objeto image
256
                double maxy = 0;
257

    
258
                if (lastViewPort.getExtent().getMin().getX() < extOrtofoto.minX()) {
259
                    minx = extOrtofoto.minX();
260
                } else {
261
                    minx = lastViewPort.getExtent().getMin().getX();
262
                }
263

    
264
                if (lastViewPort.getExtent().getMax().getX() > extOrtofoto.maxX()) {
265
                    maxx = extOrtofoto.maxX();
266
                } else {
267
                    maxx = lastViewPort.getExtent().getMax().getX();
268
                }
269

    
270
                if (lastViewPort.getExtent().getMin().getY() < extOrtofoto.minY()) {
271
                    miny = extOrtofoto.minY();
272
                } else {
273
                    miny = lastViewPort.getExtent().getMin().getY();
274
                }
275

    
276
                if (lastViewPort.getExtent().getMax().getY() > extOrtofoto.maxY()) {
277
                    maxy = extOrtofoto.maxY();
278
                } else {
279
                    maxy = lastViewPort.getExtent().getMax().getY();
280
                }
281

    
282
                //Comprobamos que estemos dentro del extent del Image
283
                if ((wcx < minx) || (wcx > maxx) || (wcy < miny) ||
284
                        (wcy > maxy)) {
285
                    int[] res = { -1, -1, -1, -1 };
286

    
287
                    return res;
288
                }
289

    
290
                //Pasamos a coordenadas del Image las coordenadas del mundo real
291
                int w = ((BufferedImage) geoImage).getWidth();
292
                int h = ((BufferedImage) geoImage).getHeight();
293
                double wcw = maxx - minx;
294
                double wch = maxy - miny;
295
                ptox = (int) (((wcx - minx) * w) / wcw);
296
                ptoy = (int) (((wcy - miny) * h) / wch);
297

    
298
                //Obtenemos el pto seleccionado del Image y extraemos el RGB
299
                int px = ((BufferedImage) geoImage).getRGB(ptox, h - ptoy);
300
                int[] values = new int[4];
301
                values[0] = ((px & 0xff000000) >> 24);
302
                values[1] = ((px & 0x00ff0000) >> 16);
303
                values[2] = ((px & 0x0000ff00) >> 8);
304
                values[3] = (px & 0x000000ff);
305

    
306
                return values;
307
            } catch (ArrayIndexOutOfBoundsException e) {
308
                e.printStackTrace();
309
            }
310
        }
311

    
312
        return null;
313
    }
314

    
315
    /**
316
     * Elimina un GeoRasterFile al PxRaster
317
     * @param finaName Nombre del fichero
318
     */
319
    public void delFile(String fileName) {
320
        if (geoFile != null) {
321
            Vector grfTemp = new Vector();
322

    
323
            for (int i = 0; i < geoFile.length; i++) {
324
                if (!fileName.endsWith(geoFile[i].getName())) {
325
                    grfTemp.add(geoFile[i]);
326
                }
327
            }
328

    
329
            GeoRasterFile[] listFiles = new GeoRasterFile[grfTemp.size()];
330

    
331
            for (int i = 0; i < listFiles.length; i++)
332
                listFiles[i] = (GeoRasterFile) grfTemp.get(i);
333

    
334
            //Lo eliminamos del bandSwitch
335
            for (int i = 0; i < geoFile.length; i++) {
336
                if (fileName.endsWith(geoFile[i].getName())) {
337
                    bandSwitch.removeFile(geoFile[i]);
338
                }
339
            }
340

    
341
            geoFile = listFiles;
342

    
343
            /*if(geoFile!=null)
344
                    setExtent(geoFile[0].getExtent());*/
345
        } else {
346
            System.err.println("PxRaster.addFile(): Imagen no cargada.");
347

    
348
            return;
349
        }
350
    }
351

    
352
    /**
353
     * Obtiene el tama?o de bloque
354
     * @return
355
     */
356
    public int getBlockSize() {
357
        return geoFile[0].getBlockSize();
358
    }
359

    
360
    /**
361
     *
362
     * @return
363
     */
364
    public GeoRasterFile[] getGeoFiles() {
365
        return geoFile;
366
    }
367

    
368
    public GeoRasterFile getGeoFile() {
369
        return geoFile[0];
370
    }
371

    
372
    /**
373
     * Obtiene el n?mero de bandas del PxRaster. Si ls longitud de geoFile es 1 quiere
374
     * decir que hay un solo fichero que contiene todas las bandas. Si hay m?s de un geoFile
375
     * el n?mero de bandas ser? la suma de todas las bandas de las im?genes que forman
376
     * el geoFile
377
     * @return N?mero de bandas
378
     */
379
    public int getBandCount() {
380
        return bandSwitch.getBandCount();
381
    }
382

    
383
    /**
384
     * Obtiene el tipo de dato del primer GeoRasterFile
385
     * @return
386
     */
387
    public int getDataType() {
388
        if (geoFile != null) {
389
            return geoFile[0].getDataType();
390
        } else {
391
            System.err.println("PxRaster.getDataType(): Imagen no cargada.");
392
        }
393

    
394
        return 0;
395
    }
396

    
397
    /**
398
     * Obtiene el vector de GeoRasterFile que componen el PxRaster
399
     * @return vector GeoRasterFile
400
     */
401
    public GeoRasterFile[] getFiles() {
402
        return geoFile;
403
    }
404

    
405
    /**
406
     * Asocia un colorBand al rojo, verde o azul.
407
     * @param flag cual (o cuales) de las bandas.
408
     * @param nBand        que colorBand
409
     */
410
    public void setBand(int flag, int nBand) {
411
        bandSwitch.setBand(flag, nBand);
412
    }
413

    
414
    /**
415
     * Obtiene la posici?n del fichero asignado a la banda
416
     * que se le pasa por par?metro
417
     * @return
418
     */
419
    public int getPosFile(int flag) {
420
        if (flag == GeoRasterFile.RED_BAND) {
421
            return bandSwitch.getBandR().getPos();
422
        } else if (flag == GeoRasterFile.GREEN_BAND) {
423
            return bandSwitch.getBandG().getPos();
424
        } else if (flag == GeoRasterFile.BLUE_BAND) {
425
            return bandSwitch.getBandB().getPos();
426
        } else {
427
            return -1;
428
        }
429
    }
430

    
431
    /**
432
     * Devuelve el colorBand activo en la banda especificada.
433
     * @param flag banda.
434
     */
435
    public int getBand(int flag) {
436
        if (flag == GeoRasterFile.RED_BAND) {
437
            return bandSwitch.getBandR().getBand();
438
        } else if (flag == GeoRasterFile.GREEN_BAND) {
439
            return bandSwitch.getBandG().getBand();
440
        } else if (flag == GeoRasterFile.BLUE_BAND) {
441
            return bandSwitch.getBandB().getBand();
442
        } else {
443
            return -1;
444
        }
445
    }
446

    
447
    /**
448
     * @param pm
449
     */
450
    public void setDrawBorder(boolean pm) {
451
        pintaMarco = pm;
452
    }
453

    
454
    /**
455
     * Obtiene el nombre del fichero si solo hay uno
456
     * @return Nombre del fichero
457
     */
458
    public String getFName() {
459
        return geoFile[0].getName();
460
    }
461

    
462
    /**
463
     * Obtiene el nombre del fichero GeoRasterFile seleccionado
464
     * @param i        posici?n del GeoRasterFile
465
     * @return Nombre del fichero
466
     */
467
    public String getFName(int i) {
468
        if (geoFile != null) {
469
            if (i < geoFile.length) {
470
                return geoFile[i].getName();
471
            } else {
472
                return null;
473
            }
474
        } else {
475
            System.err.println("PxRaster.getFName(): Imagen no cargada.");
476

    
477
            return null;
478
        }
479
    }
480

    
481
    /**
482
     * Obtiene una lista de Strings con los nombres de todos los ficheros
483
     * que tiene el PxRaster
484
     * @return Lista de nombres
485
     */
486
    public String[] getLisName() {
487
        if (geoFile != null) {
488
            String[] list = new String[geoFile.length];
489

    
490
            for (int i = 0; i < geoFile.length; i++)
491
                list[i] = geoFile[i].getName();
492

    
493
            return list;
494
        } else {
495
            System.err.println("PxRaster.getListName(): Imagen no cargada.");
496

    
497
            return null;
498
        }
499
    }
500

    
501
    /**
502
     * Devuelve la anchura total del fichero, en pixeles.
503
     * @return ancho en pixeles
504
     */
505
    public int getFWidth() {
506
        if (geoFile != null) {
507
            return geoFile[0].getWidth();
508
        } else {
509
            System.err.println("PxRaster.getFWidth(): Imagen no cargada.");
510

    
511
            return 0;
512
        }
513
    }
514

    
515
    /**
516
     * Devuelve la anchura total del fichero, en pixeles.
517
     * @return ancho en pixeles
518
     */
519
    public int getFWidth(int i) {
520
        if (i < geoFile.length) {
521
            return geoFile[i].getWidth();
522
        } else {
523
            System.err.println("PxRaster.getFWidth(): Imagen no cargada.");
524

    
525
            return 0;
526
        }
527
    }
528

    
529
    /**
530
     * Devuelve la altura total del fichero, en pixeles.
531
     * @return alto en pixeles
532
     */
533
    public int getFHeight() {
534
        if (geoFile != null) {
535
            return geoFile[0].getHeight();
536
        } else {
537
            System.err.println("PxRaster.getFHeight(): Imagen no cargada.");
538

    
539
            return 0;
540
        }
541
    }
542

    
543
    /**
544
     * Devuelve la altura total del fichero, en pixeles.
545
     * @return alto en pixeles
546
     */
547
    public int getFHeight(int i) {
548
        if (i < geoFile.length) {
549
            return geoFile[i].getHeight();
550
        } else {
551
            System.err.println("PxRaster.getFHeight(): Imagen no cargada.");
552

    
553
            return 0;
554
        }
555
    }
556

    
557
    /**
558
     * Devuelve el n?mero de ficheros que componen el PxRaster
559
     * @return N?mero de ficheros
560
     */
561
    public int nFiles() {
562
        if (geoFile != null) {
563
            return geoFile.length;
564
        } else {
565
            return 0;
566
        }
567
    }
568

    
569
    /**
570
     * Activa o desactiva la transparencia de los ficheros que forman el PxRaster
571
     * @param t true o false para activar o desactivar transparencia
572
     */
573
    public void setTransparency(boolean t) {
574
        if (geoFile != null) {
575
            for (int i = 0; i < geoFile.length; i++) {
576
                geoFile[i].setTransparency(t);
577
            }
578
        } else {
579
            System.err.println("PxRaster.setTransparency(): Imagen no cargada.");
580

    
581
            return;
582
        }
583
    }
584

    
585
    /**
586
     * Pone la transparencia de los ficheros de la imagen a un valor
587
     * @param t Valor para la transparencia
588
     */
589
    public void setTransparency(int t) {
590
        if (geoFile != null) {
591
            for (int i = 0; i < geoFile.length; i++) {
592
                geoFile[i].setTransparency(t);
593
            }
594
        } else {
595
            System.err.println("PxRaster.setTransparency(): Imagen no cargada.");
596

    
597
            return;
598
        }
599
    }
600

    
601
    /**
602
     * Obtiene el alpha del primer fichero. Han de ser iguales en todos
603
     * los ficheros de la imagen.
604
     * @return alpha
605
     */
606
    public int getAlpha() {
607
        if (geoFile != null) {
608
            return geoFile[0].getAlpha();
609
        } else {
610
            System.err.println("PxRaster.getAlpha(): Imagen no cargada.");
611

    
612
            return 0;
613
        }
614
    }
615

    
616
    /**
617
     * Asigna el extent
618
     * @param e extent
619
     */
620
    public void setExtent(Extent e) {
621
        super.extent = e;
622
        pts = new Vector();
623
        pts.add(proj.createPoint(e.minX(), e.minY()));
624
        pts.add(proj.createPoint(e.maxX(), e.minY()));
625
        pts.add(proj.createPoint(e.maxX(), e.maxY()));
626
        pts.add(proj.createPoint(e.minX(), e.maxY()));
627
    }
628

    
629
    /**
630
     * Cambia la vista (viewport) sobre el raster.
631
     *
632
     * @param v extent
633
     * @param vName nombre
634
     */
635
    public void setView(Extent v, String vName) {
636
        if (geoFile != null) {
637
            for (int i = 0; i < geoFile.length; i++) {
638
                geoFile[i].setView(v);
639
            }
640
        } else {
641
            System.err.println("PxRaster.setView(): Imagen no cargada.");
642

    
643
            return;
644
        }
645

    
646
        this.vName = vName;
647
    }
648

    
649
    /**
650
     * Obtiene la escala.
651
     *
652
     * @param width
653
     * @param height
654
     * @return
655
     */
656
    public double[] getScale(int width, int height) {
657
        double[] scale = new double[2];
658

    
659
        if (geoFile != null) {
660
            scale[0] = ((double) width) / geoFile[0].getView().width();
661
            scale[1] = ((double) height) / geoFile[0].getView().height();
662

    
663
            return scale;
664
        } else {
665
            System.err.println("PxRaster.getScale(): Imagen no cargada.");
666

    
667
            return null;
668
        }
669
    }
670

    
671
    /**
672
     * 'Normaliza' la vista en funci?n del extent del raster.
673
     *
674
     * @param mat
675
     * @param sz
676
     */
677
    protected void calculateNewView(Extent sz) {
678
        double vx = sz.minX();
679
        double vy = sz.minY();
680
        double vx2 = sz.maxX();
681
        double vy2 = sz.maxY();
682

    
683
        if (sz.minX() < extent.minX()) {
684
            vx = extent.minX();
685
        }
686

    
687
        if (sz.minY() < extent.minY()) {
688
            vy = extent.minY();
689
        }
690

    
691
        if (sz.maxX() > extent.maxX()) {
692
            vx2 = extent.maxX();
693
        }
694

    
695
        if (sz.maxY() > extent.maxY()) {
696
            vy2 = extent.maxY();
697
        }
698

    
699
        if (geoFile != null) {
700
            for (int i = 0; i < geoFile.length; i++)
701
                geoFile[i].setView(new Extent(vx, vy, vx2, vy2));
702
        } else {
703
            System.err.println("PxRaster.calculateNewView(): Imagen no cargada.");
704
        }
705
    }
706

    
707
    /**
708
     * Dibuja el raster
709
     */
710
    public void draw(Graphics2D g, ViewPortData vp) {
711
        geoImage = null;
712

    
713
        long t2;
714
        long t1 = new Date().getTime();
715
        lastViewPort = vp;
716

    
717
        //System.out.println("PxRaster.draw(): vp.extent = "+ vp.getExtent());
718
        //System.out.println("PxRaster.draw():    extent = "+ getExtent());
719
        if ((vp.getExtent().minX() > extent.maxX()) ||
720
                (vp.getExtent().minY() > extent.maxY()) ||
721
                (vp.getExtent().maxX() < extent.minX()) ||
722
                (vp.getExtent().maxY() < extent.minY())) {
723
            return;
724
        }
725

    
726
        calculateNewView(vp.getExtent());
727

    
728
        Extent v = geoFile[0].getView();
729
        double x = v.minX();
730
        double y = v.minY();
731
        double w = v.width();
732
        double h = v.height();
733

    
734
        //System.out.println("Pinto PxRaster:" + v);
735
        double scalex = vp.mat.getScaleX() /* g.getTransform().getScaleX()*/;
736

    
737
        //System.out.println("Pinto PxRaster:" + v);
738
        double scaley = vp.mat.getScaleY() /* g.getTransform().getScaleY() */;
739
        int wImg = (int) Math.ceil(Math.abs(w * scalex) + 1);
740
        int hImg = (int) Math.ceil(Math.abs(h * scaley) + 1);
741

    
742
        //System.out.println("Sz=("+wImg+","+hImg+"); scale=("+scalex+","+scaley+")");
743
        if ((wImg <= 0) || (hImg <= 0)) {
744
            return;
745
        }
746

    
747
        Point2D.Double pt = new Point2D.Double(x, y + h);
748

    
749
        try {
750
            //System.out.println("Dibujando PxRaster: pt0 = "+pt);
751
            vp.mat.transform(pt, pt);
752

    
753
            //System.out.println("Dibujando PxRaster: pt1 = "+pt);
754
            if ((geoFile != null) && geoFile[0] instanceof GdalFile &&
755
                    (geoFile[0].getDataType() != DataBuffer.TYPE_BYTE)) {
756
                //System.out.println("PxRaster: Has dado con un Raster de 16 bits");
757
                RasterBuf raster = ((GdalFile) geoFile[0]).getRaster(wImg,
758
                                                                     hImg, rp);
759
                t2 = new Date().getTime();
760

    
761
                t2 = new Date().getTime();
762
                System.out.println("Dibujando PxRaster: " +
763
                                   ((t2 - t1) / 1000D) +
764
                                   ", secs. Filtrando/Renderizando");
765
                t1 = t2;
766

    
767
                filterStack.setInitRasterBuf(raster);
768

    
769
                //Si la imagen es de 16 bits lleva un filtro de realce por defecto
770
                if (stackManager == null) {
771
                    stackManager = new RasterFilterStackManager(filterStack);
772
                    stackManager.addEnhancedFilter(false, geoFile[0].getName());
773
                    stackManager.removeFilter(stackManager.getTypeFilter("computeminmax"));
774
                    stackManager.addTailFilter(this.percentFilterInit, 0D, false);
775
                }
776

    
777
                geoImage = renderizeRaster(raster);
778
                g.drawImage(geoImage, (int) Math.round(pt.getX()),
779
                            (int) Math.round(pt.getY()), component);
780

    
781
                t2 = new Date().getTime();
782
                System.out.println("Dibujando PxRaster: " +
783
                                   ((t2 - t1) / 1000D) + ", secs. Dibujando");
784
            } else if ((geoFile != null) && (geoFile.length > 1)) { // multiFiles
785
                System.out.println("Dibujando PxRaster (Multifile) ... Bands " +
786
                                   geoFile.length);
787

    
788
                if (bandSwitch.getBandR().getGeoRasterFile() instanceof EcwFile) {
789
                    ((EcwFile) bandSwitch.getBandR().getGeoRasterFile()).setMultifile(true);
790
                }
791

    
792
                if (bandSwitch.getBandG().getGeoRasterFile() instanceof EcwFile) {
793
                    ((EcwFile) bandSwitch.getBandG().getGeoRasterFile()).setMultifile(true);
794
                }
795

    
796
                if (bandSwitch.getBandB().getGeoRasterFile() instanceof EcwFile) {
797
                    ((EcwFile) bandSwitch.getBandB().getGeoRasterFile()).setMultifile(true);
798
                }
799

    
800
                geoImage = bandSwitch.getBandR().getGeoRasterFile().updateImage(wImg,
801
                                                                                hImg,
802
                                                                                rp,
803
                                                                                null,
804
                                                                                0,
805
                                                                                0);
806
                geoImage = bandSwitch.getBandG().getGeoRasterFile().updateImage(wImg,
807
                                                                                hImg,
808
                                                                                rp,
809
                                                                                geoImage,
810
                                                                                bandSwitch.getBandG()
811
                                                                                          .getBand(),
812
                                                                                GeoRasterFile.GREEN_BAND);
813
                geoImage = bandSwitch.getBandB().getGeoRasterFile().updateImage(wImg,
814
                                                                                hImg,
815
                                                                                rp,
816
                                                                                geoImage,
817
                                                                                bandSwitch.getBandB()
818
                                                                                          .getBand(),
819
                                                                                GeoRasterFile.BLUE_BAND);
820

    
821
                filterStack.setInitRasterBuf(geoImage);
822

    
823
                geoImage = renderizeRaster(geoImage);
824
                g.drawImage(geoImage, (int) Math.round(pt.getX()),
825
                            (int) Math.round(pt.getY()), component);
826
                t2 = new Date().getTime();
827
                System.out.println("Dibujando PxRaster: " +
828
                                   ((t2 - t1) / 1000D) + ", secs.");
829
            } else if ((geoFile != null) && (geoFile.length == 1)) { // Una solo fichero
830
                geoImage = bandSwitch.getBandR().getGeoRasterFile().updateImage(wImg,
831
                                                                                hImg,
832
                                                                                rp,
833
                                                                                null,
834
                                                                                0,
835
                                                                                0);
836

    
837
                //System.out.println("Dibujando PxRaster sz=("+wImg+","+hImg+"...");
838
                filterStack.setInitRasterBuf(geoImage);
839

    
840
                geoImage = renderizeRaster(geoImage);
841
                g.drawImage(geoImage, (int) Math.round(pt.getX()),
842
                            (int) Math.round(pt.getY()), component);
843
                t2 = new Date().getTime();
844
                System.out.println("Dibujando PxRaster: " +
845
                                   ((t2 - t1) / 1000D) + ", secs.");
846
            } else { // no cargada
847
                System.err.println("Dibujando PxRaster: Foto no cargada.");
848
            }
849
        } catch (Exception e) {
850
            e.printStackTrace();
851
        }
852

    
853
        ;
854

    
855
        if (pintaMarco) {
856
            drawMarco(g, vp);
857
        }
858
    }
859

    
860
    /**
861
     * Aplica la pila de fitros sobre el RasterBuf pasado como par?metro
862
     * y lo devuelve en Image
863
     * @param raster        RasterBuf con la imagen sobre la que se aplicaran filtros
864
     * @return        Image con la imagen con los filtros puestos
865
     */
866
    public Image renderizeRaster(RasterBuf raster) {
867
        if (filterStack != null) {
868
            filterStack.execute(raster);
869
        }
870

    
871
        //Aplicamos el filtro para convertir a Image
872
        RasterToImageFilter rti = new RasterToImageFilter();
873
        rti.addParam("raster", raster);
874
        rti.addParam("alpha", new Integer(this.getAlpha()));
875
        rti.execute();
876
        raster = null;
877

    
878
        return (Image) rti.getResult("raster");
879
    }
880

    
881
    /**
882
     * Aplica la pila de filtros sobre el Image pasado como par?metro y lo devuelve.
883
     * Si la salida del ?ltimo filtro es un RasterBuf lo convertir? a Image
884
     * @param image Image con la imagen sobre la que se aplicaran filtros
885
     * @return        Image con la imagen con los filtros puestos
886
     */
887
    public Image renderizeRaster(Image image) {
888
        if (filterStack != null) {
889
            filterStack.execute(image);
890
        }
891

    
892
        if (filterStack.getOutDataType() != RasterBuf.TYPE_IMAGE) {
893
            //Aplicamos el filtro para convertir a Image
894
            RasterToImageFilter rti = new RasterToImageFilter();
895
            rti.addParam("raster", (RasterBuf) filterStack.getResult());
896
            rti.addParam("alpha", new Integer(this.getAlpha()));
897
            rti.execute();
898

    
899
            return (Image) rti.getResult("raster");
900
        }
901

    
902
        return image;
903
    }
904

    
905
    /**
906
     *
907
     * @param g
908
     * @param vp
909
     */
910
    public void drawMarco(Graphics2D g, ViewPortData vp) {
911
        //                Color color = new Color(255,222,165,128), fillColor = new Color(255,214,132,128);
912
        Color color = new Color(128, 128, 128);
913

    
914
        //                Color color = new Color(255,222,165,128), fillColor = new Color(255,214,132,128);
915
        Color fillColor = new Color(255, 220, 220, 0x20);
916
        GeneralPath gp = newGP(vp);
917
        g.setColor(fillColor);
918
        g.fill(gp);
919
        g.setColor(color);
920
        g.draw(gp);
921
    }
922

    
923
    private GeneralPath newGP(ViewPortData vp) {
924
        //if (gp != null) return;
925
        GeneralPath gp = new GeneralPath();
926
        Point2D.Double pt0 = new Point2D.Double(0.0, 0.0);
927
        Point2D.Double pt1 = new Point2D.Double(0.0, 0.0);
928
        Point2D.Double pt2 = new Point2D.Double(0.0, 0.0);
929
        Point2D.Double pt3 = new Point2D.Double(0.0, 0.0);
930
        vp.mat.transform((Point2D) pts.get(0), pt0);
931
        vp.mat.transform((Point2D) pts.get(1), pt1);
932
        vp.mat.transform((Point2D) pts.get(2), pt2);
933
        vp.mat.transform((Point2D) pts.get(3), pt3);
934

    
935
        // Aspa desde el extent
936
        gp.moveTo((float) pt0.getX(), (float) pt0.getY());
937
        gp.lineTo((float) pt2.getX(), (float) pt2.getY());
938
        gp.moveTo((float) pt1.getX(), (float) pt1.getY());
939
        gp.lineTo((float) pt3.getX(), (float) pt3.getY());
940

    
941
        // Extent
942
        gp.moveTo((float) pt0.getX(), (float) pt0.getY());
943
        gp.lineTo((float) pt1.getX(), (float) pt1.getY());
944
        gp.lineTo((float) pt2.getX(), (float) pt2.getY());
945
        gp.lineTo((float) pt3.getX(), (float) pt3.getY());
946

    
947
        if (extentOrig != extent) {
948
            gp.lineTo((float) pt0.getX(), (float) pt0.getY());
949

    
950
            Vector pts = new Vector();
951
            pts.add(proj.createPoint(extentOrig.minX(), extentOrig.minY()));
952
            pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.minY()));
953
            pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.maxY()));
954
            pts.add(proj.createPoint(extentOrig.minX(), extentOrig.maxY()));
955

    
956
            vp.mat.transform((Point2D) pts.get(0), pt0);
957
            vp.mat.transform((Point2D) pts.get(1), pt1);
958
            vp.mat.transform((Point2D) pts.get(2), pt2);
959
            vp.mat.transform((Point2D) pts.get(3), pt3);
960
            gp.moveTo((float) pt0.getX(), (float) pt0.getY());
961
            gp.lineTo((float) pt1.getX(), (float) pt1.getY());
962
            gp.lineTo((float) pt2.getX(), (float) pt2.getY());
963
            gp.lineTo((float) pt3.getX(), (float) pt3.getY());
964
        }
965

    
966
        gp.closePath();
967

    
968
        return gp;
969
    }
970

    
971
    public IProjection getProjection() {
972
        return proj;
973
    }
974

    
975
    public void setProjection(IProjection p) {
976
        proj = p;
977
    }
978

    
979
    public void reProject(ICoordTrans rp) {
980
        this.rp = rp.getInverted();
981
        System.out.println("PxRaster: reProject()");
982

    
983
        //geoFile.reProject(rp);
984
        Vector savePts = pts;
985

    
986
        pts = new Vector();
987
        extent = new Extent();
988

    
989
        Point2D ptDest = null;
990

    
991
        for (int i = 0; i < savePts.size(); i++) {
992
            ptDest = rp.getPDest().createPoint(0.0, 0.0);
993
            ptDest = rp.convert((Point2D) savePts.get(i), ptDest);
994
            pts.add(ptDest);
995
            extent.add(ptDest);
996
        }
997

    
998
        setProjection(rp.getPDest());
999
    }
1000

    
1001
    /**
1002
     * Obtiene el Stack Manager
1003
     * @return
1004
     */
1005
    public RasterFilterStackManager getStackManager() {
1006
        return this.stackManager;
1007
    }
1008

    
1009
    /**
1010
     * Asigna el Stack Manager
1011
     * @return
1012
     */
1013
    public void setStackManager(RasterFilterStackManager sm) {
1014
        this.stackManager = sm;
1015
    }
1016

    
1017
    /**
1018
     * Estructura que representa la relaci?n entre un fichero y la banda que se
1019
     * utiliza de este.
1020
     * @author Nacho Brodin <brodin_ign@gva.es>
1021
     */
1022
    class FileBands {
1023
        GeoRasterFile grf; //Fichero
1024
        int band; //Banda asinada
1025
        int filePos; //posici?n del fichero
1026

    
1027
        /**
1028
         * @return Returns the band.
1029
         */
1030
        public int getBand() {
1031
            return band;
1032
        }
1033

    
1034
        /**
1035
         * @param band The band to set.
1036
         */
1037
        public void setBand(int band) {
1038
            this.band = band;
1039
        }
1040

    
1041
        /**
1042
         * @return Returns the band.
1043
         */
1044
        public int getPos() {
1045
            return filePos;
1046
        }
1047

    
1048
        /**
1049
         * @param band The band to set.
1050
         */
1051
        public void setPos(int pos) {
1052
            this.filePos = pos;
1053
        }
1054

    
1055
        /**
1056
         * @return Returns the grf.
1057
         */
1058
        public GeoRasterFile getGeoRasterFile() {
1059
            return grf;
1060
        }
1061

    
1062
        /**
1063
         * @param grf The grf to set.
1064
         */
1065
        public void setGeoRasterFile(GeoRasterFile grf) {
1066
            this.grf = grf;
1067
        }
1068
    }
1069

    
1070
    /**
1071
     * Clase que lleva la gesti?n entre la relaci?n de ficheros representados
1072
     * por un GeoRasterFile y el n?mero de bandas que contienen. Esto es necesario
1073
     * para la actualizaci?n de la vista ya que para un Image dado podemos tener
1074
     * multiples bandas que pueden ser leidas desde diferentes ficheros.
1075
     *
1076
     * @author Nacho Brodin <brodin_ign@gva.es>
1077
     */
1078
    class BandSwitch {
1079
        private ArrayList geoFiles = new ArrayList(); //Lista de GeoRasterFile con los ficheros raster cargados
1080
        private FileBands[] listBands = new FileBands[3];
1081
        private boolean debug = false;
1082

    
1083
        BandSwitch() {
1084
            for (int i = 0; i < listBands.length; i++)
1085
                listBands[i] = new FileBands();
1086
        }
1087

    
1088
        /**
1089
         * A?ade un fichero
1090
         * @param grf
1091
         */
1092
        public void addFile(GeoRasterFile grf) {
1093
            geoFiles.add(grf);
1094

    
1095
            if (debug) {
1096
                this.show("addFile");
1097
            }
1098
        }
1099

    
1100
        /**
1101
         * Elimina un fichero
1102
         * @param grf
1103
         */
1104
        public void removeFile(GeoRasterFile grf) {
1105
            for (int iFile = 0; iFile < geoFiles.size(); iFile++) {
1106
                if (grf.equals(geoFiles.get(iFile))) {
1107
                    geoFiles.remove(iFile);
1108
                    iFile--;
1109
                }
1110
            }
1111

    
1112
            if (debug) {
1113
                this.show("removeFile");
1114
            }
1115
        }
1116

    
1117
        /**
1118
         *
1119
         * @param flag
1120
         * @param grf
1121
         * @param nBand
1122
         */
1123
        public void setBand(int flag, GeoRasterFile grf, int nBand) {
1124
            if ((flag & GeoRasterFile.RED_BAND) == GeoRasterFile.RED_BAND) {
1125
                listBands[0].setBand(nBand);
1126
                listBands[0].setGeoRasterFile(grf);
1127
            } else if ((flag & GeoRasterFile.GREEN_BAND) == GeoRasterFile.GREEN_BAND) {
1128
                listBands[1].setBand(nBand);
1129
                listBands[1].setGeoRasterFile(grf);
1130
            } else if ((flag & GeoRasterFile.BLUE_BAND) == GeoRasterFile.BLUE_BAND) {
1131
                listBands[2].setBand(nBand);
1132
                listBands[2].setGeoRasterFile(grf);
1133
            } else {
1134
                return;
1135
            }
1136

    
1137
            grf.setBand(flag, nBand);
1138
        }
1139

    
1140
        /**
1141
         * Asigna las bandas
1142
         * @param flag
1143
         * @param nBand
1144
         */
1145
        public void setBand(int flag, int nBand) {
1146
            int cont = 0;
1147

    
1148
            for (int iGrf = 0; iGrf < geoFiles.size(); iGrf++) {
1149
                for (int iBand = 0;
1150
                         iBand < ((GeoRasterFile) geoFiles.get(iGrf)).getBandCount();
1151
                         iBand++) {
1152
                    if (((flag & GeoRasterFile.RED_BAND) == GeoRasterFile.RED_BAND) &&
1153
                            (cont == nBand)) {
1154
                        listBands[0].setGeoRasterFile(((GeoRasterFile) geoFiles.get(iGrf)));
1155
                        listBands[0].setBand(iBand);
1156
                        listBands[0].setPos(iGrf);
1157
                        ((GeoRasterFile) geoFiles.get(iGrf)).setBand(flag, iBand);
1158

    
1159
                        //System.out.println("==>Asignando banda R FILE="+iGrf+" BANDA="+iBand);
1160
                    } else if (((flag & GeoRasterFile.GREEN_BAND) == GeoRasterFile.GREEN_BAND) &&
1161
                                   (cont == nBand)) {
1162
                        listBands[1].setGeoRasterFile(((GeoRasterFile) geoFiles.get(iGrf)));
1163
                        listBands[1].setBand(iBand);
1164
                        listBands[1].setPos(iGrf);
1165
                        ((GeoRasterFile) geoFiles.get(iGrf)).setBand(flag, iBand);
1166

    
1167
                        //System.out.println("==>Asignando banda G FILE="+iGrf+" BANDA="+iBand);
1168
                    } else if (((flag & GeoRasterFile.BLUE_BAND) == GeoRasterFile.BLUE_BAND) &&
1169
                                   (cont == nBand)) {
1170
                        listBands[2].setGeoRasterFile(((GeoRasterFile) geoFiles.get(iGrf)));
1171
                        listBands[2].setBand(iBand);
1172
                        listBands[2].setPos(iGrf);
1173
                        ((GeoRasterFile) geoFiles.get(iGrf)).setBand(flag, iBand);
1174

    
1175
                        //System.out.println("==>Asignando banda B FILE="+iGrf+" BANDA="+iBand);
1176
                    }
1177

    
1178
                    cont++;
1179
                }
1180
            }
1181

    
1182
            if (debug) {
1183
                this.show("setBand");
1184
            }
1185
        }
1186

    
1187
        /**
1188
         * Obtiene el n?mero de bandas
1189
         * @return
1190
         */
1191
        public int getBandCount() {
1192
            int nbandas = 0;
1193

    
1194
            for (int iGrf = 0; iGrf < geoFiles.size(); iGrf++)
1195
                nbandas += ((GeoRasterFile) geoFiles.get(iGrf)).getBandCount();
1196

    
1197
            return nbandas;
1198
        }
1199

    
1200
        /**
1201
         * Obtiene el GeoRasterFile que hay que leer para cargar la banda del rojo
1202
         * y la banda de este fichero que se utiliza para esta asignaci?n.
1203
         * @return        Estructura FileBand con la relaci?n fichero-banda
1204
         */
1205
        public FileBands getBandR() {
1206
            return listBands[0];
1207
        }
1208

    
1209
        /**
1210
         * Obtiene el GeoRasterFile que hay que leer para cargar la banda del verde
1211
         * y la banda de este fichero que se utiliza para esta asignaci?n.
1212
         * @return        Estructura FileBand con la relaci?n fichero-banda
1213
         */
1214
        public FileBands getBandG() {
1215
            return listBands[1];
1216
        }
1217

    
1218
        /**
1219
         * Obtiene el GeoRasterFile que hay que leer para cargar la banda del azul
1220
         * y la banda de este fichero que se utiliza para esta asignaci?n.
1221
         * @return        Estructura FileBand con la relaci?n fichero-banda
1222
         */
1223
        public FileBands getBandB() {
1224
            return listBands[2];
1225
        }
1226

    
1227
        public void show(String op) {
1228
            String banda = null;
1229
            System.out.println("** " + op + " **");
1230

    
1231
            for (int i = 0; i < 3; i++) {
1232
                if (i == 0) {
1233
                    banda = new String("Rojo");
1234
                } else if (i == 1) {
1235
                    banda = new String("Verde");
1236
                } else if (i == 2) {
1237
                    banda = new String("Azul");
1238
                }
1239

    
1240
                System.out.println("** BANDA IMAGE=" + banda + " FILEPOS=" +
1241
                                   listBands[i].getBand() +
1242
                                   " BANDA DEL FICHERO=" +
1243
                                   listBands[i].getBand());
1244
            }
1245
        }
1246
    }
1247
}