Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / dataset / io / ErmapperDriver.java @ 12749

History | View | Annotate | Download (25.7 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.dataset.io;
20

    
21
import java.awt.geom.AffineTransform;
22
import java.awt.geom.NoninvertibleTransformException;
23
import java.awt.geom.Point2D;
24
import java.io.File;
25
import java.util.Vector;
26

    
27
import org.cresques.cts.ICoordTrans;
28
import org.cresques.cts.IProjection;
29
import org.gvsig.raster.dataset.BandList;
30
import org.gvsig.raster.dataset.FileNotOpenException;
31
import org.gvsig.raster.dataset.GeoInfo;
32
import org.gvsig.raster.dataset.IBuffer;
33
import org.gvsig.raster.dataset.InvalidSetViewException;
34
import org.gvsig.raster.dataset.NotSupportedExtensionException;
35
import org.gvsig.raster.dataset.RasterDataset;
36
import org.gvsig.raster.dataset.RasterDriverException;
37
import org.gvsig.raster.dataset.io.rmf.ParsingException;
38
import org.gvsig.raster.datastruct.Extent;
39
import org.gvsig.raster.datastruct.Transparency;
40
import org.gvsig.raster.util.RasterUtilities;
41
import org.gvsig.raster.util.extensionPoints.ExtensionPoints;
42
import org.gvsig.raster.util.extensionPoints.ExtensionPointsSingleton;
43

    
44
import com.ermapper.ecw.JNCSException;
45
import com.ermapper.ecw.JNCSFile;
46
import com.ermapper.ecw.JNCSFileNotOpenException;
47
import com.ermapper.ecw.JNCSInvalidSetViewException;
48
import com.ermapper.ecw.JNCSProgressiveUpdate;
49
/**
50
 * Driver de Ecw
51
 *
52
 * @author Nacho Brodin (nachobrodin@gmail.com)
53
 */
54
public class ErmapperDriver extends RasterDataset implements JNCSProgressiveUpdate {
55

    
56
        private JNCSFile                                 file = null;
57

    
58
        /**
59
         * Estado de transparencia del raster.
60
         */
61
        protected Transparency                  fileTransparency = null;
62

    
63
        /**
64
         * Extent de la ventana seleccionada
65
         */
66
        private Extent                  viewRequest = null;
67
        private boolean                                 readCancel = false;
68

    
69
        public static void register() {
70
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
71
                extensionPoints.add("RasterReader", "ecw", ErmapperDriver.class);
72
                extensionPoints.add("RasterReader", "jp2", ErmapperDriver.class);
73
        }
74

    
75
        class Contour extends Vector {
76
                final private static long serialVersionUID = 0;
77
                public double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE;
78
                public double maxX = -Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
79
                public Contour() {
80
                        super();
81
                }
82
                public void add(Point2D pt) {
83
                        super.add(pt);
84
                        if (pt.getX() > maxX) maxX = pt.getX();
85
                        if (pt.getX() < minX) minX = pt.getX();
86
                        if (pt.getY() > maxY) maxY = pt.getY();
87
                        if (pt.getY() < minY) minY = pt.getY();
88
                }
89
        }
90

    
91
        /**
92
         * Constructor. Abre el dataset.
93
         * @param proj Proyecci?n
94
         * @param fName Nombre del fichero ecw
95
         * @throws NotSupportedExtensionException
96
         */
97
        public ErmapperDriver(IProjection proj, Object param)throws NotSupportedExtensionException {
98
                super(proj, ((String)param));
99
                setParam(param);
100
                try {
101
                        
102
                        if (!new File(((String)param)).exists() && !((String)param).startsWith("ecwp:"))
103
                                throw new NotSupportedExtensionException("Extension not supported");
104
                        
105
                        file = new JNCSFile(((String)param), false);
106
                        load();
107
                        bandCount = file.numBands;
108
                        getTransparencyDatasetStatus();
109
                        setDataType(IBuffer.TYPE_BYTE);
110
                        
111
                        super.init();
112
                        
113
                        try {
114
                                loadFromRmf(getRmfBlocksManager());
115
                        } catch (ParsingException e) {
116
                                //No lee desde rmf
117
                        }
118
                        
119
                } catch (Exception e) {
120
                        throw new NotSupportedExtensionException("Extension not supported");
121
                }
122
        }
123

    
124
        /**
125
         * Carga un ECW.
126
         * @param fname
127
         */
128
        public GeoInfo load() {
129
                ownTransformation = new AffineTransform(file.cellIncrementX, 0, 0, file.cellIncrementY, file.originX, file.originY);
130
                externalTransformation = (AffineTransform) ownTransformation.clone();
131
                return this;
132
        }
133
        
134
        /**
135
         * Cierra el fichero ECW
136
         */
137
        public void close() {
138
                if(file != null){
139
                        file.close(true);
140
                        file = null;
141
                }
142
        }
143

    
144
        /**
145
         * Obtiene el objeto que contiene el estado de la transparencia
146
         */
147
        public Transparency getTransparencyDatasetStatus() {
148
                if(fileTransparency == null)
149
                        fileTransparency = new Transparency();
150
                return fileTransparency;
151
        }
152
        
153
        /**
154
         * Devuelve el ancho de la imagen
155
         */
156
        public int getWidth() {
157
                return file.width;
158
        }
159
        
160
        /**
161
         * Devuelve el alto de la imagen
162
         */
163
        public int getHeight() {
164
                return file.height;
165
        }
166

    
167
        /**
168
         * Obtiene el extent de la ?ltima ventana seleccionada.
169
         * @return Extent
170
         */
171
        public Extent getView() {
172
                return viewRequest;
173
        }
174

    
175
        /*
176
         * (non-Javadoc)
177
         * @see org.gvsig.fmap.driver.RasterDataset#setView(org.gvsig.fmap.raster.Extent)
178
         */
179
        public void setView(Extent e) {
180
                viewRequest = new Extent(e);
181
        }
182

    
183
        /**
184
         * Cuando se hace una petici?n de carga de buffer la extensi?n pedida puede estar ajustada a la extensi?n del raster
185
         * o no estarlo. En caso de no estarlo los pixeles del buffer que caen fuera de la extensi?n del raster tendr?n valor
186
         * de NoData. Esta funci?n calcula en que pixel del buffer hay que empezar a escribir en caso de que este sea mayor
187
         * que los datos a leer.
188
         * @param dWorldTLX Posici?n X superior izquierda en coord reales
189
         * @param dWorldTLY Posici?n Y superior izquierda en coord reales
190
         * @param dWorldBRX Posici?n X inferior derecha en coord reales
191
         * @param dWorldBRY Posici?n Y inferior derecha en coord reales
192
         * @param nWidth Ancho en pixeles del buffer
193
         * @param nHeight Alto en pixeles del buffer
194
         * @return desplazamiento dentro del buffer en X e Y
195
         */
196
        private int[] calcStepBuffer(Extent dataExtent, int nWidth, int nHeight, int[] stpBuffer) {
197
                Extent imageExtent = getExtentWithoutRot();
198
                Extent ajustDataExtent = RasterUtilities.calculateAdjustedView(dataExtent, imageExtent);
199
                if(!RasterUtilities.compareExtents(dataExtent, ajustDataExtent)) {
200
                        Point2D p1 = worldToRaster(new Point2D.Double(ajustDataExtent.minX(), ajustDataExtent.maxY()));
201
                        Point2D p2 = worldToRaster(new Point2D.Double(ajustDataExtent.maxX(), ajustDataExtent.minY()));
202
                        Point2D p3 = worldToRaster(new Point2D.Double(dataExtent.minX(), dataExtent.maxY()));
203
                        Point2D p4 = worldToRaster(new Point2D.Double(dataExtent.maxX(), dataExtent.minY()));
204
                        //Ese es el ancho y alto q tendr?a el buffer en caso de haberse ajustado
205
                        int w = (int)Math.abs(Math.ceil(p2.getX()) - Math.floor(p1.getX()));
206
                        int h = (int)Math.abs(Math.floor(p1.getY()) - Math.ceil(p2.getY()));
207
                        
208
                        stpBuffer[0] = (int)(p1.getX() + (-p3.getX()));
209
                        stpBuffer[1] = (int)(p1.getY() + (-p3.getY()));
210
                        stpBuffer[2] = stpBuffer[0] + w;
211
                        stpBuffer[3] = stpBuffer[1] + h;
212
                        return new int[]{w, h};
213
                }
214
                return new int[]{nWidth, nHeight};
215
        }
216

    
217
        /*
218
         * (non-Javadoc)
219
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.IBuffer)
220
         */
221
        public IBuffer getWindowRaster(double ulx, double uly, double lrx, double lry, BandList bandList, IBuffer rasterBuf) {                
222
                Point2D p1 = new Point2D.Double(ulx, uly);
223
                Point2D p2 = new Point2D.Double(lrx, lry);
224
                try {
225
                        externalTransformation.inverseTransform(p1, p1);
226
                        externalTransformation.inverseTransform(p2, p2);
227
                        ownTransformation.transform(p1, p1);
228
                        ownTransformation.transform(p2, p2);
229
                } catch (NoninvertibleTransformException e) {
230
                        e.printStackTrace();
231
                }
232

    
233
                Extent selectedExtent = new Extent(p1.getX(), p1.getY(), p2.getX(), p2.getY());
234
                
235
                setView(selectedExtent);
236
                int wPx = rasterBuf.getWidth();
237
                int hPx = rasterBuf.getHeight();
238
                int[] stpBuffer = new int[]{0, 0 , wPx, hPx};
239

    
240
                loadBuffer(viewRequest, wPx, hPx, rasterBuf, bandList, stpBuffer);
241

    
242
                return rasterBuf;
243
        }
244
        
245
        /*
246
         * (non-Javadoc)
247
         * @see org.gvsig.fmap.driver.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.fmap.driver.BandList, org.gvsig.fmap.driver.IBuffer, boolean)
248
         */
249
        public IBuffer getWindowRaster(double ulx, double uly, double w, double h, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent) {
250
                //El incremento o decremento de las X e Y depende de los signos de rotaci?n y escala en la matriz de transformaci?n. Por esto
251
                //tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h 
252
                Extent ext = getExtent();
253
                Point2D pInit = rasterToWorld(new Point2D.Double(0, 0));
254
                Point2D pEnd = rasterToWorld(new Point2D.Double(getWidth(), getHeight()));
255
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
256
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
257
                double lrx = (((ext.getULX() - wRaster) > ext.maxX()) || ((ext.getULX() - wRaster) < ext.minX())) ? (ulx + w) : (ulx - w);
258
                double lry = (((ext.getULY() - hRaster) > ext.maxY()) || ((ext.getULY() - hRaster) < ext.minY())) ? (uly + h) : (uly - h); 
259
                
260
                Point2D p1 = new Point2D.Double(ulx, uly);
261
                Point2D p2 = new Point2D.Double(lrx, lry);
262
                try {
263
                        externalTransformation.inverseTransform(p1, p1);
264
                        externalTransformation.inverseTransform(p2, p2);
265
                        ownTransformation.transform(p1, p1);
266
                        ownTransformation.transform(p2, p2);
267
                } catch (NoninvertibleTransformException e) {
268
                        e.printStackTrace();
269
                }
270

    
271
                Extent selectedExtent = new Extent(p1.getX(), p1.getY(), p2.getX(), p2.getY());
272
                
273
                setView(selectedExtent);
274
                int wPx = rasterBuf.getWidth();
275
                int hPx = rasterBuf.getHeight();
276
                int[] stpBuffer = new int[]{0, 0 , wPx, hPx};
277

    
278
                //TODO: FUNCIONALIDAD: Implementar adjustToExtent = false
279
                /*if(!adjustToExtent){
280
                                         int[] wh = calcStepBuffer(selectedExtent, wPx, hPx, stpBuffer);
281
                                         if(x < 0)
282
                                                 x  = 0;
283
                                         if(y < 0)
284
                                                 y  = 0;
285
                                         readData(buf, bandList, x, y, wh[0], wh[1], wh[0], wh[1], 0, 0, stpBuffer);
286
                                         return;
287
                        }*/
288

    
289
                loadBuffer(viewRequest, wPx, hPx, rasterBuf, bandList, stpBuffer);
290

    
291
                return rasterBuf;
292
        }
293

    
294
        /*
295
         * (non-Javadoc)
296
         * @see org.gvsig.fmap.driver.RasterDataset#getWindowRaster(int, int, int, int, org.gvsig.fmap.driver.BandList, org.gvsig.fmap.driver.IBuffer)
297
         */
298
        public IBuffer getWindowRaster(int x, int y, int w, int h, BandList bandList, IBuffer rasterBuf) {
299
                Point2D init = this.rasterToWorld(new Point2D.Double(x, y));
300
                Point2D end = this.rasterToWorld(new Point2D.Double(x + w, y + h));
301
                Extent selectedExtent = new Extent(init.getX(), init.getY(), end.getX(), end.getY());
302
                setView(selectedExtent);
303
                int[] stpBuffer = new int[]{0, 0 , w, h};
304

    
305
                loadBuffer(viewRequest, w, h, rasterBuf, bandList, stpBuffer);
306
                return rasterBuf;
307
        }
308

    
309
        /*
310
         * (non-Javadoc)
311
         * @see org.gvsig.fmap.driver.RasterDataset#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.driver.BandList, org.gvsig.fmap.driver.IBuffer, boolean)
312
         */
313
        public IBuffer getWindowRaster(double minX, double minY, double maxX, double maxY, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent) {
314
                Point2D p1 = new Point2D.Double(minX, maxY);
315
                Point2D p2 = new Point2D.Double(maxX, minY);
316
                try {
317
                        externalTransformation.inverseTransform(p1, p1);
318
                        externalTransformation.inverseTransform(p2, p2);
319
                        ownTransformation.transform(p1, p1);
320
                        ownTransformation.transform(p2, p2);
321
                } catch (NoninvertibleTransformException e) {
322
                        e.printStackTrace();
323
                }
324
                Extent selectedExtent = new Extent(p1, p2);
325
                setView(selectedExtent);
326
                int[] stpBuffer = new int[]{0, 0 , bufWidth, bufHeight};
327

    
328
                //TODO: FUNCIONALIDAD: Implementar adjustToExtent = false
329

    
330
                loadBuffer(viewRequest, bufWidth, bufHeight, rasterBuf, bandList, stpBuffer);
331
                return rasterBuf;
332
        }
333

    
334
        /*
335
         * (non-Javadoc)
336
         * @see org.gvsig.fmap.driver.RasterDataset#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.driver.BandList, org.gvsig.fmap.driver.IBuffer)
337
         */
338
        public IBuffer getWindowRaster(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf) {
339
                Point2D init = this.rasterToWorld(new Point2D.Double(x, y));
340
                Point2D end = this.rasterToWorld(new Point2D.Double(x + w, y + h));
341
                Extent selectedExtent = new Extent(init.getX(), init.getY(), end.getX(), end.getY());
342
                setView(selectedExtent);
343
                int[] stpBuffer = new int[]{0, 0 , bufWidth, bufHeight};
344

    
345
                loadBuffer(viewRequest, bufWidth, bufHeight, rasterBuf, bandList, stpBuffer);
346
                return rasterBuf;
347
        }
348

    
349
        /**
350
         * Carga el buffer con las bandas RGB del raster con los par?metros especificados de extensi?n
351
         * y tama?o de buffer. El problema de ecw es que solo podemos leer 3 bandas de una vez ya que solo disponemos
352
         * de una llamada readLineRGBA. Para leer m?s bandas tendremos que hacer multiples llamadas a setView para leer
353
         * 3 cada vez.
354
         *
355
         * Si por ejemplo tenemos un ecw de 6 bandas [0, 1, 2, 3, 4, 5] y queremos cargar un buffer con el siguiente orden
356
         * [0, -, 2, -, 4, -] La variable readBandsFromECW har? la llamada a setView con los valores [0, 2, 4, 0, 0, 0]. La
357
         * funci?n drawRGB ser? la encargada de hacer el switch para obtener [0, -, 2, -, 4, -].
358
         *
359
         * Bug#1: Si se dispone de un ecw de m?s de tres bandas podemos llamar a setView con readBandsFromECW con el orden
360
         * que queramos, por ejemplo [3, 2, 5, 1, 0] pero para ecw de 3 bandas la llamada con las bandas cambiadas no
361
         * hace caso. El caso de readBandsFromECW = [2, 0, 1] ser? tomado siempre como [0, 1, 2].
362
         *
363
         * @param selectedExtent Extensi?n seleccionada
364
         * @param bufWidth Ancho de buffer
365
         * @param bufHeight Alto de buffer
366
         * @param rasterBuf Buffer de datos
367
         */
368
        private void loadBuffer(Extent selectedExtent, int bufWidth, int bufHeight, IBuffer rasterBuf, BandList bandList, int[] stpBuffer){
369
                try{
370
                        //Leemos el raster desde la librer?a
371
                        
372
                        Extent ext = new Extent(file.originX, file.originY, file.originX + (file.width * file.cellIncrementX), file.originY + (file.height * file.cellIncrementY));
373
                        selectedExtent = RasterUtilities.calculateAdjustedView(selectedExtent, ext);
374
                        int[] readBandsFromECW = new int[file.numBands];
375
                        int[] readBands = new int[file.numBands];
376
                        
377
                        
378
                        for(int i = 0; i < readBandsFromECW.length; i ++)
379
                                readBands[i] = -1;
380
                        int cont = 0;
381
                        for(int i = 0; i < file.numBands; i++) {
382
                                int[] bandsToDraw = bandList.getBand(i).getBufferBandListToDraw();
383
                                if(bandsToDraw != null) {
384
                                        for(int j = 0; j < bandsToDraw.length; j++){
385
                                                readBandsFromECW[cont] = i;
386
                                                readBands[cont] = i;
387
                                                cont ++;
388
                                        }
389
                                }
390
                                
391
                        }
392
                        
393
                        if(readCancel) {
394
                                readCancel = false;
395
                                return;
396
                        }
397
                        
398
                        file.setView(file.numBands, readBandsFromECW, selectedExtent.minX(), selectedExtent.maxY(), selectedExtent.maxX(), selectedExtent.minY(), bufWidth, bufHeight);
399
                        
400
                        //Escribimos el raster sobre un IBuffer
401
                        int[] pRGBArray = new int[bufWidth];
402
                        drawRGB(rasterBuf, pRGBArray, readBands, bandList);
403
                        
404
                }catch(JNCSInvalidSetViewException exc){
405
                        exc.printStackTrace();
406
                }catch (JNCSFileNotOpenException e) {
407
                        e.printStackTrace();
408
                }catch (JNCSException ex) {
409
                        ex.printStackTrace();
410
                }
411
                
412
        }
413

    
414

    
415
        private void drawRGB(IBuffer rasterBuf, int[] pRGBArray, int[] readBands, BandList bandList)throws JNCSException{
416
                int bandR = readBands[0];
417
                int bandG = (readBands.length > 1) ? readBands[1] : -1;
418
                int bandB = (readBands.length > 2) ? readBands[2] : -1;
419

    
420
                //********* caso especial que resuelve Bug#1 **********************
421
                if(file.numBands == 3 && bandList.getDrawableBandsCount() < 3) {
422
                        for(int i = 0; i < 3; i ++){
423
                                int[] b = bandList.getBand(i).getBufferBandListToDraw();
424
                                if(b != null){
425
                                        bandG = 1; bandR = 0; bandB = 2;
426
                                }
427
                        }
428
                }
429
                if(file.numBands == 3 && bandR == bandG && bandG == bandB) { //caso especial que resuelve Bug#1
430
                        for(int i = 0; i < 3; i ++) {
431
                                int[] b = bandList.getBand(i).getBufferBandListToDraw();
432
                                if(b != null){
433
                                        if(i == 0){
434
                                                for (int line = 0; line < rasterBuf.getHeight(); line++) {
435
                                                                                file.readLineRGBA(pRGBArray);
436
                                                                                for(int col = 0; col < pRGBArray.length; col ++){
437
                                                                                        rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
438
                                                                                        rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
439
                                                                                        rasterBuf.setElem(line, col, bandB, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
440
                                                                                }
441
                                                                }
442
                                                return;
443
                                        }
444
                                        if(i == 1) {
445
                                                for (int line = 0; line < rasterBuf.getHeight(); line++) {
446
                                                                                file.readLineRGBA(pRGBArray);
447
                                                                                for(int col = 0; col < pRGBArray.length; col ++){
448
                                                                                        rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
449
                                                                                        rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
450
                                                                                        rasterBuf.setElem(line, col, bandB, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
451
                                                                                }
452
                                                                }
453
                                                return;
454
                                        }
455
                                        if(i == 2) {
456
                                                for (int line = 0; line < rasterBuf.getHeight(); line++) {
457
                                                                                file.readLineRGBA(pRGBArray);
458
                                                                                for(int col = 0; col < pRGBArray.length; col ++){
459
                                                                                        rasterBuf.setElem(line, col, bandR, (byte)(pRGBArray[col] & 0x000000ff));
460
                                                                                        rasterBuf.setElem(line, col, bandG, (byte)(pRGBArray[col] & 0x000000ff));
461
                                                                                        rasterBuf.setElem(line, col, bandB, (byte)(pRGBArray[col] & 0x000000ff));
462
                                                                                }
463
                                                                }
464
                                                return;
465
                                        }
466
                                }
467
                                if(readCancel) {
468
                                        readCancel = false;
469
                                        return;
470
                                }
471
                        }
472

    
473
                }
474
                //********* END caso especial que resuelve Bug#1 **********************
475

    
476
                if(bandR >= 0 && bandG >= 0 && bandB >= 0) {
477
                        for (int line = 0; line < rasterBuf.getHeight(); line++) {
478
                                                        file.readLineRGBA(pRGBArray);
479
                                                        for(int col = 0; col < pRGBArray.length; col ++){
480
                                                                rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
481
                                                                rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
482
                                                                rasterBuf.setElem(line, col, bandB, (byte)(pRGBArray[col] & 0x000000ff));
483
                                                        }
484
                                        }
485
                        return;
486
                }
487

    
488
                if(readCancel) {
489
                        readCancel = false;
490
                        return;
491
                }
492

    
493
                if(bandR >= 0 && bandG >= 0) {
494
                        for (int line = 0; line < rasterBuf.getHeight(); line++) {
495
                                                        file.readLineRGBA(pRGBArray);
496
                                                        for(int col = 0; col < pRGBArray.length; col ++){
497
                                                                rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
498
                                                                rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
499
                                                        }
500
                                        }
501
                        return;
502
                }
503

    
504
                if(readCancel) {
505
                        readCancel = false;
506
                        return;
507
                }
508

    
509
                if(bandR >= 0){
510
                        for (int line = 0; line < rasterBuf.getHeight(); line++) {
511
                                                        file.readLineRGBA(pRGBArray);
512
                                                        for(int col = 0; col < pRGBArray.length; col ++)
513
                                                                rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
514
                                        }
515
                        return;
516
                }
517

    
518
                if(readCancel) {
519
                        readCancel = false;
520
                        return;
521
                }
522

    
523
        }
524

    
525
        public void reProject(ICoordTrans rp) {
526
        }
527

    
528
        /*
529
         * (non-Javadoc)
530
         * @see org.gvsig.raster.dataset.RasterDataset#getBlockSize()
531
         */
532
        public int getBlockSize() {
533
                return 0;
534
        }
535

    
536
        /*
537
         * (non-Javadoc)
538
         * @see org.gvsig.raster.driver.RasterDataset#readCompletetLine(int, int)
539
         */
540
        public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
541
                if(line < 0 || line >= file.height || band < 0 || band >= getBandCount())
542
                        throw new InvalidSetViewException("Request out of grid");
543

    
544
                Point2D begin = rasterToWorld(new Point2D.Double(0, line));
545
                Point2D end = rasterToWorld(new Point2D.Double(file.width, line + 1));
546
                int[] readBandsFromECW = new int[file.numBands];
547
                if(file.numBands <= 3) {
548
                        for(int i = 0; i < file.numBands; i++)
549
                                readBandsFromECW[i] = i;
550
                }else {
551
                        readBandsFromECW[0] = band;
552
                }
553

    
554
                Extent e = new Extent(begin.getX(), begin.getY(), end.getX(), end.getY());
555

    
556
                try {
557
                        int[] value = new int[file.width];
558
                        file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), file.width, 1);
559
                        file.readLineRGBA(value);
560

    
561
                        if(file.numBands <= 3) {
562
                                switch(getDataType()) {
563
                                case IBuffer.TYPE_BYTE: byte[] b = new byte[file.width];
564
                                                                                switch(band) {
565
                                                                                case 0: for(int i = 0; i < file.width; i ++)
566
                                                                                                        b[i] = (byte)(((value[i] & 0x00ff0000) >> 16) & 0xff);
567
                                                                                                break;
568
                                                                                case 1: for(int i = 0; i < file.width; i ++)
569
                                                                                                        b[i] = (byte)(((value[i] & 0x0000ff00) >> 8) & 0xff);
570
                                                                                                break;
571
                                                                                case 2: for(int i = 0; i < file.width; i ++)
572
                                                                                                        b[i] = (byte)((value[i] & 0x000000ff) & 0xff);
573
                                                                                                break;
574
                                                                                }
575
                                                                                return b;
576
                                }
577
                        }else {
578
                                switch(getDataType()) {
579
                                case IBuffer.TYPE_BYTE: byte[] b = new byte[file.width];
580
                                                                                for(int i = 0; i < file.width; i ++)
581
                                                                                        b[i] = (byte)(((value[i] & 0x00ff0000) >> 16) & 0xff);
582
                                                                                break;
583
                                }
584
                        }
585
                        //TODO: FUNCIONALIDAD: Ecw con otro tipo de dato != Byte
586
                } catch (JNCSFileNotOpenException e1) {
587
                        throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
588
                } catch (JNCSInvalidSetViewException e1) {
589
                        throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
590
                } catch (JNCSException e1) {
591
                        throw new RasterDriverException("Error la lectura de datos ecw");
592
                }
593

    
594
                return null;
595
        }
596

    
597
        /*
598
         *  (non-Javadoc)
599
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int, int)
600
         */
601
        public Object readBlock(int pos, int blockHeight) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
602
                if(pos < 0)
603
                        throw new InvalidSetViewException("Request out of grid");
604

    
605
                if((pos + blockHeight) > file.height)
606
                        blockHeight = Math.abs(file.height - pos);
607

    
608
                Point2D begin = rasterToWorld(new Point2D.Double(0, pos));
609
                Point2D end = rasterToWorld(new Point2D.Double(file.width, pos + blockHeight));
610
                int[] readBandsFromECW = new int[file.numBands];
611

    
612
                for(int i = 0; i < file.numBands; i++)
613
                        readBandsFromECW[i] = i;
614

    
615
                byte[][][] buf = new byte[file.numBands][blockHeight][file.width];
616
                Extent e = new Extent(begin.getX(), begin.getY(), end.getX(), end.getY());
617
                e = RasterUtilities.calculateAdjustedView(getExtent(), e);
618

    
619
                try {
620
                        int[] value = new int[file.width];
621
                        file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), file.width, blockHeight);
