Statistics
| Revision:

svn-gvsig-desktop / branches / v02_desarrollo / libraries / libCq CMS for java.old / src / org / cresques / px / PxRaster.java @ 1679

History | View | Annotate | Download (14.1 KB)

1
/*
2
 * PxRaster.java
3
 */
4
package org.cresques.px;
5

    
6
import java.awt.Color;
7
import java.awt.Component;
8
import java.awt.Graphics2D;
9
import java.awt.Image;
10
import java.awt.geom.GeneralPath;
11
import java.awt.geom.Point2D;
12
import java.awt.image.DataBuffer;
13
import java.awt.image.ImageObserver;
14
import java.util.Date;
15
import java.util.Vector;
16

    
17
import org.cresques.cts.ICoordTrans;
18
import org.cresques.cts.IProjection;
19
import org.cresques.geo.Projected;
20
import org.cresques.geo.ViewPortData;
21
import org.cresques.io.GdalFile;
22
import org.cresques.io.GeoRasterFile;
23
import org.cresques.io.raster.ComputeMinMaxFilter;
24
import org.cresques.io.raster.ComputeMinMaxImageFilter;
25
import org.cresques.io.raster.LinearEnhancementFilter;
26
import org.cresques.io.raster.LinearEnhancementImageFilter;
27
import org.cresques.io.raster.RasterBuf;
28
import org.cresques.io.raster.RasterStats;
29
import org.cresques.io.raster.RasterToImageFilter;
30

    
31
public class PxRaster extends PxObj implements Projected {
32
        protected GeoRasterFile geoFile = null;
33
        protected ImageObserver component = null;
34
        Vector pts = null;
35
        // Soporte para n bandas, visibles de 3 en 3, en ficheros separados
36
        protected GeoRasterFile [] colorBand = null;
37
        protected int rBand = 1, gBand = 2, bBand = 3;
38
        
39
        RasterStats stats = new RasterStats();
40
        int transparente = 0x10ffff80;
41

    
42
        String vName = null;
43
        protected boolean pintaMarco = false; //true;
44
        IProjection proj = null;
45
        protected Extent extentOrig = null;
46
        ICoordTrans rp = null;
47
        
48
        /**
49
         * Constructor.
50
         * @param component
51
         */
52
        public PxRaster(ImageObserver component) {
53
                this.component = component;
54
        }
55
                
56
        public PxRaster(IProjection proj, String fname, ImageObserver component) {
57
                geoFile = GeoRasterFile.openFile(proj, fname);//loadECW(fname);
58
                geoFile.setUpdatable((Component) component);
59
                this.proj = proj;
60
                this.component = component;
61
                setExtent(geoFile.getExtent());
62
                geoFile.setView(geoFile.getExtent());
63
                extentOrig = extent;
64
                if (geoFile.getBandCount()>2) {
65
                        setBand(GeoRasterFile.RED_BAND, 0);
66
                        setBand(GeoRasterFile.GREEN_BAND, 1);
67
                        setBand(GeoRasterFile.BLUE_BAND, 2);
68
                } else {
69
                        setBand(GeoRasterFile.RED_BAND|GeoRasterFile.GREEN_BAND|GeoRasterFile.BLUE_BAND, 0);
70
                }
71
        }
72
        
73
        /*public PxRaster(String fname, ImageObserver component, Extent view) {
74
                geoFile = GeoRasterFile.openFile(null, fname);//loadECW(fname);
75
                this.component = component;
76
                setExtent(geoFile.getExtent());
77
                geoFile.setView(view);
78
                extentOrig = extent;
79
                
80
                //double x = 680800,y = 4128600;
81
                //setView(new Extent(x, y, x+4200, y-4200),"Huelva capital");
82
        }*/
83
        
84
        public PxRaster(IProjection proj, String [] fnames, ImageObserver component) {
85
                this.proj = proj;
86
                this.component = component;
87
                colorBand = new GeoRasterFile[fnames.length];
88
                for (int i=0; i<colorBand.length; i++) {
89
                    colorBand[i] = GeoRasterFile.openFile(proj, fnames[i]);//loadECW(fname);
90
                    colorBand[i].setUpdatable((Component) component);
91
                    setExtent(colorBand[i].getExtent());
92
                    colorBand[i].setView(colorBand[i].getExtent());
93
                }
94
                geoFile = colorBand[0];
95
                extentOrig = extent;
96
                if (fnames.length >= 3 || geoFile.getBandCount()>2) {
97
                        setBand(GeoRasterFile.RED_BAND, 0);
98
                        setBand(GeoRasterFile.GREEN_BAND, 1);
99
                        setBand(GeoRasterFile.BLUE_BAND, 2);
100
                } else {
101
                        setBand(GeoRasterFile.RED_BAND|GeoRasterFile.GREEN_BAND|GeoRasterFile.BLUE_BAND, 0);
102
                }
103
        }
104
        
105
        public PxRaster(GeoRasterFile eFile, ImageObserver component, Extent view) {
106
                geoFile = eFile;//loadECW(fname);
107
                geoFile.setUpdatable((Component) component);
108
                setProjection(geoFile.getProjection());
109
                this.component = component;
110

    
111
                setExtent(geoFile.getExtent());
112
                geoFile.setView(view); //geoFile.getExtent());
113
                extentOrig = extent;
114
                if (geoFile.getBandCount()>2) {
115
                        setBand(GeoRasterFile.RED_BAND, 0);
116
                        setBand(GeoRasterFile.GREEN_BAND, 1);
117
                        setBand(GeoRasterFile.BLUE_BAND, 2);
118
                } else {
119
                        setBand(GeoRasterFile.RED_BAND|GeoRasterFile.GREEN_BAND|GeoRasterFile.BLUE_BAND, 0);
120
                }
121
        }
122
        
123
        public int getBandCount() { return geoFile.getBandCount(); }
124
        
125
        public GeoRasterFile [] getFiles() {
126
                if (colorBand != null)
127
                        return colorBand;
128
                
129
                GeoRasterFile [] ret = {geoFile};
130
                return ret;
131
        }
132
        
133
        /**
134
         * Asocia un colorBand al rojo, verde o azul.
135
         * @param flag cual (o cuales) de las bandas.
136
         * @param nBand        que colorBand
137
         */
138
        
139
        public void setBand(int flag, int nBand) {
140
                if (colorBand != null) {
141
                        if ((flag & GeoRasterFile.RED_BAND) == GeoRasterFile.RED_BAND)
142
                                rBand = nBand;
143
                        else if ((flag & GeoRasterFile.GREEN_BAND) == GeoRasterFile.GREEN_BAND)
144
                                gBand = nBand;
145
                        else if ((flag & GeoRasterFile.BLUE_BAND) == GeoRasterFile.BLUE_BAND)
146
                                bBand = nBand;
147
                } else
148
                        geoFile.setBand(flag, nBand);
149
        }
150

    
151
        /**
152
         * Devuelve el colorBand activo en la banda especificada.
153
         * @param flag banda.
154
         */
155
        
156
        public int getBand(int flag) {
157
                if (colorBand != null) {
158
                        if (flag == GeoRasterFile.RED_BAND)
159
                                return rBand;
160
                        else if (flag == GeoRasterFile.GREEN_BAND)
161
                                return gBand;
162
                        else if (flag == GeoRasterFile.BLUE_BAND)
163
                                return bBand;
164
                        else
165
                                return -1;
166
                } else
167
                        return geoFile.getBand(flag);
168
        }
169

    
170
        public void setDrawBorder(boolean pm) { pintaMarco = pm; }
171
        
172
        public String getFName() {
173
                return geoFile.getName();
174
        }
175
        
176
        /**
177
         * Devuelve la anchura total del fichero, en pixeles.
178
         * @return ancho en pixeles
179
         */
180
        public int getFWidth() {
181
                return geoFile.getWidth();
182
        }
183
        
184
        /**
185
         * Devuelve la altura total del fichero, en pixeles.
186
         * @return alto en pixeles
187
         */
188
        public int getFHeight() {
189
                return geoFile.getHeight();
190
        }
191
        
192
        public void setTransparency(boolean t) {geoFile.setTransparency(t);}
193
        public void setTransparency(int t) {geoFile.setTransparency(t);}
194
        
195
        public int getAlpha() { return geoFile.getAlpha(); }
196
        
197
        public void setExtent(Extent e) {
198
                super.extent = e;
199
                pts = new Vector();
200
                pts.add(proj.createPoint(e.minX(), e.minY()));
201
                pts.add(proj.createPoint(e.maxX(), e.minY()));
202
                pts.add(proj.createPoint(e.maxX(), e.maxY()));
203
                pts.add(proj.createPoint(e.minX(), e.maxY()));
204
        }
205
        
206
        /**
207
         * Cambia la vista (viewport) sobre el raster.
208
         * 
209
         * @param v
210
         * @param vName
211
         */
212
        public void setView(Extent v, String vName) {
213
                geoFile.setView(v);
214
                this.vName = vName;
215
        }
216
        
217
        /**
218
         * Obtiene la escala.
219
         * 
220
         * @param width
221
         * @param height
222
         * @return
223
         */
224
        
225
        public double[] getScale(int width, int height) {
226
                double scale[] = new double[2];
227
                scale[0] = ((double) width) /geoFile.getView().width();                
228
                scale[1] = ((double) height)/geoFile.getView().height();                
229
                return scale;
230
        }
231
        
232
        /**
233
         * 'Normaliza' la vista en funci?n del extent del raster.
234
         * 
235
         * @param mat
236
         * @param sz
237
         */
238

    
239
        protected void calculateNewView(Extent sz) {
240
                double vx = sz.minX(), vy = sz.minY(), vx2 = sz.maxX(), vy2 = sz.maxY();
241
                if (sz.minX() < extent.minX()) vx = extent.minX();
242
                if (sz.minY() < extent.minY()) vy = extent.minY();
243
                if (sz.maxX() > extent.maxX()) vx2 = extent.maxX();
244
                if (sz.maxY() > extent.maxY()) vy2 = extent.maxY();
245
                if (colorBand != null) { // multiBands
246
                        for (int i=0; i<colorBand.length; i++)
247
                                colorBand[i].setView(new Extent(vx, vy, vx2, vy2));
248
                } else if (geoFile != null) { // Una sola banda
249
                        geoFile.setView(new Extent(vx, vy, vx2, vy2));
250
                } else { // no cargada
251
                        System.err.println("PxRaster.calculateNewView(): Foto no cargada.");
252
                }
253
        }
254

    
255
        /**
256
         * Dibuja el raster
257
         */        
258

    
259
        public void draw(Graphics2D g, ViewPortData vp) {
260
                Image geoImage = null;
261
                long t2, t1 = new Date().getTime();
262
                System.out.println("PxRaster.draw(): vp.extent = "+ vp.getExtent());
263
                System.out.println("PxRaster.draw():    extent = "+ getExtent());
264
                if (vp.getExtent().minX()> extent.maxX()) return;
265
                if (vp.getExtent().minY()> extent.maxY()) return;
266
                if (vp.getExtent().maxX()< extent.minX()) return;
267
                if (vp.getExtent().maxY()< extent.minY()) return;
268
                calculateNewView(vp.getExtent()); 
269
                Extent v = geoFile.getView();
270
                double x = v.minX();
271
                double y = v.minY();
272
                double w = v.width();
273
                double h = v.height();
274
                System.out.println("Pinto PxRaster:" + v);
275
                
276
                double scalex = vp.mat.getScaleX()        /* g.getTransform().getScaleX()*/ ,
277
                        scaley = vp.mat.getScaleY()                /* g.getTransform().getScaleY() */;
278
                int wImg = (int) Math.abs(w*scalex)+1, hImg = (int) Math.abs(h*scaley)+1;
279
                System.out.println("Sz=("+wImg+","+hImg+"); scale=("+scalex+","+scaley+")");
280
                if (wImg <= 0 || hImg <= 0) return;
281
                
282
                Point2D.Double pt = new Point2D.Double(x, y+h);
283
                try {
284
                        System.out.println("Dibujando PxRaster: pt0 = "+pt);
285
                        vp.mat.transform(pt, pt);
286
                        System.out.println("Dibujando PxRaster: pt1 = "+pt);
287
                        if (colorBand == null && geoFile instanceof GdalFile &&
288
                                (geoFile.getDataType() != DataBuffer.TYPE_BYTE)) {
289
                                System.out.println("PxRaster: Has dado con un Raster de 16 bits");
290
                                System.out.println("Dibujando PxRaster sz=("+wImg+","+hImg+"...");
291
                                RasterBuf raster = ((GdalFile) geoFile).getRaster(wImg, hImg, rp);
292
                                t2 = new Date().getTime();
293
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs. Obteniendo"); t1 = t2;
294
                                geoImage = renderizeRaster(raster);
295
                                t2 = new Date().getTime();
296
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs. Filtrando/Renderizando");t1 = t2;
297

    
298
                                g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), component);
299
                                t2 = new Date().getTime();
300
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs. Dibujando");
301
                        } else if (colorBand != null) { // multiBands
302
                                System.out.println("Dibujando PxRaster (Multifile) ...");
303
                            //if (doTransparency)
304
                            //geoImage = new BufferedImage(wImg, hImg, BufferedImage.TYPE_INT_ARGB);
305
                            //else
306
                            //        geoImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
307
                        geoImage = colorBand[rBand].updateImage(wImg, hImg, rp); //, geoImage, GeoRasterFile.RED_BAND);
308
                        geoImage = colorBand[gBand].updateImage(wImg, hImg, rp, geoImage, GeoRasterFile.GREEN_BAND);
309
                        geoImage = colorBand[bBand].updateImage(wImg, hImg, rp, geoImage, GeoRasterFile.BLUE_BAND);
310

    
311
                                geoImage = renderizeRaster(geoImage);
312
                        g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), component);
