Statistics
| Revision:

root / trunk / libraries / libCq CMS for java.old / src / org / cresques / io / MdtFile.java @ 9

History | View | Annotate | Download (11.4 KB)

1 2 luisw
/*
2
 * Created on 04-may-2004
3
 */
4
package org.cresques.io;
5
6
import java.io.BufferedReader;
7 5 luisw
import java.io.File;
8 2 luisw
import java.io.FileReader;
9
import java.io.IOException;
10
import java.io.InputStreamReader;
11
import java.io.Reader;
12 5 luisw
import java.util.Date;
13
import java.util.Vector;
14
import java.util.zip.ZipEntry;
15 2 luisw
16
import java.awt.Color;
17
import java.awt.Image;
18
import java.awt.Point;
19
import java.awt.geom.Point2D;
20
import java.awt.image.BufferedImage;
21
22 5 luisw
import org.cresques.geo.GeoPoint;
23
import org.cresques.geo.Geodetic;
24
import org.cresques.geo.ProjPoint;
25 2 luisw
import org.cresques.geo.Projection;
26
import org.cresques.geo.ReProjection;
27
import org.cresques.px.Extent;
28
29 9 luisw
class CoordList extends Vector {
30
31
}
32
33 2 luisw
/**
34
 * Soporte para modelos digitales de terreno.
35
 *
36
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>
37
 */