622

    
623
                        if(file.numBands <= 3) {
624
                                for (int row = 0; row < blockHeight; row++) {
625
                                        file.readLineRGBA(value);
626
                                        switch(getDataType()) {
627
                                        case IBuffer.TYPE_BYTE:
628
                                                for(int col = 0; col < file.width; col ++) {
629
                                                        buf[0][row][col] = (byte)(((value[col] & 0x00ff0000) >> 16) & 0xff);
630
                                                        buf[1][row][col] = (byte)(((value[col] & 0x0000ff00) >> 8) & 0xff);
631
                                                        buf[2][row][col] = (byte)((value[col] & 0x000000ff) & 0xff);
632
                                                }
633
                                                break;
634
                                        }
635
                                }
636

    
637
                                if(readCancel) {
638
                                        readCancel = false;
639
                                        return null;
640
                                }
641

    
642
                        } else {
643
                                //TODO: FUNCIONALIDAD: file.numBands > 3
644
                        }
645

    
646
                        //TODO: FUNCIONALIDAD: Ecw con otro tipo de dato != Byte
647
                } catch (JNCSFileNotOpenException e1) {
648
                        throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
649
                } catch (JNCSInvalidSetViewException e1) {
650
                        throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
651
                } catch (JNCSException e1) {
652
                        throw new RasterDriverException("Error la lectura de datos ecw");
653
                }