313
                                t2 = new Date().getTime();
314
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs.");
315
                        
316
                        } else if (geoFile != null) { // Una sola banda
317
                        geoImage = geoFile.updateImage(wImg, hImg, rp);
318
                                System.out.println("Dibujando PxRaster sz=("+wImg+","+hImg+"...");
319

    
320
                                geoImage = renderizeRaster(geoImage);
321
                                g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), component);
322
                                t2 = new Date().getTime();
323
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs.");
324
                        } else { // no cargada
325
                                System.err.println("Dibujando PxRaster: Foto no cargada.");
326
                        }
327
                } catch (Exception e) {
328
                        e.printStackTrace();
329
                };
330

    
331
                if (pintaMarco) {
332
                        drawMarco(g, vp);
333
                }
334
        }
335
        
336
        
337
        
338
        /* */        
339
        
340
        public Image renderizeRaster(RasterBuf raster) {
341
                if (true) {
342
                        ComputeMinMaxFilter filter = 
343
                                new ComputeMinMaxFilter(raster, stats);
344
                        filter = null;
345
                }
346

    
347
                if (true) {
348
                        LinearEnhancementFilter lEFilter = 
349
                                new LinearEnhancementFilter(raster, stats);
350
                        lEFilter = null;
351
                }
352

    
353
                Image image = new RasterToImageFilter(raster, getAlpha()).getImage();
354
                raster = null;
355
                if (true)
356
                        stats.pinta();
357
                return image;
358
        }
