Statistics
| Revision:

root / trunk / libraries / libCq CMS for java.old / src / org / cresques / px / PxRaster.java @ 201

History | View | Annotate | Download (7.99 KB)

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

    
6
import java.awt.geom.GeneralPath;
7
import java.awt.geom.Point2D;
8

    
9
import java.awt.Color;
10
import java.awt.Component;
11
import java.awt.Graphics2D;
12
import java.awt.Image;
13

    
14
import java.awt.image.ImageObserver;
15
import java.util.Date;
16
import java.util.Vector;
17

    
18
import org.cresques.cts.ICoordTrans;
19
import org.cresques.cts.IProjection;
20
import org.cresques.geo.Projected;
21
import org.cresques.geo.ViewPortData;
22
//import org.cresques.io.EcwFile;
23
import org.cresques.io.GeoRasterFile;
24

    
25
public class PxRaster extends PxObj implements Projected {
26
        protected GeoRasterFile geoFile = null;
27
        protected ImageObserver component = null;
28
        Vector pts = null;
29
        
30
        int transparente = 0x10ffff80;
31

    
32
        String vName = null;
33
        protected boolean pintaMarco = false; //true;
34
        IProjection proj = null;
35
        protected Extent extentOrig = null;
36
        ICoordTrans rp = null;
37
        
38
        /**
39
         * Constructor.
40
         * @param component
41
         */
42
        public PxRaster(ImageObserver component) {
43
                this.component = component;
44
        }
45
                
46
        public PxRaster(IProjection proj, String fname, ImageObserver component) {
47
                geoFile = GeoRasterFile.openFile(proj, fname);//loadECW(fname);
48
                geoFile.setUpdatable((Component) component);
49
                this.proj = proj;
50
                this.component = component;
51
                setExtent(geoFile.getExtent());
52
                geoFile.setView(geoFile.getExtent());
53
                extentOrig = extent;
54
        }
55
        
56
        /*public PxRaster(String fname, ImageObserver component, Extent view) {
57
                geoFile = GeoRasterFile.openFile(null, fname);//loadECW(fname);
58
                this.component = component;
59
                setExtent(geoFile.getExtent());
60
                geoFile.setView(view);
61
                extentOrig = extent;
62
                
63
                //double x = 680800,y = 4128600;
64
                //setView(new Extent(x, y, x+4200, y-4200),"Huelva capital");
65
        }*/
66
        
67
        public PxRaster(GeoRasterFile eFile, ImageObserver component, Extent view) {
68
                geoFile = eFile;//loadECW(fname);
69
                this.component = component;
70
                extent = eFile.getExtent();
71
                eFile.setView(view);
72
                extentOrig = extent;
73
        }
74

    
75
        public String getFName() {
76
                return geoFile.getName();
77
        }
78
        
79
        /**
80
         * Devuelve la anchura total del fichero, en pixeles.
81
         * @return ancho en pixeles
82
         */
83
        public int getFWidth() {
84
                return geoFile.getWidth();
85
        }
86
        
87
        /**
88
         * Devuelve la altura total del fichero, en pixeles.
89
         * @return alto en pixeles
90
         */
91
        public int getFHeight() {
92
                return geoFile.getHeight();
93
        }
94
        
95
        public void setTransparency(boolean t) {geoFile.setTransparency(t);}
96
        public void setTransparency(int t) {geoFile.setTransparency(t);}
97
        
98
        public void setExtent(Extent e) {
99
                super.extent = e;
100
                pts = new Vector();
101
                pts.add(proj.createPoint(e.minX(), e.minY()));
102
                pts.add(proj.createPoint(e.maxX(), e.minY()));
103
                pts.add(proj.createPoint(e.maxX(), e.maxY()));
104
                pts.add(proj.createPoint(e.minX(), e.maxY()));
105
        }
106
        
107
        /**
108
         * Cambia la vista (viewport) sobre el raster.
109
         * 
110
         * @param v
111
         * @param vName
112
         */
113
        public void setView(Extent v, String vName) {
114
                geoFile.setView(v);
115
                this.vName = vName;
116
        }
117
        
118
        /**
119
         * Obtiene la escala.
120
         * 
121
         * @param width
122
         * @param height
123
         * @return
124
         */
125
        
126
        public double[] getScale(int width, int height) {
127
                double scale[] = new double[2];
128
                scale[0] = ((float) width) /geoFile.getView().width();                
129
                scale[1] = ((float) height)/geoFile.getView().height();                
130
                return scale;
131
        }
132
        
133
        /**
134
         * 'Normaliza' la vista en funci?n del extent del raster.
135
         * 
136
         * @param mat
137
         * @param sz
138
         */
139

    
140
        void calculateNewView(Extent sz) {
141
                double vx = sz.minX(), vy = sz.minY(), vx2 = sz.maxX(), vy2 = sz.maxY();
142
                if (sz.minX() < extent.minX()) vx = extent.minX();
143
                if (sz.minY() < extent.minY()) vy = extent.minY();
144
                if (sz.maxX() > extent.maxX()) vx2 = extent.maxX();
145
                if (sz.maxY() > extent.maxY()) vy2 = extent.maxY();
146
                geoFile.setView(new Extent(vx, vy, vx2, vy2));
147
        }
148

    
149
        /**
150
         * Dibuja el raster
151
         */        
152

    
153
        public void draw(Graphics2D g, ViewPortData vp) {
154
                long t2, t1 = new Date().getTime();
155
                System.out.println("PxRaster.draw(): vp.extent = "+ vp.getExtent());
156
                System.out.println("PxRaster.draw():    extent = "+ getExtent());
157
                if (vp.getExtent().minX()> extent.maxX()) return;
158
                if (vp.getExtent().minY()> extent.maxY()) return;
159
                if (vp.getExtent().maxX()< extent.minX()) return;
160
                if (vp.getExtent().maxY()< extent.minY()) return;
161
                calculateNewView(vp.getExtent()); 
162
                Extent v = geoFile.getView();
163
                double x = v.minX();
164
                double y = v.minY();
165
                double w = v.width();
166
                double h = v.height();
167
                System.out.println("Pinto PxRaster:" + v);
168
                
169
                double scalex = vp.mat.getScaleX()        /* g.getTransform().getScaleX()*/ ,
170
                        scaley = vp.mat.getScaleY()                /* g.getTransform().getScaleY() */;
171
                int wImg = (int) Math.abs(w*scalex), hImg = (int) Math.abs(h*scaley);
172
                System.out.println("Sz=("+wImg+","+hImg+"); scale=("+scalex+","+scaley+")");
173
                if (wImg <= 0 || hImg <= 0) return;
174
                Image geoImage = geoFile.updateImage(wImg, hImg, rp);
175
                
176
                Point2D.Double pt = new Point2D.Double(x, y+h);
177
                try {
178
                        System.out.println("Dibujando PxRaster: pt0 = "+pt);
179
                        vp.mat.transform(pt, pt);
180
                        System.out.println("Dibujando PxRaster: pt1 = "+pt);
181
                        if (geoImage != null) {
182
                                System.out.println("Dibujando PxRaster ...");
183

    
184
                                g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), component);
185
                                t2 = new Date().getTime();
186
                                System.out.println("Dibujando PxRaster: "+(t2-t1)/1000D+", secs.");
187
                        } else {
188
                                System.err.println("Dibujando PxRaster: Foto no cargada.");
189
                        }
190
                } catch (Exception e) {
191
                        e.printStackTrace();
192
                };
