Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / dataset / RasterDataset.java @ 11065

History | View | Annotate | Download (29.1 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 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;
20

    
21
import java.awt.geom.AffineTransform;
22
import java.awt.geom.Point2D;
23
import java.io.BufferedReader;
24
import java.io.File;
25
import java.io.FileInputStream;
26
import java.io.FileNotFoundException;
27
import java.io.FileReader;
28
import java.io.IOException;
29
import java.lang.reflect.Constructor;
30
import java.lang.reflect.InvocationTargetException;
31

    
32
import org.cresques.cts.ICoordTrans;
33
import org.cresques.cts.IProjection;
34
import org.gvsig.i18n.Messages;
35
import org.gvsig.raster.dataset.io.GdalDriver;
36
import org.gvsig.raster.dataset.properties.DatasetColorInterpretation;
37
import org.gvsig.raster.dataset.properties.DatasetHistogram;
38
import org.gvsig.raster.dataset.properties.DatasetMetadata;
39
import org.gvsig.raster.dataset.properties.DatasetPalette;
40
import org.gvsig.raster.dataset.properties.DatasetStatistics;
41
import org.gvsig.raster.dataset.properties.DatasetTransparency;
42
import org.gvsig.raster.shared.Extent;
43
import org.gvsig.raster.util.extensionPoints.ExtensionPoint;
44
import org.gvsig.raster.util.extensionPoints.ExtensionPoints;
45
import org.gvsig.raster.util.extensionPoints.ExtensionPointsSingleton;
46
import org.kxml2.io.KXmlParser;
47
import org.xmlpull.v1.XmlPullParserException;
48

    
49
import es.gva.cit.jgdal.GdalException;
50

    
51
/**
52
 * Manejador de ficheros raster georeferenciados.
53
 * 
54
 * Esta clase abstracta es el ancestro de todas las clases que proporcionan
55
 * soporte para ficheros raster georeferenciados.<br>
56
 * Actua tambien como una 'Fabrica', ocultando al cliente la manera en que
57
 * se ha implementado ese manejo. Una clase nueva que soportara un nuevo
58
 * tipo de raster tendr?a que registrar su extensi?n o extensiones usando
59
 * el m?todo @see registerExtension.<br> 
60
 * @author "Luis W. Sevilla" <sevilla_lui@gva.es>*
61
 */
62

    
63
public abstract class RasterDataset extends GeoInfo {
64
        
65
        /**
66
         * Flag que representa a la banda del Rojo
67
         */
68
        public static final int                                 RED_BAND        = 0x01;
69
        
70
        /**
71
         * Flag que representa a la banda del Verde
72
         */
73
        public static final int                                 GREEN_BAND        = 0x02;
74
        
75
        /**
76
         * Flag que representa a la banda del Azul
77
         */
78
        public static final int                                 BLUE_BAND        = 0x04;
79
        private boolean                                                        verifySize = false;
80
        /**
81
         * Par?metros de transformaci?n del fichero .rmf. Esta ser? distinta
82
         * de la identidad si la funci?n rmfExists() devuelve true.
83
         */
84
        protected AffineTransform                                rmfTransform = new AffineTransform();
85
                        
86
        /**
87
         * Asignaci?n de banda del Rojo a una banda de la imagen
88
         */
89
        protected int                                                         rBandNr = 1;
90
        
91
        /**
92
         * Asignaci?n de banda del Verde a una banda de la imagen
93
         */
94
        protected int                                                         gBandNr = 1;
95
        
96
        /**
97
         * Asignaci?n de banda del Azul a una banda de la imagen
98
         */
99
        protected int                                                         bBandNr = 1;
100
        
101
        /**
102
         * N?mero de bandas de la imagen
103
         */
104
        protected int                                                         bandCount = 1;
105
        private int                                                         dataType = IBuffer.TYPE_BYTE;        
106

    
107
        /**
108
         * Par?metros de transformaci?n del fichero .rmf. Estas variables tendr?n valores distinto
109
         * de 0 si la funci?n rmfExists() devuelve true.
110
         */
111
        protected double                                                 imageWidth = 0D, imageHeight = 0D;
112
        protected DatasetStatistics                                stats = new DatasetStatistics(this);
113
        protected DatasetHistogram                                histogram = null;
114
        
115
        //TODO: ARQUITECTURA: Los drivers se registran siempre y cuando antes de hacer un openFile se haya llamado a XXDriver.class. Esto hay que revisarlo.
116
        
117
        static {
118
                Messages.addResourceFamily("org.cresques.translations.text", "org.cresques.ui");
119

    
120
                //Punto de extensi?n para registro de drivers
121
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
122
                if (!extensionPoints.containsKey("RasterDriver")) {
123
                        extensionPoints.put(
124
                                new ExtensionPoint(
125
                                        "RasterDriver",
126
                                        "Raster Drivers for gvSIG raster library")
127
                        );
128
                }
129
        }
130
        
131
        /**
132
         * Factoria para abrir distintos tipos de raster.
133
         * 
134
         * @param proj Proyecci?n en la que est? el raster.
135
         * @param fName Nombre del fichero.
136
         * @return GeoRasterFile, o null si hay problemas.
137
         */
138
        public static RasterDataset openFile(IProjection proj, String fName) throws NotSupportedExtensionException, RasterDriverException{
139
                String ext = fName.toLowerCase().substring(fName.lastIndexOf('.')+1);
140
                RasterDataset grf = null;
141

    
142
                Class clase = null;
143
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
144
                ExtensionPoint extensionPoint = (ExtensionPoint)extensionPoints.get("RasterDriver");
145
                if(extensionPoint == null)
146
                        return null;
147
                clase = (Class)extensionPoint.get(ext);
148
                                
149
                if(clase == null)
150
                        clase = GdalDriver.class;
151
                
152
                Class [] args = {IProjection.class, String.class};
153
                try {
154
                        Constructor hazNuevo = clase.getConstructor(args);
155
                        Object [] args2 = {proj, fName};
156
                        grf = (RasterDataset) hazNuevo.newInstance(args2);
157
                        grf.setFileSize(new File(fName).length());
158
                } catch (SecurityException e) {
159
                        throw new RasterDriverException("Error SecurityException in openFile");
160
                } catch (NoSuchMethodException e) {
161
                        throw new RasterDriverException("Error NoSuchMethodException in openFile");
162
                } catch (IllegalArgumentException e) {
163
                        throw new RasterDriverException("Error IllegalArgumentException in openFile");
164
                } catch (InstantiationException e) {
165
                        throw new RasterDriverException("Error InstantiationException in openFile");
166
                } catch (IllegalAccessException e) {
167
                        throw new RasterDriverException("Error IllegalAccessException in openFile");
168
                } catch (InvocationTargetException e) {
169
                        throw new NotSupportedExtensionException("Error in openFile");
170
                }
171
                return grf;
172
        }
173
                
174
        /**
175
         * Tipo de fichero soportado.
176
         * Devuelve true si el tipo de fichero (extension) est? soportado, si no
177
         * devuelve false.
178
         * 
179
         * @param fName Fichero raster
180
         * @return  true si est? soportado, si no false.
181
          */
182
        public static boolean fileIsSupported(String fName) {
183
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
184
                ExtensionPoint extensionPoint = (ExtensionPoint)extensionPoints.get("RasterDriver");
185
                return (extensionPoint.get(fName.substring(fName.lastIndexOf(".") + 1, fName.length())) == null) ? false : true;
186
        }
187
        
188
        /**
189
         * Constructor
190
         * @param proj        Proyecci?n
191
         * @param name        Nombre del fichero de imagen.
192
         */
193
        public RasterDataset(IProjection proj, String name) {
194
                super(proj, name);
195
        }
196
        
197
        /**
198
         * Carga un fichero raster. Puede usarse para calcular el extent e instanciar 
199
         * un objeto de este tipo.
200
         */
201
        abstract public GeoInfo load();
202
        
203
        /**
204
         * Cierra el fichero y libera los recursos.
205
         */
206
        abstract public void close();
207
        
208
        /**
209
         * Obtiene la codificaci?n del fichero XML
210
         * @param file Nombre del fichero XML
211
         * @return Codificaci?n
212
         */
213
        private String readFileEncoding(String file){
214
                FileReader fr;
215
                String encoding = null;
216
                try
217
            {
218
                        fr = new FileReader(file);
219
                    BufferedReader br = new BufferedReader(fr);
220
                    char[] buffer = new char[100];
221
                    br.read(buffer);
222
                    StringBuffer st = new StringBuffer(new String(buffer));
223
                    String searchText = "encoding=\"";
224
                    int index = st.indexOf(searchText);
225
                    if (index>-1) {
226
                            st.delete(0, index+searchText.length());
227
                            encoding = st.substring(0, st.indexOf("\""));
228
                    }
229
                    fr.close();
230
            } catch(FileNotFoundException ex)        {
231
                    ex.printStackTrace();
232
            } catch (IOException e) {
233
                        e.printStackTrace();
234
                }
235
            return encoding;
236
        }
237
        
238
        private double[] parserExtent(KXmlParser parser) throws XmlPullParserException, IOException {                
239
                double originX = 0D, originY = 0D, w = 0D, h = 0D;
240
                double pixelSizeX = 0D, pixelSizeY = 0D;
241
                double shearX = 0D, shearY = 0D;
242
                
243
                boolean end = false;
244
            int tag = parser.next();
245
            while (!end) {
246
                    switch(tag) {
247
                        case KXmlParser.START_TAG:
248
                                if(parser.getName() != null){        
249
                                                if (parser.getName().equals(RasterMetaFileTags.POSX)){
250
                                                        originX = Double.parseDouble(parser.nextText());
251
                                                }else if (parser.getName().equals(RasterMetaFileTags.POSY)){
252
                                                        originY = Double.parseDouble(parser.nextText());
253
                                                }else if (parser.getName().equals(RasterMetaFileTags.PX_SIZE_X)){
254
                                                        pixelSizeX = Double.parseDouble(parser.nextText());
255
                                                }else if (parser.getName().equals(RasterMetaFileTags.PX_SIZE_Y)){
256
                                                        pixelSizeY = Double.parseDouble(parser.nextText());
257
                                                }else if (parser.getName().equals(RasterMetaFileTags.ROTX)){
258
                                                        shearX = Double.parseDouble(parser.nextText());
259
                                                }else if (parser.getName().equals(RasterMetaFileTags.ROTY)){
260
                                                        shearY = Double.parseDouble(parser.nextText());
261
                                                }else if (parser.getName().equals(RasterMetaFileTags.WIDTH)){
262
                                                        w = Double.parseDouble(parser.nextText());
263
                                                }else if (parser.getName().equals(RasterMetaFileTags.HEIGHT)){
264
                                                        h = Double.parseDouble(parser.nextText());
265
                                                }
266
                                        }                                
267
                                        break;
268
                         case KXmlParser.END_TAG:
269
                                 if (parser.getName().equals(RasterMetaFileTags.BBOX))
270
                                         end = true;
271
                                break;
272
                        case KXmlParser.TEXT:
273
                                break;
274
                    }
275
                    tag = parser.next();
276
            }
277
                
278
            double[] values = {originX, originY, w, h, pixelSizeX, pixelSizeY, shearX, shearY};
279
                return values;
280
        }
281
        
282
        /**
283
         * Obtiene la informaci?n de georreferenciaci?n asociada a la imagen en un fichero .rmf. Esta 
284
         * georreferenciaci?n tiene la caracteristica de que tiene prioridad sobre la de la imagen.
285
         * Es almacenada en la clase GeoFile en la variable virtualExtent.
286
         * @param file Fichero de metadatos .rmf
287
         */
288
        protected void readGeoInfo(String file){
289
                String rmf = file.substring(0, file.lastIndexOf(".") + 1) + "rmf";
290
                File rmfFile = new File(rmf);
291
                if(!rmfFile.exists())
292
                        return;
293
                
294
                boolean georefOk = false;
295
                
296
                FileReader fr = null;
297
                String v = null;
298
                try {
299
                        fr = new FileReader(rmf);
300
                        KXmlParser parser = new KXmlParser();
301
                        parser.setInput(new FileInputStream(rmf), readFileEncoding(rmf));
302
                        int tag = parser.nextTag();
303
                        if ( parser.getEventType() != KXmlParser.END_DOCUMENT ){                    
304
                                parser.require(KXmlParser.START_TAG, null, RasterMetaFileTags.MAIN_TAG);                            
305
                                while(tag != KXmlParser.END_DOCUMENT) {
306
                                        switch(tag) {
307
                                                case KXmlParser.START_TAG:
308
                                                        if (parser.getName().equals(RasterMetaFileTags.LAYER)) {
309
                                                                int layerListTag = parser.next();
310
                                                                boolean geoRefEnd = false;
311
                                                                while (!geoRefEnd){
312
                                                                        if(parser.getName() != null){
313
                                                                                if (parser.getName().equals(RasterMetaFileTags.PROJ)){
314
                                                                                        //System.out.println("PROJ:"+parser.nextText());
315
                                                                                } else if (parser.getName().equals(RasterMetaFileTags.BBOX)){
316
                                                                                        double[] values = parserExtent(parser);
317
                                                                                        rmfTransform = new AffineTransform(        values[4], values[7],
318
                                                                                                                                           values[6], values[5],
319
                                                                                                                                                                   values[0], values[1]);
320
                                                                                        georefOk = true;
321
                                                                                } else if (parser.getName().equals(RasterMetaFileTags.DIM)){
322
                                                                                        boolean DimEnd = false;
323
                                                                                        while (!DimEnd){
324
                                                                                                layerListTag = parser.next();
325
                                                                                                if(parser.getName() != null){        
326
                                                                                                        if (parser.getName().equals(RasterMetaFileTags.PX_WIDTH)){
327
                                                                                                                imageWidth = Double.parseDouble(parser.nextText());
328
                                                                                                        }else if (parser.getName().equals(RasterMetaFileTags.PX_HEIGHT)){
329
                                                                                                                imageHeight = Double.parseDouble(parser.nextText());
330
                                                                                                                DimEnd = true;
331
                                                                                                        }                                                                                                        
332
                                                                                                }
333
                                                                                        }
334
                                                                                        geoRefEnd = true;
335
                                                                                }
336
                                                                        }
337
                                                                        layerListTag = parser.next();
338
                                                                }
339
                                                        }
340
                                                        break;
341
                                                case KXmlParser.END_TAG:                                                        
342
                                                        break;
343
                                                case KXmlParser.TEXT:                                                        
344
                                                        break;
345
                                        }
346
                                        tag = parser.next();
347
                                }
348
                                parser.require(KXmlParser.END_DOCUMENT, null, null);
349
                        }
350
                        
351
                        if(georefOk){
352
                                rmfExists = true;
353
                                setExtentTransform(        rmfTransform.getTranslateX(), rmfTransform.getTranslateY(), 
354
                                                                        rmfTransform.getScaleX(), rmfTransform.getScaleY());
355
                                createExtentsFromRMF(        rmfTransform.getTranslateX(), rmfTransform.getTranslateY(), 
356
                                                                                rmfTransform.getScaleX(), rmfTransform.getScaleY(), 
357
                                                                                imageWidth, imageHeight, 
358
                                                                                rmfTransform.getShearX(), rmfTransform.getShearY());
359
                        }
360
                        
361
                } catch (FileNotFoundException fnfEx) {
362
                } catch (XmlPullParserException xmlEx) {
363
                        xmlEx.printStackTrace();
364
                } catch (IOException e) {
365
                } 
366
                try{
367
                        if(fr != null)
368
                                fr.close();
369
                }catch(IOException ioEx){
370
                        //No est? abierto el fichero por lo que no hacemos nada
371
                }
372
        }
373

    
374
        /**
375
         * Asigna una transformaci?n al raster para que se tenga en cuenta en la asignaci?n del setView. 
376
         * Esta asignaci?n recalcula el extent, el requestExtent y asigna el AffineTransform que se 
377
         * usar? para la transformaci?n. Esta transformaci?n ser? considerada como si la imagen tuviera 
378
         * asociado un rmf.
379
         * @param t Transformaci?n af?n a aplicar
380
         */
381
        public void setAffineTransform(AffineTransform t){
382
                rmfExists = true;
383
                rmfTransform = (AffineTransform)t.clone();
384
                setExtentTransform(t.getTranslateX(), t.getTranslateY(), t.getScaleX(), t.getScaleY());
385
                createExtentsFromRMF(        t.getTranslateX(), t.getTranslateY(), t.getScaleX(), t.getScaleY(), 
386
                                                                this.getWidth(), this.getHeight(), 
387
                                                                t.getShearX(), t.getShearY());
388
        }
389
        
390
        /**
391
         * Asigna una transformaci?n al raster para que se tenga en cuenta en la asignaci?n del setView. 
392
         * Esta asignaci?n recalcula el extent, el requestExtent y asigna el AffineTransform que se 
393
         * usar? para la transformaci?n. Esta transformaci?n ser? considerada como si la imagen tuviera 
394
         * asociado un rmf.
395
         * @param originX Coordenada X de origen del raster
396
         * @param originY Coordenada Y de origen del raster
397
         * @param pixelSizeX Tama?o de pixel en X
398
         * @param pixelSizeY Tama?o de pixel en Y
399
         * @param imageWidth Ancho del raster en pixels
400
         * @param imageHeight Alto del raster en pixels
401
         * @param shearX Shearing en X
402
         * @param shearY Shearing en Y
403
         */
404
        public void setAffineTransform(        double originX, double originY, double pixelSizeX, 
405
                                                                                double pixelSizeY, double shearX, double shearY){
406
                rmfExists = true;
407
                rmfTransform.setToTranslation(originX, originY);
408
                rmfTransform.shear(shearX, shearY);
409
                rmfTransform.scale(pixelSizeX, pixelSizeY);
410
                setExtentTransform(originX, originY, pixelSizeX, pixelSizeY);
411
                createExtentsFromRMF(        originX, originY, pixelSizeX, pixelSizeY, 
412
                                                                imageWidth, imageHeight, shearX, shearY);
413
        }
414
        
415
        /**
416
         * Obtiene la matriz de transformaci?n que se aplica sobre la visualizaci?n 
417
         * del raster.
418
         * @return Matriz de transformaci?n.
419
         */
420
        public AffineTransform getAffineTransform(){
421
                return rmfTransform;
422
        }
423
        
424
        /**
425
         * Elimina la matriz de transformaci?n asociada al raster y que se tiene en cuenta para
426
         * el setView. Este reseteo tendr? en cuenta que si el raster tiene asociado un rmf
427
         * esta transformaci?n no ser? eliminada sino que se asignar? la correspondiente al rmf
428
         * existente.  
429
         * @return devuelve true si tiene fichero rmf asociado y false si no lo tiene.
430
         */
431
        public boolean resetAffineTransform(){
432
                rmfExists = false;
433
                rmfTransform.setToIdentity();
434
                
435
                //Crea los extent iniciales
436
                load();
437
                
438
                //Lee y carga el rmf si existe
439
                readGeoInfo(this.getFName());
440
                
441
                if(rmfExists)
442
                        return true;
443
                else
444
                        return false;
445
        }
446
        
447
        /**
448
         * <P>
449
         * Calcula el extent de la imagen a partir del fichero rmf con y sin rotaci?n. El extent con rotaci?n corresponde
450
         * a la variable extent que contiene el extent verdadero marcado por el fichero de georreferenciaci?n .rmf. El extent
451
         * sin rotaci?n requestExtent es utilizado para realizar la petici?n ya que la petici?n al driver no se puede
452
         * hacer con coordenadas rotadas.
453
         * 
454
         * El calculo de la bounding box rotada lo hace con los valores de transformaci?n leidos desde el fichero .rmf.
455
         * </p>
456
         * <P>
457
         * Para el calculo de una esquina aplicamos la formula siguiente:<BR>
458
         * PtoX = originX + pixelSizeX * x + shearX * y;<BR>
459
         * PtoY = originY + shearY * x + pixelSizeY * y;<BR>
460
         * Aplicandolo a las cuatro esquinas sustituimos en cada una de ellas por.
461
         * </P>
462
         * <UL> 
463
         * <LI>Esquina superior izquierda: x = 0; y = 0;</LI>
464
         * <LI>Esquina superior derecha: x = MaxX; y = 0;</LI>
465
         * <LI>Esquina inferior izquierda: x = 0; y = MaxY;</LI>
466
         * <LI>Esquina inferior derecha: x = MaxX; y = MaxY;</LI>
467
         * </UL> 
468
         * <P>
469
         * quedandonos en los cuatro casos:
470
         * </P>
471
         * <UL> 
472
         * <LI>Esquina superior izquierda: originX; originY;</LI>
473
         * <LI>Esquina superior derecha: PtoX = originX + pixelSizeX * x; PtoY = originY + shearY * x;</LI>
474
         * <LI>Esquina inferior izquierda:  PtoX = originX + shearX * y; PtoY = originY + pixelSizeY * y;</LI>
475
         * <LI>Esquina inferior derecha: PtoX = originX + pixelSizeX * x + shearX * y; PtoY = originY + shearY * x + pixelSizeY * y;</LI>
476
         * </UL>
477
         * 
478
         * <P>
479
         * El calculo de la bounding box se realizar? de la misma forma pero anulando los parametros de shearing.
480
         * </P>
481
         * 
482
         * @param originX Coordenada X de origen del raster
483
         * @param originY Coordenada Y de origen del raster
484
         * @param pixelSizeX Tama?o de pixel en X
485
         * @param pixelSizeY Tama?o de pixel en Y
486
         * @param imageWidth Ancho del raster en pixels
487
         * @param imageHeight Alto del raster en pixels
488
         * @param shearX Shearing en X
489
         * @param shearY Shearing en Y
490
         */
491
        private void createExtentsFromRMF(        double originX, double originY, double pixelSizeX, double pixelSizeY, 
492
                                                                                double imageWidth, double imageHeight, double shearX, double shearY){
493
                                
494
                Point2D p1 = new Point2D.Double(originX, originY);
495
                Point2D p2 = new Point2D.Double(originX + shearX * imageHeight, originY + pixelSizeY * imageHeight);
496
                Point2D p3 = new Point2D.Double(originX + pixelSizeX * imageWidth, originY + shearY * imageWidth);
497
                Point2D p4 = new Point2D.Double(originX + pixelSizeX * imageWidth + shearX * imageHeight, originY + pixelSizeY * imageHeight + shearY * imageWidth);
498
                
499
                double minX = Math.min(Math.min(p1.getX(), p2.getX()), Math.min(p3.getX(), p4.getX()));
500
                double minY = Math.min(Math.min(p1.getY(), p2.getY()), Math.min(p3.getY(), p4.getY()));
501
                double maxX = Math.max(Math.max(p1.getX(), p2.getX()), Math.max(p3.getX(), p4.getX()));
502
                double maxY = Math.max(Math.max(p1.getY(), p2.getY()), Math.max(p3.getY(), p4.getY()));
503
                extent = new Extent(minX, minY, maxX, maxY);
504
                requestExtent = new Extent(originX, originY, originX + (pixelSizeX * imageWidth), originY + (pixelSizeY * imageHeight));
505
        }
506
        
507
        /**
508
         * Calcula la transformaci?n que se produce sobre la vista cuando la imagen tiene un fichero .rmf
509
         * asociado. Esta transformaci?n tiene diferencias entre los distintos formatos por lo que debe calcularla
510
         * el driver correspondiente.
511
         * @param originX Origen de la imagen en la coordenada X
512
         * @param originY Origen de la imagen en la coordenada Y
513
         */
514
        abstract public void setExtentTransform(double originX, double originY, double psX, double psY);
515
                        
516
        /**
517
         * Obtiene el ancho de la imagen
518
         * @return Ancho de la imagen
519
         */
520
        abstract public int getWidth();
521
        
522
        /**
523
         * Obtiene el ancho de la imagen
524
         * @return Ancho de la imagen
525
         */
526
        abstract public int getHeight();
527

    
528
        /**
529
         * Reproyecci?n.
530
         * @param rp        Coordenadas de la transformaci?n
531
         */
532
        abstract public void reProject(ICoordTrans rp);
533

    
534
        /**
535
         * Asigna un nuevo Extent 
536
         * @param e        Extent
537
         */
538
        abstract public void setView(Extent e);
539
        
540
        /**
541
         * Obtiene el extent asignado
542
         * @return        Extent
543
         */
544
        abstract public Extent getView();
545
                                
546
        /**
547
         * Obtiene el valor del raster en la coordenada que se le pasa.
548
         * El valor ser? Double, Int, Byte, etc. dependiendo del tipo de
549
         * raster.
550
         * @param x        coordenada X
551
         * @param y coordenada Y
552
         * @return
553
         */
554
        abstract public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException;
555

    
556
        /**
557
         * Obtiene el n?nero de bandas del fichero
558
         * @return Entero que representa el n?mero de bandas
559
         */
560
        public int getBandCount() { 
561
                return bandCount; 
562
        }
563
                
564
        /**
565
         * @return Returns the dataType.
566
         */
567
        public int getDataType() {
568
                return dataType;
569
        }
570
        
571
        /**
572
         * @param dataType The dataType to set.
573
         */
574
        public void setDataType(int dataType) {
575
                this.dataType = dataType;
576
        }
577
   
578
        /**
579
         * Cosulta si hay que verificar la relaci?n de aspecto de la imagen, es decir comprueba que el ancho/alto
580
         * pasados a updateImage coinciden con el ancho/alto solicitado en setView a la imagen
581
         * @return true si est? verificando la relaci?n de aspecto. 
582
         */
583
        public boolean mustVerifySize() {
584
                return verifySize;
585
        }
586

    
587
        /**
588
         * Asigna el flag que dice si hay que verificar la relaci?n de aspecto de la imagen, es decir 
589
         * comprueba que el ancho/alto pasados a updateImage coinciden con el ancho/alto solicitado 
590
         * en setView a la imagen.
591
         * @return true si est? verificando la relaci?n de aspecto. 
592
         */
593
        public void setMustVerifySize(boolean verifySize) {
594
                this.verifySize = verifySize;
595
        }
596

    
597
        /**
598
         * Obtiene una ventana de datos de la imagen a partir de coordenadas reales. 
599
         * No aplica supersampleo ni subsampleo sino que devuelve una matriz de igual tama?o a los
600
         * pixeles de disco. 
601
         * @param x Posici?n X superior izquierda
602
         * @param y Posici?n Y superior izquierda
603
         * @param w Ancho en coordenadas reales
604
         * @param h Alto en coordenadas reales
605
         * @param rasterBuf        Buffer de datos
606
         * @param bandList
607
         * @param adjustToExtent Flag que dice si el extent solicitado debe ajustarse al extent del raster o no.
608
         * @return Buffer de datos
609
         */
610
        abstract public IBuffer getWindowRaster(double x, double y, double w, double h, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent);
611
        
612
        /**
613
         * Obtiene una ventana de datos de la imagen a partir de coordenadas reales. 
614
         * Se aplica supersampleo o subsampleo dependiendo del tama?o del buffer especificado.
615
         * 
616
         * @param minX Posici?n m?nima X superior izquierda
617
         * @param minY Posici?n m?nima Y superior izquierda
618
         * @param maxX Posici?n m?xima X inferior derecha
619
         * @param maxY Posici?n m?xima Y inferior derecha
620
         * @param bufWidth Ancho del buffer de datos
621
         * @param bufHeight Alto del buffer de datos
622
         * @param rasterBuf        Buffer de datos
623
         * @param adjustToExtent Flag que dice si el extent solicitado debe ajustarse al extent del raster o no.
624
         * @param bandList
625
         * @return Buffer de datos
626
         */
627
        abstract public IBuffer getWindowRaster(double minX, double minY, double maxX, double maxY, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf, boolean adjustToExtent);
628
        
629
        /**
630
         * Obtiene una ventana de datos de la imagen a partir de coordenadas pixel. 
631
         * No aplica supersampleo ni subsampleo sino que devuelve una matriz de igual tama?o a los
632
         * pixeles de disco. 
633
         * @param x Posici?n X superior izquierda
634
         * @param y Posici?n Y superior izquierda
635
         * @param w Ancho en coordenadas reales
636
         * @param h Alto en coordenadas reales
637
         * @param rasterBuf        Buffer de datos
638
         * @param bandList
639
         * @return Buffer de datos
640
         */
641
        abstract public IBuffer getWindowRaster(int x, int y, int w, int h, BandList bandList, IBuffer rasterBuf);
642
        
643
        /**
644
         * Obtiene una ventana de datos de la imagen a partir de coordenadas pixel. 
645
         * Se aplica supersampleo o subsampleo dependiendo del tama?o del buffer especificado.
646
         * 
647
         * @param x Posici?n X superior izquierda
648
         * @param y Posici?n Y superior izquierda
649
         * @param w Ancho en coordenadas reales
650
         * @param h Alto en coordenadas reales
651
         * @param bufWidth Ancho del buffer de datos
652
         * @param bufHeight Alto del buffer de datos
653
         * @param rasterBuf        Buffer de datos
654
         * @param bandList
655
         * @return Buffer de datos
656
         */
657
        abstract public IBuffer getWindowRaster(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, IBuffer rasterBuf);
658
        
659
        abstract public int getBlockSize();
660
        
661
        /**
662
         * Obtiene el objeto que contiene los metadatos. Este m?todo debe ser redefinido por los
663
         * drivers si necesitan devolver metadatos. 
664
         * @return
665
         */
666
        public DatasetMetadata getMetadata(){
667
                return null;
668
        }
669
        
670
        /**
671
         * Obtiene el objeto que contiene que contiene la interpretaci?n de 
672
         * color por banda
673
         * @return
674
         */
675
        public DatasetColorInterpretation getColorInterpretation(){
676
                return null;
677
        }
678
        
679
        /**
680
         * Asigna un extent temporal que puede coincidir con el de la vista. Esto es 
681
         * util para cargar imagenes sin georreferenciar ya que podemos asignar el extent
682
         * que queramos para ajustarnos a una vista concreta
683
         * @param tempExtent The tempExtent to set.
684
         */
685
        public void setExtent(Extent ext) {
686
                this.extent = ext;
687
        }
688
        
689
        /**
690
         * Dice si el fichero tiene georreferenciaci?n o no.
691
         * @return true si tiene georreferenciaci?n y false si no la tiene
692
         */
693
        public boolean isGeoreferenced(){
694
                return true;
695
        }
696

    
697
        /**
698
         * Obtiene el objeto paleta. Esta paleta es la que tiene adjunta el fichero de disco. Si es
699
         * null este objeto quiere decir que no tiene paleta para su visualizaci?n. 
700
         * @return Palette
701
         */
702
        public DatasetPalette getPalette() {
703
                return null;
704
        }
705
        
706
        /**
707
         * M?todo que indica si existe un fichero .rmf asociado al GeoRasterFile.
708
         * @return
709
         */
710
        public boolean rmfExists(){
711
                return this.rmfExists;
712
        }
713
                
714
        /**
715
         * Obtiene los par?metros de la transformaci?n af?n que corresponde con los elementos de
716
         * un fichero tfw.
717
         * <UL> 
718
         * <LI>[1]tama?o de pixel en X</LI>
719
         * <LI>[2]rotaci?n en X</LI>
720
         * <LI>[4]rotaci?n en Y</LI>
721
         * <LI>[5]tama?o de pixel en Y</LI>
722
         * <LI>[0]origen en X</LI>
723
         * <LI>[3]origen en Y</LI>
724
         * </UL>
725
         * Este m?todo debe ser reimplementado por el driver si tiene esta informaci?n. En principio
726
         * Gdal es capaz de proporcionarla de esta forma.
727
         * @return vector de double con los elementos de la transformaci?n af?n.
728
         */
729
        public double[] getTransform(){
730
                return null;
731
        }
732

    
733
        /**
734
         * Obtiene el estado de transparencia de un GeoRasterFile. 
735
         * @return Objeto TransparencyFileStatus
736
         */
737
        public DatasetTransparency getTransparencyDatasetStatus() {
738
                return null;
739
        }
740
        
741
        /**
742
         * Dado unas coordenadas reales, un tama?o de buffer y un tama?o de raster. 
743
         * Si el buffer es de mayor tama?o que el raster (supersampleo) quiere decir que 
744
         * por cada pixel de buffer se repiten varios del raster. Esta funci?n calcula el 
745
         * n?mero de pixels de desplazamiento en X e Y que corresponden al primer pixel del
746
         * buffer en la esquina superior izquierda. Esto es necesario porque la coordenada
747
         * solicitada es real y puede no caer sobre un pixel completo. Este calculo es
748
         * util cuando un cliente quiere supersamplear sobre un buffer y que no se lo haga
749
         * el driver autom?ticamente.
750
         * @param dWorldTLX Coordenada real X superior izquierda
751
         * @param dWorldTLY Coordenada real Y superior izquierda
752
         * @param dWorldBRX Coordenada real X inferior derecha
753
         * @param dWorldBRY Coordenada real Y inferior derecha
754
         * @param nWidth Ancho del raster
755
         * @param nHeight Alto del raster
756
         * @param bufWidth Ancho del buffer
757
         * @param bufHeight Alto del buffer
758
         * @return Array de dos elementos con el desplazamiento en X e Y. 
759
         */
760
        public int[] calcSteps(double dWorldTLX, double dWorldTLY, double dWorldBRX, double dWorldBRY, 
761
                        double nWidth, double nHeight, int bufWidth, int bufHeight){
762
                Point2D tl = worldToRaster(new Point2D.Double(dWorldTLX, dWorldTLY));
763
                Point2D br = worldToRaster(new Point2D.Double(dWorldBRX, dWorldBRY));
764
                                
765
        int x = (int) tl.getX();
766
        int y = (int) tl.getY();
767

    
768
                int stpX = (int)(((tl.getX() - x) * bufWidth) / Math.abs(br.getX() - tl.getX()));
769
                int stpY = (int)(((tl.getY() - y) * bufHeight) / Math.abs(br.getY() - tl.getY()));
770
                
771
                return new int[]{stpX, stpY};
772
        }
773
        
774
        /**
775
         * Lee una l?nea completa del raster y devuelve un array del tipo correcto. Esta funci?n es util
776
         * para una lectura rapida de todo el fichero sin necesidad de asignar vista. 
777
         * @param nLine N?mero de l?nea a leer
778
         * @param band Banda requerida
779
         * @return Object que es un array unidimendional del tipo de datos del raster
780
         * @throws GdalException
781
         */
782
        abstract public Object readCompleteLine(int line, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException;
783
        
784
        /**
785
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
786
         * @param pt Punto a transformar
787
         * @return punto transformado en coordenadas del mundo
788
         */
789
        abstract public Point2D rasterToWorld(Point2D pt);
790
        
791
        /**
792
         * Convierte un punto desde del mundo a coordenadas pixel.
793
         * @param pt Punto a transformar
794
         * @return punto transformado en coordenadas pixel
795
         */
796
        abstract public Point2D worldToRaster(Point2D pt);
797

    
798
        /**
799
         * Obtiene las estadisticas asociadas al fichero
800
         * @return Objeto con las estadisticas
801
         */
802
        public DatasetStatistics getStatistics() {
803
                return stats;
804
        }
805
        
806
        /**
807
         * Obtiene el histograma asociado al dataset. Este puede ser obtenido 
808
         * completo o seg?n una lista de clases pasada.
809
         * 
810
         * @return Histograma asociado al dataset.
811
         */
812
        public DatasetHistogram getHistogram(){
813
                if(histogram == null)
814
                        histogram = new DatasetHistogram(this);
815
                return histogram;
816
        }
817
        
818
        public void resetPercent() {
819
                if (histogram != null)
820
                        histogram.resetPercent();
821
        }
822
        public int getPercent() {
823
                if (histogram != null)
824
                        return histogram.getPercent();
825
                return 0;
826
        }
827
}