359
        
360
        public Image renderizeRaster(Image image) {
361
                if (true) {
362
                        ComputeMinMaxFilter filter = 
363
                                new ComputeMinMaxImageFilter(image, stats);
364
                        filter = null;
365
                }
366

    
367
                if (true) {
368
                        LinearEnhancementFilter lEFilter = 
369
                                new LinearEnhancementImageFilter(image, stats);
370
                        lEFilter = null;
371
                }
372
                if (true)
373
                        stats.pinta();
374
                return image;
375
        }
376
        /* */
377
        public void drawMarco(Graphics2D g, ViewPortData vp) {
378
//                Color color = new Color(255,222,165,128), fillColor = new Color(255,214,132,128);
379
                Color color = new Color(128,128,128), fillColor = new Color(255,220,220,0x20);
380
                GeneralPath gp = newGP(vp);
381
                g.setColor(fillColor);
382
                g.fill(gp);
383
                g.setColor(color);
384
                g.draw(gp);
385
        }
386
        
387
        private GeneralPath newGP(ViewPortData vp) {
388
                //if (gp != null) return;
389
                GeneralPath gp = new GeneralPath();
390
                Point2D.Double pt0 = new Point2D.Double(0.0, 0.0);
391
                Point2D.Double pt1 = new Point2D.Double(0.0, 0.0);
392
                Point2D.Double pt2 = new Point2D.Double(0.0, 0.0);
393
                Point2D.Double pt3 = new Point2D.Double(0.0, 0.0);
394
                vp.mat.transform((Point2D) pts.get(0), pt0);
395
                vp.mat.transform((Point2D) pts.get(1), pt1);
396
                vp.mat.transform((Point2D) pts.get(2), pt2);
397
                vp.mat.transform((Point2D) pts.get(3), pt3);
398
                // Aspa desde el extent
399
                gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
400
                gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
401
                gp.moveTo( (float) pt1.getX(), (float) pt1.getY() );
402
                gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
403
                // Extent
404
                gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
405
                gp.lineTo( (float) pt1.getX(), (float) pt1.getY() );
406
                gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
407
                gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
408
                if (extentOrig != extent) {
409
                        gp.lineTo( (float) pt0.getX(), (float) pt0.getY() );
410
                        Vector pts = new Vector();
411
                        pts.add(proj.createPoint(extentOrig.minX(), extentOrig.minY()));
412
                        pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.minY()));