38
39
public class MdtFile extends GeoRasterFile {
40
        private String name;
41
        BufferedReader fi;
42
        String buf = null, token = null;
43
44
        double lastLat, lastLong;
45
        double distX, distY;
46
//        double minZ = -3500.0, maxZ = 3500.0;
47
        double minZ = 100000.0, maxZ = -100000.0;
48
        int width = 0, height = 0;
49
        long numPt = 0;
50
51
        MdtPalette paleta = null;
52
        BufferedImage im = null;
53
        Extent v = null;
54 5 luisw
55
        Projection projGeo = null;
56 9 luisw
        private Date reloj = new Date();
57 5 luisw
58 2 luisw
        /**
59
         * Constructor de la clase MdtFile
60
         *
61
         */
62
63
        public MdtFile(Projection proj, String name) {
64
                super(proj);
65
                this.name = name;
66 5 luisw
                if (!(proj instanceof Geodetic))
67
                        projGeo = Geodetic.getProjection(proj.getEllipsoid());
68 2 luisw
        }
69
70
        /**
71
         * Carga un .gml
72
         * @param name nombre del fichero
73
         */
74
75
        public GeoFile load() {
76 5 luisw
                System.out.println("MDT: Intento de carga de '" + name + "'.");
77
                long t1, t2;
78 2 luisw
                try {
79
                        if (FileFolder.isUrl(name)) {
80
                                ZipFileFolder zFolder = new ZipFileFolder(name);
81 5 luisw
                                ZipEntry ze = zFolder.getZipEntry(name);
82
                                fileSize = ze.getSize();
83
84 2 luisw
                                // El primero calcula el tama?o, el segundo la imagen
85 9 luisw
                                t1 = getTime();
86
                                load2(new InputStreamReader(zFolder.getInputStream(ze)));
87
                                t2 = getTime();
88 5 luisw
                                System.out.println("MDT: primer load: " + (t2-t1)/1000 + " seg.");
89 9 luisw
                                t1 = getTime();
90
                                load2(new InputStreamReader(zFolder.getInputStream(ze)));
91
                                t2 = getTime();
92 5 luisw
                                System.out.println("MDT: segundo load: " + (t2-t1)/1000 + " seg.");
93 2 luisw
                        } else {
94 5 luisw
                                File f = new File(name);
95
                                fileSize = f.length();
96
97
                                // El primero calcula el tama?o, el segundo la imagen
98 9 luisw
                                t1 = getTime();
99
                                load2(new FileReader(name));
100
                                t2 = getTime();
101 5 luisw
                                System.out.println("MDT: primer load: " + (t2-t1)/1000 + " seg.");
102 9 luisw
                                t1 = getTime();
103
                                load2(new FileReader(name));
104
                                t2 = getTime();
105 5 luisw
                                System.out.println("MDT: segundo load: " + (t2-t1)/1000 + " seg.");
106 2 luisw
                        }
107
                        v = new Extent(extent);
108
                        return this;
109 5 luisw
                } catch (Exception e) {
110 9 luisw
                        System.err.println("MDT: ERROR: "+lineCnt+" lineas leidas ("+bytesReaded+"/"+fileSize+") bytes.");
111 5 luisw
                        if (e instanceof java.lang.ArrayIndexOutOfBoundsException)
112
                                System.err.println("     row = "+rowAct+", col ="+colAct);
113 2 luisw
                        e.printStackTrace();
114
                }
115
                return this;
116
        }
117 5 luisw
118
//
119 9 luisw
///
120
//// Carga antigua. TODO Mejorarla
121
///
122 5 luisw
//
123 2 luisw
124 9 luisw
        public GeoFile load(Reader fr) throws IOException {
125
                lineCnt = 0;
126
                if (im == null){
127
                        System.out.println("MDT: Cargando "+name+" ...");
128
                } else
129
                        System.out.println("MDT: generando imagen ...");
130
                fi = new BufferedReader(fr);
131
                while ((buf = fi.readLine()) != null) {
132 5 luisw
                          bytesReaded += buf.length()+1;
133
                          parseLine(buf);
134
                          lineCnt++;
135 9 luisw
                }
136
                fi.close();
137
                if (im == null) {
138 5 luisw
                          width = (int) numPt/height;
139
                          System.out.println("MDT: '"+name+"' cargado. ("+lineCnt+" l?neas).");
140
                          System.out.println("MDT: Puntos="+numPt+
141
                                  ",  size="+width+","+height+").");
142
                          System.out.println("MDT: extent="+extent);
143
                          createImage();
144
                          System.out.println("MDT: dist = ("+distX+
145
                                  ","+distY+").");
146
                          System.out.println("MDT: elevaciones : "+minZ+
147
                                  " < z < "+maxZ+".");
148
                          String pName = "E:/data/GLOBE_DEM/data/elev/esri/clr/"+"c10g.clr";//+"lw.clr";
149
                          //paleta = (new MdtPalette()).loadClr(pName, true);
150
                          //paleta = MdtPalette.atlas;
151
                          if (paleta == null)
152
                                  paleta = (new MdtPalette()).createGrayScale((int)minZ, (int) maxZ);
153
                          }
154 9 luisw
                return this;
155
        }
156 5 luisw
157 9 luisw
        public void parseLine(String buf) {
158 5 luisw
                  //  359.5166  40.0039    787.00
159
                  Point2D pt = null;
160
                  GeoPoint gPt = null;
161
                  buf = filterWS(buf);
162
                  if (buf.length() > 4) {
163
                          String [] datos = buf.split(" ");
164
                          if (datos.length<3) return;
165
                          double lng = Double.parseDouble(datos[0]);
166
                          if (lng > 180.0 && lng < 360.0) lng = -(360.0-lng);
167
                          double lat = Double.parseDouble(datos[1]);
168
                          double z = Double.parseDouble(datos[2])+.99;
169
                          if (im == null) {
170
                                  if (token == null) token = datos[1];
171
                                  if (token.compareTo(datos[1]) == 0) height++;
172
                                  lastLat = lat; lastLong = lng;
173
                                  numPt ++;
174
                                  if (projGeo == null) {
175
                                          pt = proj.createPoint(lng, lat);
176
                                  } else {
177
                                          gPt = (GeoPoint) projGeo.createPoint(lng, lat);
178
                                          pt = (ProjPoint) proj.createPoint(0.0, 0.0);
179
                                          pt = proj.fromGeo(gPt, (ProjPoint) proj.createPoint(0.0, 0.0));
180
                                  }
181
                                  extent.add(pt);
182
                                  minZ = Math.min(minZ, z);
183
                                  maxZ = Math.max(maxZ, z);
184
                                  //System.out.println(buf+" "+pt);
185
                          } else {
186
                                  if (projGeo != null) {
187
                                          gPt = (GeoPoint) projGeo.createPoint(lng, lat);
188
                                          pt = (ProjPoint) proj.createPoint(0.0, 0.0);
189
                                          pt = proj.fromGeo(gPt, (ProjPoint) proj.createPoint(0.0, 0.0));
190
                                          lng = pt.getX(); lat = pt.getY();
191
                                  }
192
                                  set(lng, lat, z);
193
                          }
194
                  }
195 9 luisw
        }
196 5 luisw
197 9 luisw
        public void createImage() {
198 5 luisw
                  distX = (extent.width()/(height-1)); distY = (extent.height()/(width-1));
199
                  System.out.println("MDT: extent.size=("+extent.width()+","+extent.height()+")");
200
                  im = new BufferedImage(height, width, BufferedImage.TYPE_3BYTE_BGR);
201 9 luisw
        }
202 5 luisw
203
//
204
///
205
////  Carga Nueva TODO Acabar de dejar fina
206
///
207
//
208
209
        public GeoFile load2(Reader fr) throws IOException {
210
                lineCnt = 0;
211
                if (im == null){
212 2 luisw
                        System.out.println("MDT: Cargando "+name+" ...");
213 5 luisw
                        xCoord = new Vector();
214
                        yCoord = new Vector();
215
                        rows = new Vector();
216
                        firstRow = new Vector();
217
                        row = null;
218
                        numCols = 0;
219
                        colAct = 0;
220
                } else
221
                        return this;
222
                        //System.out.println("MDT: generando imagen ...");
223 2 luisw
                fi = new BufferedReader(fr);
224
                while ((buf = fi.readLine()) != null) {
225 5 luisw
                        bytesReaded += buf.length()+1;
226
                        parseLine2(buf);
227
                        lineCnt++;
228 2 luisw
                }
229
                fi.close();
230
                if (im == null) {
231
                        width = (int) numPt/height;
232 5 luisw
                        System.out.println("MDT: '"+name+"' cargado. ("+lineCnt+" l?neas).");
233 2 luisw
                        System.out.println("MDT: Puntos="+numPt+
234
                                ",  size="+width+","+height+").");
235
                        System.out.println("MDT: extent="+extent);
236 5 luisw
                        createImage2();
237 2 luisw
                        System.out.println("MDT: dist = ("+distX+
238
                                ","+distY+").");
239
                        System.out.println("MDT: elevaciones : "+minZ+
240
                                " < z < "+maxZ+".");
241
                        String pName = "E:/data/GLOBE_DEM/data/elev/esri/clr/"+"c10g.clr";//+"lw.clr";
242
                        //paleta = (new MdtPalette()).loadClr(pName, true);
243
                        //paleta = MdtPalette.atlas;
244
                        if (paleta == null)
245
                                paleta = (new MdtPalette()).createGrayScale((int)minZ, (int) maxZ);
246
                        }
247
                return this;
248
        }
249
250 5 luisw
        Vector xCoord = new Vector();
251
        Vector yCoord = new Vector();
252
        Vector rows = new Vector();
253
        Vector firstRow = new Vector();
254
        float [] row = null;
255
        int numCols = 0;
256
        int rowAct = 0, colAct = 0;
257
258
        public void parseLine2(String buf) {
259 2 luisw
                //  359.5166  40.0039    787.00
260 9 luisw
                Point2D pt = null;
261
                GeoPoint gPt = null;
262 2 luisw
                buf = filterWS(buf);
263
                if (buf.length() > 4) {
264
                        String [] datos = buf.split(" ");
265
                        if (datos.length<3) return;
266 5 luisw
                        //System.out.println("1: "+lineCnt+","+numCols);
267 2 luisw
                        double lng = Double.parseDouble(datos[0]);
268
                        if (lng > 180.0 && lng < 360.0) lng = -(360.0-lng);
269
                        double lat = Double.parseDouble(datos[1]);
270 5 luisw
                        float z = Float.parseFloat(datos[2]);
271 2 luisw
                        if (im == null) {
272 5 luisw
                                if (token == null) {
273
                                        token = datos[1];
274
                                        yCoord.add(new Double(lat));
275
                                } else if (token.compareTo(datos[1]) != 0) {
276
                                        token = datos[1];
277
                                        if (height == 0) {
278
                                                System.out.println("MDT: Width: "+numCols);
279
                                                row = new float[numCols];
280
                                                for (int i=0; i<numCols; i++)
281
                                                        row[i] = ((Float) firstRow.get(i)).floatValue();
282
                                                firstRow = null;
283
                                        }
284
                                        height++; rowAct++;
285
                                        yCoord.add(new Double(lat));
286
                                        rows.add(row);
287
                                        row = new float[numCols];
288
                                        colAct = 0;
289
                                }
290
                                if (firstRow != null) {
291
                                        //System.out.println("2: "+lineCnt+","+numCols);
292
                                        xCoord.add(new Double(lng));
293
                                        firstRow.add(new Float(z));
294
                                        numCols++;
295
                                } else {
296
                                        row[colAct] = z;
297
                                        colAct++;
298
                                }
299 2 luisw
                                lastLat = lat; lastLong = lng;
300
                                numPt ++;
301 9 luisw
                                //Point2D pt = new Point2D.Double(lng, lat);
302
                                if (projGeo == null) {
303
                                        pt = proj.createPoint(lng, lat);
304
                                } else {
305
                                        gPt = (GeoPoint) projGeo.createPoint(lng, lat);
306
                                        pt = (ProjPoint) proj.createPoint(0.0, 0.0);
307
                                        pt = proj.fromGeo(gPt, (ProjPoint) proj.createPoint(0.0, 0.0));
308
                                }
309 2 luisw
                                extent.add(pt);
310
                                minZ = Math.min(minZ, z);
311
                                maxZ = Math.max(maxZ, z);
312
                                //System.out.println(buf+" "+pt);
313 9 luisw
                        } else {
314
                                if (projGeo != null) {
315
                                        gPt = (GeoPoint) projGeo.createPoint(lng, lat);
316
                                        pt = (ProjPoint) proj.createPoint(0.0, 0.0);
317
                                        pt = proj.fromGeo(gPt, (ProjPoint) proj.createPoint(0.0, 0.0));
318
                                        lng = pt.getX(); lat = pt.getY();
319
                                }
320 2 luisw
                                set(lng, lat, z);
321 9 luisw
                        }
322 2 luisw
                }
323
        }
324 5 luisw
        public void createImage2() {
325
                distX = (extent.width()/(width-1)); distY = (extent.height()/(height-1));
326 2 luisw
                System.out.println("MDT: extent.size=("+extent.width()+","+extent.height()+")");
327 5 luisw
                im = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
328
                for (int y=0; y<height; y++) {
329
                        float [] rowAct = (float []) rows.get(y);
330
                        for (int x=0; x<numCols; x++) {
331
                                im.setRGB(x, y,  paleta.getRGB(rowAct[x]));
332
                        }
333
                }
334 2 luisw
        }
335 5 luisw
336 9 luisw
        private double getZ(double lng, double lat) {
337
                double z = 0.0;
338
                return z;
339
        }
340
341
//
342
///
343
//// Continua ...
344
///
345
//
346 2 luisw
347
        private void set(double lng, double lat, double z) {
348
                new Color(0,0,0);
349
                Point pt = toImageCoord(lng, lat);
350
                //int x = (int) ((lng-extent.minX()+(distX/2))/distX);
351
                //int y = (int) ((extent.maxY()-lat+(distY/2))/distY);
352
                //int lum = (int)(256.0*(1.0-(maxZ-z)/(maxZ-minZ)));
353
                int color = paleta.getRGB(z); //lum*256*256 + lum*256 + lum;
354
                //System.out.println("("+lng+","+lat+","+z+": "+x+","+y+","+color % 256+")");
355
                //im.setRGB(x, y, color);
356 5 luisw
                colAct = (int) pt.getX();
357
                rowAct = (int) pt.getY();
358
                im.setRGB( colAct, rowAct, color);
359 2 luisw
        }
360
361
        private Point toImageCoord(double lng, double lat) {
362
                Point pt = new Point();
363
                pt.setLocation( (int) ((lng-extent.minX()+(distX/2.0))/distX),
364
                        (int) ((extent.maxY()-lat+(distY/2.0))/distY));
365
                return pt;
366
        }
367
368
        public void setPalette(MdtPalette pal) {
369
                paleta = pal;
370
        }
371
372
        public void reProject(ReProjection rp) {
373
                // TODO Auto-generated method stub
374
        }
375
376
        public void setView(Extent e) { v = new Extent(e); }
377
        public Extent getView() { return v; }
378
379
        public void setTransparency(boolean t) {
380
                // TODO Auto-generated method stub
381
        }
382
383
        public Image updateImage(int w, int h) {
384
                Image mdtImage = null;
385
                double dFileAspect, dWindowAspect;
386
387
                // Work out the correct aspect for the setView call.
388
                dFileAspect = (double)v.width()/(double)v.height();
389
                dWindowAspect = (double)w /(double)h;
390
391
                /*if (dFileAspect > dWindowAspect) {
392
                  h =(int)((double)w/dFileAspect);
393
                } else {
394
                  w = (int)((double)h*dFileAspect);
395
                }*/
396
                mdtImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
397
                double dX = v.width()/(double) w;
398
                double dY = v.height()/(double) h;
399
                int color = 0;
400
                Point pt;
401
                for (int y=0; y<h; y++) {
402
                        for (int x=0; x<w; x++) {
403
                                pt = toImageCoord(v.minX()+(x*dX), v.maxY()-(y*dY));
404
                                color = im.getRGB((int) pt.getX(), (int)pt.getY());
405
                                ((BufferedImage) mdtImage).setRGB(x, y, color);
406
                        }
407
                }
408
409
                //mdtImage = im.getScaledInstance(w, h, 0);
410
411
                return mdtImage;
412
        }
413
}