654

    
655
                return buf;
656
        }
657

    
658
        /*
659
         * (non-Javadoc)
660
         * @see org.gvsig.raster.driver.RasterDataset#getData(int, int, int)
661
         */
662
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
663
                if(x < 0 || y < 0 || x >= file.width || y >= file.height)
664
                        throw new InvalidSetViewException("Request out of grid");
665

    
666
                Point2D begin = rasterToWorld(new Point2D.Double(x, y));
667
                Point2D end = rasterToWorld(new Point2D.Double(x + 1, y + 1));
668
                int[] readBandsFromECW = new int[file.numBands];
669
                if(file.numBands <= 3){
670
                        for(int i = 0; i < file.numBands; i++)
671
                                readBandsFromECW[i] = i;
672
                }else{
673
                        readBandsFromECW[0] = band;
674
                }
675

    
676
                Extent e = new Extent(begin.getX(), begin.getY(), end.getX(), end.getY());
677
                try {
678
                        int[] value = new int[1];
679
                        file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), 1, 1);
680
                        file.readLineRGBA(value);
681
                        if(file.numBands <= 3){
682
                                switch(band){
683
                                case 0: return new Integer((((value[0] & 0x00ff0000) >> 16) & 0xffffffff));
684
                                case 1: return new Integer((((value[0] & 0x0000ff00) >> 8) & 0xffffffff));
685
                                case 2: return new Integer((((value[0] & 0x000000ff)) & 0xffffffff));
686
                                }
687
                        }
