Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / dataset / io / MrSidDriver.java @ 12383

History | View | Annotate | Download (12.5 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.NoninvertibleTransformException;
22
import java.awt.geom.Point2D;
23
import java.awt.image.BufferedImage;
24

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

    
40
import es.gva.cit.jmrsid.MrSIDException;
41

    
42

    
43
/**
44
 * @author Nacho Brodin (nachobrodin@gmail.com)
45
 *
46
 * Clase encargada del acceso a los datos y repintado de imagenes MrSID. Estos
47
 * son registrados con la extensi?n sid
48
 */
49
public class MrSidDriver extends RasterDataset {
50
    public final static int BAND_HEIGHT = 64;
51

    
52
    protected MrSidNative file = null;
53
    private Extent viewRequest = null;
54
        /**
55
         * Estado de transparencia del raster.
56
         */
57
        protected Transparency                  fileTransparency = null;
58

    
59
    public static void register() {
60
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
61
                extensionPoints.add("RasterReader", "sid", MrSidDriver.class);
62
        }
63
    
64
    /**
65
     * Contructor. Abre el fichero mrsid
66
     * @param proj        Proyecci?n
67
     * @param fName        Nombre del fichero mrsid
68
     */
69
    public MrSidDriver(IProjection proj, Object param) {
70
            super(proj, ((String)param));
71
            setParam(param);
72
        extent = new Extent();
73
        try {
74
            file = new MrSidNative(((String)param));
75
            load();
76
            bandCount = file.nbands;
77
            setDataType(IBuffer.TYPE_BYTE);
78
            super.init();
79
            
80
            try {
81
                             loadFromRmf(getRmfBlocksManager());
82
                     } catch (ParsingException e) {
83
                             //No lee desde rmf
84
                     }        
85
        } catch (Exception e) {
86
            System.out.println("Error en constructor de MrSID");
87
            e.printStackTrace();
88
            file = null;
89
        }
90
    }
91

    
92
        /**
93
         * Obtenemos o calculamos el extent de la imagen.
94
         */
95
    public GeoInfo load() {
96
                   extent = new Extent(file.esq.minX, file.esq.minY, file.esq.maxX, file.esq.maxY);
97
                   requestExtent = extent;        
98
        return this;
99
    }
100

    
101
    /**
102
     * Libera el objeto que ha abierto el fichero
103
     */
104
    public void close() {
105
            if(file != null){
106
                    file.close();
107
                    file = null;
108
            }
109
    }
110

    
111
    /**
112
     * Asigna el extent de la vista
113
     */
114
    public void setView(Extent e) {
115
            if(rmfExists) {
116
                        Point2D.Double petInit = null, petEnd = null;
117
                        try {
118
                                petInit = new Point2D.Double(e.minX(), e.maxY());
119
                                petEnd = new Point2D.Double(e.maxX(), e.minY());
120
                                transformRMF.inverseTransform(petInit, petInit);
121
                                transformRMF.inverseTransform(petEnd, petEnd);
122
                                transformTFW.transform(petInit, petInit);
123
                                transformTFW.transform(petEnd, petEnd);
124
                        } catch(NoninvertibleTransformException ex) {
125
                                
126
                        }
127
                        viewRequest = new Extent(petInit.getX(), petInit.getY(), petEnd.getX(), petEnd.getY());
128
                } else
129
                        viewRequest = new Extent(e);
130
    }
131

    
132
    /**
133
     * Obtiene el Extent de la vista
134
     */
135
    public Extent getView() {
136
        return viewRequest;
137
    }
138

    
139
    /**
140
     * Obtiene el ancho de la imagen
141
     */
142
    public int getWidth() {
143
        return file.width;
144
    }
145

    
146
    /**
147
     * Obtiene el alto de la imagen
148
     */
149
    public int getHeight() {
150
        return file.height;
151
    }
152

    
153
    public void reProject(ICoordTrans rp) {
154
        // TODO Auto-generated method stub        
155
    }
156

    
157
    /**
158
     * Asigna al objeto Image los valores con los dato de la imagen contenidos en el
159
     * vector de enteros.
160
     * @param image        imagen con los datos actuales
161
     * @param startX        inicio de la posici?n en X dentro de la imagen
162
     * @param startY        inicio de la posici?n en X dentro de la imagen
163
     * @param w        Ancho de la imagen
164
     * @param h        Alto de la imagen
165
     * @param rgbArray        vector que contiene la banda que se va a sustituir
166
     * @param offset        desplazamiento
167
     * @param scansize        tama?o de imagen recorrida por cada p
168
     */
169
    protected void setRGBLine(BufferedImage image, int startX, int startY,
170
                              int w, int h, int[] rgbArray, int offset,
171
                              int scansize) {
172
        image.setRGB(startX, startY, w, h, rgbArray, offset, scansize);
173
    }
174

    
175
    /* (non-Javadoc)
176
     * @see org.cresques.io.GeoRasterFile#getData(int, int, int)
177
     */
178
    public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
179
            if(file != null){
180
                        if(x < 0 || y < 0 || x >= file.width || y >= file.height)
181
                                throw new InvalidSetViewException("Request out of grid");
182
                        Object[] data = file.getData(x, y);
183
                        return data[band];
184
                }
185
                throw new FileNotOpenException("GdalNative not exist");
186
    }
187
   
188
    /**
189
     * Devuelve el tama?o de bloque
190
     * @return Tama?o de bloque
191
     */
192
    public int getBlockSize() {
193
        return file.blocksize;
194
    }
195
    
196
         /**
197
         * Calcula la transformaci?n que se produce sobre la vista cuando la imagen tiene un fichero .rmf
198
         * asociado. En Gdal el origen de coordenadas en Y es el valor m?nimo y crece hasta el m?ximo. De la
199
         * misma forma calcula la matriz de transformaci?n de la cabecera del fichero o del world file asociado
200
         * @param originX Origen de la imagen en la coordenada X
201
         * @param originY Origen de la imagen en la coordenada Y
202
         */
203
        public void setExtentTransform(double originX, double originY, double psX, double psY) {                
204
                transformRMF.setToTranslation(originX, originY);
205
                transformRMF.scale(psX, psY);
206
                
207
                transformTFW.setToTranslation(file.esq.minX, file.esq.maxY);
208
                double pixSixeX = (file.esq.maxX - file.esq.minX) / file.width;
209
                double pixSixeY = (file.esq.minY - file.esq.maxY) / file.height;
210
                transformTFW.scale(pixSixeX, pixSixeY);
211
        }
212
    
213
    /**
214
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
215
         * el valor de esta variable cada vez que dibuja. 
216
         * @return true si se ha supersampleado y false si no se ha hecho.
217
         */
218
        public boolean isSupersampling() {
219
                return file.isSupersampling;
220
        }
221
        
222
        /*
223
         * (non-Javadoc)
224
         * @see org.gvsig.raster.dataset.RasterDataset#rasterToWorld(java.awt.geom.Point2D)
225
         */
226
        public Point2D rasterToWorld(Point2D pt) {
227
                return file.rasterToWorld(pt);
228
        }
229

    
230
        /*
231
         * (non-Javadoc)
232
         * @see org.gvsig.raster.dataset.RasterDataset#worldToRaster(java.awt.geom.Point2D)
233
         */
234
        public Point2D worldToRaster(Point2D pt) {
235
                return file.worldToRaster(pt);
236
        }
237

    
238
        /*
239
         * (non-Javadoc)
240
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.IBuffer, boolean)
241
         */
242
        public IBuffer getWindowRaster(double x, double y, double w, double h, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent) {
243
                int width = rasterBuf.getWidth();
244
                int height = rasterBuf.getHeight();
245
                                
246
                //Impedimos que los valores de ancho y alto de la im?gen sean menores que 1
247
        if (width <= 0) 
248
                width = 1;
249
        
250
        if (height <= 0) 
251
                height = 1;
252
        
253
        setView(new Extent(x, y, x + w, y - h));
254
                file.setView(viewRequest.minX(), viewRequest.maxY(), viewRequest.maxX(), viewRequest.minY(), width, height);
255
                
256
                int[] pRGBArray = new int[width * height];
257

    
258
        try {
259
                file.readScene(pRGBArray);
260
                int wBuf = rasterBuf.getWidth();
261
                for (int row = 0; row < rasterBuf.getHeight(); row++) {
262
                    for(int col = 0; col < wBuf; col ++) {
263
                            rasterBuf.setElem(row, col, 0, (byte)((pRGBArray[(row * wBuf) + col] & 0x00ff0000) >> 16));
264
                            rasterBuf.setElem(row, col, 1, (byte)((pRGBArray[(row * wBuf) + col] & 0x0000ff00) >> 8));
265
                            rasterBuf.setElem(row, col, 2, (byte)(pRGBArray[(row * wBuf) + col] & 0x000000ff));
266
                    }
267
                }
268
        } catch (Exception e) {
269
                e.printStackTrace();
270
        }
271
        return rasterBuf;
272
        }
273

    
274
        /*
275
         * (non-Javadoc)
276
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.IBuffer, boolean)
277
         */
278
        public IBuffer getWindowRaster(double minX, double minY, double maxX, double maxY, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent) {
279
                //Impedimos que los valores de ancho y alto de la im?gen sean menores que 1
280
        if (bufWidth <= 0) 
281
                bufWidth = 1;
282
        
283
        if (bufHeight <= 0) 
284
                bufHeight = 1;
285
        
286
        setView(new Extent(minX, maxY, maxX, minY));
287
                file.setView(viewRequest.minX(), viewRequest.maxY(), viewRequest.maxX(), viewRequest.minY(), bufWidth, bufHeight);
288
                                        
289
        int[] pRGBArray = new int[bufWidth * bufHeight];
290

    
291
        try {
292
                file.readScene(pRGBArray);
293
                int w = rasterBuf.getWidth();
294
                for (int row = 0; row < rasterBuf.getHeight(); row++) {
295
                    for(int col = 0; col < w; col ++) {
296
                            rasterBuf.setElem(row, col, 0, (byte)((pRGBArray[(row * w) + col] & 0x00ff0000) >> 16));
297
                            rasterBuf.setElem(row, col, 1, (byte)((pRGBArray[(row * w) + col] & 0x0000ff00) >> 8));
298
                            rasterBuf.setElem(row, col, 2, (byte)(pRGBArray[(row * w) + col] & 0x000000ff));
299
                    }
300
                }
301
        } catch (Exception e) {
302
                e.printStackTrace();
303
        }
304
        return rasterBuf;
305
        }
306

    
307
        public IBuffer getWindowRaster(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf) {
308
                //TODO: FUNCIONALIDAD: Acabar getWindowRaster MrSID
309
                return null;
310
        }
311

    
312
        public Object readBlock(int pos, int blockHeight) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
313
                if(pos < 0)
314
                        throw new InvalidSetViewException("Request out of grid");
315
                
316
                if((pos + blockHeight) > file.height)
317
                        blockHeight = Math.abs(file.height - pos);
318
                
319
                Point2D begin = rasterToWorld(new Point2D.Double(0, pos));
320
                Point2D end = rasterToWorld(new Point2D.Double(file.width, pos + blockHeight));
321
                
322
                //TODO: FUNCIONALIDAD: Acabar lectura de bloque MrSID
323
                
324
                return null;
325
        }
