Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / drivers / raster / CmsRasterDriver.java @ 8360

History | View | Annotate | Download (11.7 KB)

1
/*
2
 * Created on 17-dic-2004
3
 */
4
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
5
 *
6
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
21
 *
22
 * For more information, contact:
23
 *
24
 *  Generalitat Valenciana
25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib??ez, 50
27
 *   46010 VALENCIA
28
 *   SPAIN
29
 *
30
 *      +34 963862235
31
 *   gvsig@gva.es
32
 *      www.gvsig.gva.es
33
 *
34
 *    or
35
 *
36
 *   IVER T.I. S.A
37
 *   Salamanca 50
38
 *   46005 Valencia
39
 *   Spain
40
 *
41
 *   +34 963163400
42
 *   dac@iver.es
43
 */
44
package com.iver.cit.gvsig.fmap.drivers.raster;
45

    
46
import java.awt.Dimension;
47
import java.awt.Graphics2D;
48
import java.awt.Image;
49
import java.awt.geom.AffineTransform;
50
import java.awt.geom.Rectangle2D;
51
import java.awt.image.BufferedImage;
52
import java.awt.image.DataBuffer;
53
import java.io.File;
54
import java.io.IOException;
55
import java.util.ArrayList;
56

    
57
import org.cresques.cts.ICoordTrans;
58
import org.cresques.cts.IProjection;
59
import org.cresques.filter.RasterFilterStack;
60
import org.cresques.geo.ViewPortData;
61
import org.cresques.io.ErmapperWriter;
62
import org.cresques.io.GdalFile;
63
import org.cresques.io.GdalWriter;
64
import org.cresques.io.GeoRasterFile;
65
import org.cresques.io.JpegWriter;
66
import org.cresques.px.Extent;
67
import org.cresques.px.PxRaster;
68

    
69
import com.iver.cit.gvsig.fmap.ViewPort;
70
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
71
import com.iver.cit.gvsig.fmap.drivers.GeorreferencedRasterDriver;
72

    
73
/**
74
 * Driver de raster (tal y como los abre CMS.
75
 * Primera aproximaci?n al raster. Borrador para revisar.
76
 *
77
 * @author Luis W. Sevilla (sevilla_lui@gva.es)
78
 */