413
                        pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.maxY()));
414
                        pts.add(proj.createPoint(extentOrig.minX(), extentOrig.maxY()));
415

    
416
                        vp.mat.transform((Point2D) pts.get(0), pt0);
417
                        vp.mat.transform((Point2D) pts.get(1), pt1);
418
                        vp.mat.transform((Point2D) pts.get(2), pt2);
419
                        vp.mat.transform((Point2D) pts.get(3), pt3);
420
                        gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
421
                        gp.lineTo( (float) pt1.getX(), (float) pt1.getY() );
422
                        gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
423
                        gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
424
                }
425
                gp.closePath();
426
                return gp;
427
        }
428

    
429
        public IProjection getProjection() { return proj; }
430
        public void setProjection(IProjection p) { proj = p; }
431

    
432
        public void reProject(ICoordTrans rp) {
433
                this.rp = rp.getInverted();
434
                System.out.println("PxRaster: reProject()");
435
                //geoFile.reProject(rp);
436
                Vector savePts = pts;
437

    
438
                pts = new Vector();
439
                extent = new Extent();
440
                Point2D ptDest = null;
441
                for (int i=0; i<savePts.size(); i++) {
442
                        ptDest = rp.getPDest().createPoint(0.0,0.0);
443
                        ptDest = rp.convert((Point2D) savePts.get(i), ptDest);
444
                        pts.add(ptDest);
445
                        extent.add(ptDest);
446
                }
447
                setProjection(rp.getPDest());
448
        }
449
}