326

    
327
        /*
328
         * (non-Javadoc)
329
         * @see org.gvsig.raster.dataset.RasterDataset#readCompleteLine(int, int)
330
         */
331
        public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
332
                if(line > this.getHeight() || band > this.getBandCount())
333
                        throw new InvalidSetViewException("Request out of grid");
334
                
335
                try{
336
                        Point2D pt = rasterToWorld(new Point2D.Double(extent.minX(), line));
337
                        file.setView(extent.minX(), pt.getY(), extent.maxX(), pt.getY(), getWidth(), 1);
338
                        int[] pRGBArray = new int[getWidth()];
339
                        file.readScene(pRGBArray);
340
                        return pRGBArray;
341
                }catch(MrSIDException e){
342
                        throw new RasterDriverException("Error reading data from MrSID library");
343
                }
344
        }
345

    
346
        /*
347
         * (non-Javadoc)
348
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(int, int, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.IBuffer)
349
         */
350
        public IBuffer getWindowRaster(int x, int y, int w, int h, BandList bandList, IBuffer rasterBuf) {
351
                try {
352
                        file.readWindow(rasterBuf, bandList, x, y, w, h);
353
                } catch (Exception e) {
354
                        e.printStackTrace();
355
                        return null;
356
                }
357
                return rasterBuf;
358
        }
359
        
360
    /**
361
         * Obtiene el objeto que contiene el estado de la transparencia
362
         */
363
        public Transparency getTransparencyDatasetStatus() {
364
                if(fileTransparency == null)
365
                        fileTransparency = new Transparency();
366
                return fileTransparency;
367
        }
368
}