688
                        return new Integer((((value[0] & 0x00ff0000) >> 16) & 0xffffffff));
689
                } catch (JNCSFileNotOpenException e1) {
690
                        throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
691
                } catch (JNCSInvalidSetViewException e1) {
692
                        throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
693
                } catch (JNCSException e1) {
694
                        throw new RasterDriverException("Error reading ecw data");
695
                }
696
        }
697

    
698
        public void refreshUpdate(int arg0, int arg1, double arg2, double arg3, double arg4, double arg5) {
699
        }
700

    
701
        public void refreshUpdate(int arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
702
        }
703

    
704
        /*
705
         * (non-Javadoc)
706
         * @see org.gvsig.raster.driver.GeoData#getStringProjection()
707
         */
708
        public String getStringProjection() throws RasterDriverException{
709
                return file.projection;
710
        }
711

    
712
        /*
713
         *  (non-Javadoc)
714
         * @see org.gvsig.raster.dataset.RasterDataset#setCanceled(boolean, int)
715
         */
716
        public void setCanceled(boolean value, int process) {
717
                super.setCanceled(value, process);
718

    
719
                if(process == CANCEL_READ || process == 0)
720
                        readCancel = value;
721
        }
722

    
723
        /*
724
         *  (non-Javadoc)
725
         * @see org.gvsig.raster.dataset.RasterDataset#isCanceled(int)
726
         */
727
        public boolean isCanceled(int process) {
728
                if(process == CANCEL_READ) {
729
                        return readCancel;
730
                } else
731
                        return super.isCanceled(process);
732
        }
733

    
734
        /*
735
         * (non-Javadoc)
736
         * @see org.gvsig.raster.driver.GeoData#getStringProjection()
737
         */
738
        public String getWktProjection() throws RasterDriverException{
739
                //System.err.println("======>" + file.projection);
740
                return null;
741
        }
742

    
743
}
744

    
745

    
746