79
public class CmsRasterDriver implements GeorreferencedRasterDriver {
80
        private File file = null;
81
        private IProjection proj = null;
82
        private GeoRasterFile rasterFile = null;
83
        private PxRaster raster = null;
84
        private Extent tempExtent = null;
85

    
86
        int trans = 255;
87

    
88
        static {
89
                // Fuerza la carga del soporte de img (gdal):
90
                 System.err.println("CmsRasterDriver: inicializando");
91
                 Class c[] = {GdalFile.class, GdalWriter.class, ErmapperWriter.class, JpegWriter.class};
92
        }
93
        /* (non-Javadoc)
94
         * @see com.hardcode.driverManager.Driver#getName()
95
         */
96
        public String getName() {
97
                return "gvSIG Image Driver";
98
        }
99

    
100
        /**
101
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#open(java.io.File)
102
         */
103
        public void open(File f) throws IOException {
104
                file = f;
105
        }
106

    
107
        /* (non-Javadoc)
108
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#close()
109
         */
110
        public void close() throws IOException {
111
                rasterFile.close();
112
        }
113

    
114
        /* (non-Javadoc)
115
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#initialize()
116
         */
117
        public void initialize() throws IOException {
118
                if (proj != null){
119
                        String fName = file.getAbsolutePath();
120
                        int test = fName.indexOf("ecwp:");
121

    
122
                        if (test != -1) {
123
                            String urlECW = fName.substring(test + 6);
124
                            //urlECW.replaceAll("\\", "/");
125
                            fName = "ecwp://" + urlECW;
126
                                System.err.println(test+" "+fName);
127
                    }
128
                        rasterFile = GeoRasterFile.openFile(proj, fName);
129
                        //rasterFile.load();
130
                        createPxRaster();
131
                } else
132
                        throw new IOException("Proyecci?n no asignada");
133
                System.out.println(getName()+": Inicializado (con PxRaster)");
134
        }
135

    
136
        /**
137
         * @see com.iver.cit.gvsig.fmap.drivers.GeorreferencedRasterDriver#initialize(org.cresques.cts.IProjection)
138
         */
139
        public void initialize(IProjection proj) throws IOException {
140
                this.proj = proj;
141
                rasterFile = GeoRasterFile.openFile(proj, file.getAbsolutePath());
142
                //rasterFile.load();
143
                createPxRaster();
144
        }
145

    
146
        private void createPxRaster() {
147
                raster = new PxRaster(rasterFile, null, rasterFile.getExtent());
148
                raster.setTransparency(false);
149
        }
150

    
151
        /**
152
         * A?ade un fichero al PxRaste
153
         * @param fileName Nombre del fichero a a?adir
154
         */
155
        public void addFile(String fileName){
156
                if(raster!=null)
157
                        raster.addFile(fileName);
158
        }
159

    
160
        /**
161
         * Elimina un fichero al PxRaste
162
         * @param fileName Nombre del fichero a a?adir
163
         */
164
        public void delFile(String fileName){
165
                if(raster!=null)
166
                        raster.delFile(fileName);
167
        }
168

    
169
        /*
170
         * @see com.iver.cit.gvsig.fmap.drivers.GeorreferencedRasterDriver#getFullExtent()
171
         */
172
        public Rectangle2D getFullExtent() {
173
                return rasterFile.getExtent().toRectangle2D();
174
        }
175

    
176
        public int getTransparency() {
177
                return 255-(raster.getAlpha());
178
        }
179

    
180
        public void setTransparency(int trans) {
181
                this.trans = trans;
182
                if (raster != null) {
183
                        raster.setTransparency(trans);
184
                }
185
        }
186

    
187
        /* (non-Javadoc)
188
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
189
         */
190
        public void draw(BufferedImage image, Graphics2D g, ViewPort vp) throws DriverIOException {
191
                //Comentamos temporalmente el c?digo de Vicente y restauramos el que habia
192
                /*Dimension imgSz=new Dimension(image.getWidth(),image.getHeight());
193
                Rectangle2D r=vp.getAdjustedExtent();
194
                Extent e=new Extent(r);*/
195
                Extent e = new Extent(vp.getAdjustedExtent());
196
                Dimension imgSz = vp.getImageSize();
197
                ViewPortData vp2 = new ViewPortData(vp.getProjection(), e, imgSz );
198
                vp2.setMat(vp.getAffineTransform());
199
                raster.draw(g, vp2);
200
        }
201

    
202

    
203
        /*
204
         * @see com.iver.cit.gvsig.fmap.drivers.GeorreferencedRasterDriver#getProjection()
205
         */
206
        public IProjection getProjection() {
207
                return proj;
208
        }
209

    
210
        /* (non-Javadoc)
211
         * @see com.iver.cit.gvsig.fmap.drivers.GeorreferencedRasterDriver#setProjection(org.cresques.cts.IProjection)
212
         */
213
        public void setProjection(IProjection proj) {
214
                this.proj = proj;
215
        }
216

    
217
        /*
218
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getNumBands()
219
         */
220
        public int getNumBands() {
221
                return rasterFile.getBandCount();
222
        }
223

    
224
        /* (non-Javadoc)
225
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getPixel(int, int, byte[])
226
         */
227
        public byte[] getPixel(int x, int y, byte[] dArray) {
228
                // TODO Auto-generated method stub
229
                return null;
230
        }
231

    
232
        /* (non-Javadoc)
233
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getPixel(int, int, int[])
234
         */
235
        public int[] getPixel(int x, int y, int[] dArray) {
236
                // TODO Auto-generated method stub
237
                return null;
238
        }
239

    
240
        /* (non-Javadoc)
241
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getRasterDataType()
242
         */
243
        public int getRasterDataType() {
244
                return raster.getDataType();
245
        }
246

    
247
        /* (non-Javadoc)
248
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getData(int, int, int)
249
         */
250
        public Object getData(int x, int y, int band) {
251
                return raster.getFiles()[0].getData(x, y, band);
252
        }
253

    
254
        /* (non-Javadoc)
255
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getDataAsByte(int, int, int)
256
         */
257
        public byte getDataAsByte(int x, int y, int band) {
258
                // TODO Auto-generated method stub
259
                return 0;
260
        }
261

    
262
        /* (non-Javadoc)
263
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getDataAsFloat(int, int, int)
264
         */
265
        public float getDataAsFloat(int x, int y, int band) {
266
                // TODO Auto-generated method stub
267
                return 0;
268
        }
269

    
270
        /* (non-Javadoc)
271
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getDataAsDouble(int, int, int)
272
         */
273
        public double getDataAsDouble(int x, int y, int band) {
274
                // TODO Auto-generated method stub
275
                return 0;
276
        }
277

    
278
        /* (non-Javadoc)
279
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getDataAsInt(int, int, int)
280
         */
281
        public int getDataAsInt(int x, int y, int band) {
282
                // TODO Auto-generated method stub
283
                return 0;
284
        }
285

    
286
        /* (non-Javadoc)
287
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#fileAccepted(java.io.File)
288
         */
289
        public boolean fileAccepted(File file) {
290
                return GeoRasterFile.fileIsSupported(file.getName());
291
        }
292

    
293
        /* (non-Javadoc)
294
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getImage(java.awt.Dimension, java.awt.geom.Rectangle2D, org.cresques.cts.ICoordTrans)
295
         */
296
        public Image getImage(Dimension size, Rectangle2D userSize, ICoordTrans rp) {
297
                // TODO Auto-generated method stub
298
                return null;
299
        }
300

    
301
        /* (non-Javadoc)
302
         * @see com.iver.cit.gvsig.fmap.drivers.RasterDriver#getAttributes()
303
         * ?AVISO! Variar los tipos de datos devueltos puede hacer que alguna extensi?n
304
         * no funcione bien. Se pueden a?adir atributos pero no es recomendable quitar ninguno. 
305
         */
306
        public ArrayList getAttributes() {
307
                ArrayList attr = new ArrayList();
308
                String dataType = "Byte";
309
                if (rasterFile.getDataType() == DataBuffer.TYPE_BYTE) dataType = "Byte";
310
                else if (rasterFile.getDataType() == DataBuffer.TYPE_SHORT)
311
                        dataType = "Short";
312
                else if (rasterFile.getDataType() == DataBuffer.TYPE_USHORT)
313
                        dataType = "Unsigned Short";
314
                else if (rasterFile.getDataType() == DataBuffer.TYPE_INT)
315
                        dataType = "Integer";
316
                else if (rasterFile.getDataType() == DataBuffer.TYPE_FLOAT)
317
                        dataType = "Float";
318
                else if (rasterFile.getDataType() == DataBuffer.TYPE_DOUBLE)
319
                        dataType = "Double";
320
                else
321
                        dataType = "Unknown";
322
                Object [][] a = {
323
                        {"Filename",rasterFile.getName()},
324
                        {"Filesize",new Long(rasterFile.getFileSize())},
325
                        {"Width",new Integer(rasterFile.getWidth())},
326
                        {"Height", new Integer(rasterFile.getHeight())},
327
                        {"Bands", new Integer(rasterFile.getBandCount())}
328
//                        {"BandDataType", dataType}
329
                };
330
                for (int i=0; i<a.length; i++)
331
                        attr.add(a[i]);
332
                return attr;
333
        }
334

    
335
        /**
336
         * Devuelve el colorBand activo en la banda especificada.
337
         * @param flag banda.
338
         * @return color de banda activo
339
         */
340
        public int getBand(int flag){
341
                return raster.getBand(flag);
342
        }
343

    
344
        /**
345
         * Devuelve la posici?n del fichero para la banda especificada.
346
         * @param flag banda.
347
         * @return posici?n del fichero
348
         */
349
        public int getPosFile(int flag){
350
                return raster.getPosFile(flag);
351
        }
352

    
353
        /**
354
         * Activa o desactiva la transparencia
355
         * @param t        true activa la transparencia y false la desactiva
356
         */
357
        public void setTransparency(boolean t){
358
                raster.setTransparency(t);
359
        }
360

    
361
        /**
362
         * Asocia un colorBand al rojo, verde o azul.
363
         * @param flag cual (o cuales) de las bandas.
364
         * @param nBand        que colorBand
365
         */
366
        public void setBand(int flag, int nBand){
367
                raster.setBand(flag, nBand);
368
        }
369

    
370
        /**
371
         * Obtiene la pila de filtros
372
         * @return pila de filtros
373
         */
374
        public RasterFilterStack getFilterStack(){
375
                return raster.filterStack;
376
        }
377

    
378
        /**
379
         * Asigna la pila de filtros
380
         * @return pila de filtros
381
         */
382
        public void setFilterStack(RasterFilterStack stack){
383
                raster.filterStack = stack;
384
        }
385

    
386
        /**
387
         * Obtiene el valor del pixel del Image en la posici?n x,y
388
         * @param x Posici?n x
389
         * @param y Posici?n y
390
         * @return valor de pixel
391
         */
392
        public int[] getPixel(double wcx, double wcy){
393
                return raster.getPixel(wcx, wcy);
394
        }
395

    
396
        /**
397
         *
398
         */
399
        public GeoRasterFile [] getFiles(){
400
                return raster.getFiles();
401
        }
402
        
403
        /**
404
         * Obtiene el flag que dice si la imagen est? o no georreferenciada
405
         * @return true si est? georreferenciada y false si no lo est?.
406
         */
407
        public boolean isGeoreferenced() {
408
                return rasterFile.isGeoreferenced();
409
        }
410
        
411
        /**
412
         * Asigna una transformaci?n al georrasterfile para la transformar la 
413
         * asignaci?n de setView. Del mismo modo asigna los extents a PxRaster para
414
         * transformar la visualizaci?n.
415
         * @param t Matriz de transformaci?n
416
         */
417
        public void setAffineTransform(AffineTransform t){ 
418
                for (int i = 0; i < raster.getFiles().length; i++) {
419
                        raster.getFiles()[i].setAffineTransform(t);
420
                        raster.setExtent(raster.getFiles()[i].getExtent());
421
                        raster.setExtentForRequest(raster.getFiles()[i].getExtentForRequest());
422
                }
423
        }
424
        
425
        public AffineTransform getAffineTransform(){
426
                return raster.getFiles()[0].getAffineTransform();
427
        }
428
}