193

    
194
                if (pintaMarco) {
195
                        drawMarco(g, vp);
196
                }
197
        }
198
        public void drawMarco(Graphics2D g, ViewPortData vp) {
199
//                Color color = new Color(255,222,165,128), fillColor = new Color(255,214,132,128);
200
                Color color = new Color(128,128,128), fillColor = new Color(255,220,220,0x20);
201
                GeneralPath gp = newGP(vp);
202
                g.setColor(fillColor);
203
                g.fill(gp);
204
                g.setColor(color);
205
                g.draw(gp);
206
        }
207
        
208
        private GeneralPath newGP(ViewPortData vp) {
209
                //if (gp != null) return;
210
                GeneralPath gp = new GeneralPath();
211
                Point2D.Double pt0 = new Point2D.Double(0.0, 0.0);
212
                Point2D.Double pt1 = new Point2D.Double(0.0, 0.0);
213
                Point2D.Double pt2 = new Point2D.Double(0.0, 0.0);
214
                Point2D.Double pt3 = new Point2D.Double(0.0, 0.0);
215
                vp.mat.transform((Point2D) pts.get(0), pt0);
216
                vp.mat.transform((Point2D) pts.get(1), pt1);
217
                vp.mat.transform((Point2D) pts.get(2), pt2);
218
                vp.mat.transform((Point2D) pts.get(3), pt3);
219
                // Aspa desde el extent
220
                gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
221
                gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
222
                gp.moveTo( (float) pt1.getX(), (float) pt1.getY() );
223
                gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
224
                // Extent
225
                gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
226
                gp.lineTo( (float) pt1.getX(), (float) pt1.getY() );
227
                gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
228
                gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
229
                if (extentOrig != extent) {
230
                        gp.lineTo( (float) pt0.getX(), (float) pt0.getY() );
231
                        Vector pts = new Vector();
232
                        pts.add(proj.createPoint(extentOrig.minX(), extentOrig.minY()));
233
                        pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.minY()));
234
                        pts.add(proj.createPoint(extentOrig.maxX(), extentOrig.maxY()));
235
                        pts.add(proj.createPoint(extentOrig.minX(), extentOrig.maxY()));
236

    
237
                        vp.mat.transform((Point2D) pts.get(0), pt0);
238
                        vp.mat.transform((Point2D) pts.get(1), pt1);
239
                        vp.mat.transform((Point2D) pts.get(2), pt2);
240
                        vp.mat.transform((Point2D) pts.get(3), pt3);
241
                        gp.moveTo( (float) pt0.getX(), (float) pt0.getY() );
242
                        gp.lineTo( (float) pt1.getX(), (float) pt1.getY() );
243
                        gp.lineTo( (float) pt2.getX(), (float) pt2.getY() );
244
                        gp.lineTo( (float) pt3.getX(), (float) pt3.getY() );
245
                }
246
                gp.closePath();
247
                return gp;
248
        }
249

    
250
        public IProjection getProjection() { return proj; }
251
        public void setProjection(IProjection p) { proj = p; }
252

    
253
        public void reProject(ICoordTrans rp) {
254
                this.rp = rp.getInverted();
255
                System.out.println("PxRaster: reProject()");
256
                //geoFile.reProject(rp);
257
                Vector savePts = pts;
258

    
259
                pts = new Vector();
260
                extent = new Extent();
261
                Point2D ptDest = null;
262
                for (int i=0; i<savePts.size(); i++) {
263
                        ptDest = rp.getPDest().createPoint(0.0,0.0);
264
                        ptDest = rp.convert((Point2D) savePts.get(i), ptDest);
265
                        pts.add(ptDest);
266
                        extent.add(ptDest);
267
                }
268
                setProjection(rp.getPDest());
269
        }
270
}