Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libRaster / src / org / gvsig / raster / dataset / BandList.java @ 29535

History | View | Annotate | Download (10.2 KB)

1 10939 nacho
/* 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.util.ArrayList;
22
23
/**
24
 * Esta clase gestiona una lista de bandas que puede pertenecer
25 12151 nacho
 * a un fichero (la tiene un Dataset) o puede ser una lista
26
 * de bandas de multiples ficheros (la tiene un MultiRasterDataset). Las bandas son
27
 * almacenadas en un array donde la posici?n en este es el n?mero de banda.
28 10939 nacho
 * @author Nacho Brodin (nachobrodin@gmail.com)
29
 *
30
 */
31
public class BandList {
32
        //Band array
33
        private ArrayList bands = new ArrayList();
34
        private int[]        drawableBands = null;
35
36 11413 nacho
        /*
37
         *  (non-Javadoc)
38
         * @see java.lang.Object#clone()
39
         */
40
        public Object clone() {
41
                BandList result = new BandList();
42
43
                ArrayList b = new ArrayList();
44
                for (int i = 0; i < bands.size(); i++)
45
                        b.add(((Band)bands.get(i)).clone());
46
                result.setBandArray(bands);
47
48
                if(drawableBands != null) {
49
                        int[] drawBands = new int[drawableBands.length];
50
                        for (int i = 0; i < drawableBands.length; i++)
51
                                drawBands[i] = drawableBands[i];
52 12151 nacho
                        result.setDrawableBands(drawableBands);
53 11413 nacho
                }
54
55
                return result;
56
        }
57
58 10939 nacho
        /**
59
         * Asigna el ?ltimo array de bandas a escribir solicitadas.
60
         * @param drawableBands
61
         */
62 12151 nacho
        public void setDrawableBands(int[] drawableBands) {
63 10939 nacho
                this.drawableBands = drawableBands;
64
        }
65
66
        /**
67 11413 nacho
         * Asigna el array de bandas
68
         * @param bands
69
         */
70
        public void setBandArray(ArrayList bands) {
71
                this.bands = bands;
72
        }
73
74
        /**
75 10939 nacho
         * Obtiene el ?ltimo array de bandas a escribir solicitadas.
76
         * @return
77
         */
78 12151 nacho
        public int[] getDrawableBands() {
79
                return drawableBands;
80 10939 nacho
        }
81
82
        /**
83
         * Encuentra una banda en la lista.
84
         * @param file Fichero al que pertenece la banda buscada.
85
         * @param pos Posici?n que ocupa en el fichero.
86
         * @return true si se ha hallado la banda y false si no se
87
         * ha encontrado
88
         */
89 12151 nacho
        public boolean findBand(Band band) {
90
                for(int i = 0; i < bands.size(); i++) {
91 10939 nacho
                        Band b = (Band)bands.get(i);
92
                        if(        b.getFileName().equals(band.getFileName()) &&
93
                                b.getPosition() == band.getPosition())
94
                                return true;
95
                }
96
                return false;
97
        }
98
99
        /**
100
         * Obtiene la lista de bandas a pintar sobre el buffer de
101
         * salida en forma de array. Cada elemento del array es una banda
102
         * del RasterBuf de salida que ha de dibujarse y el valor que contiene
103
         * ese elemento es la banda de la imagen que va pintada en esa banda
104
         * del RasterBuf.
105
         * <table border=1>
106
         * <tr><td>Elem</td><td>Valor</td></tr>
107
         * <tr><td>0</td><td>1</td></tr>
108
         * <tr><td>1</td><td>0</td></tr>
109
         * <tr><td>2</td><td>-1</td></tr>
110
         * <tr><td>3</td><td>0</td></tr>
111
         * <tr><td>4</td><td>2</td></tr>
112
         * </table>
113
         * El RasterBuf tendra en la banda 0 dibujada la banda 1 de este GeoRasterFile,
114
         * en la banda 1 la 0 del dataset, en la banda 2 no habr? ninguna de este dataset,
115
         * en la 3 la 0 y en la 4 la 2 de este GeoRasterFile.
116
         * @return lista de bandas a dibujar o un array de un elemento con valor -1.
117
         */
118
        public int[] bandsToDrawList(int nBandsDataImage){
119
120
                int[] bandsToRead = new int[nBandsDataImage];
121 12151 nacho
                for(int dataImageBand = 0;dataImageBand < nBandsDataImage;dataImageBand++) {
122 10939 nacho
                        bandsToRead[dataImageBand] = -1;
123 12151 nacho
                        for(int band = 0;band < bands.size();band++) {
124 10939 nacho
                                if(        ((Band)bands.get(band)) != null &&
125 12151 nacho
                                        ((Band)bands.get(band)).getBufferBandListToDraw() != null) {
126
                                        for(int dest=0;dest<((Band)bands.get(band)).getBufferBandListToDraw().length;dest++){
127
                                                if(dataImageBand == ((Band)bands.get(band)).getBufferBandListToDraw()[dest])
128 10939 nacho
                                                        bandsToRead[dataImageBand] = band;
129
                                        }
130
                                }
131
                        }
132
                }
133
134
                return bandsToRead;
135
        }
136
137
        /**
138
         * Checkea si alguna banda de la lista se est?a dibujando en el buffer de salida.
139
         * @return        true si alguna banda se est? dibujando y false si no
140
         */
141
        public boolean isDrawingAnyBand(){
142
                for(int band = 0;band < bands.size();band++){
143
                        if(((Band)bands.get(band)).isDrawing())
144
                                return true;
145
                }
146
                return false;
147
        }
148
149
        //******************************
150
        //Setters and Getters
151
        //******************************
152
153
        /**
154
         * A?ade una banda a la lista.
155
         * @param b banda a a?adir.
156
         */
157 11396 nacho
        public void addBand(Band b, int pos)throws BandNotFoundInListException{
158 10939 nacho
                bands.add(b);
159
        }
160
161
        /**
162
         * A?ade la lista de bandas pasada por par?metro a la lista
163
         * actual. Si alguna banda ya existe no la a?ade y continua.
164
         * @param bl Lista de bandas
165
         */
166
        public void addBandList(BandList bl){
167
                for(int i = 0; i < bl.getBandCount(); i++){
168
                        if(!findBand(bl.getBand(i)))
169
                                bands.add(bl.getBand(i));
170
                }
171
        }
172
173
        /**
174
         * ELimina todas las bandas que tienen un nombre determinado.
175
         * @param name Nombre de las bandas a eliminar
176
         */
177
        public void removeBands(String name){
178
                for(int i = 0; i < getBandCount(); i++){
179
                        Band band = getBand(i);
180
                        if(band.getFileName().equals(name))
181
                                bands.remove(i);
182
                }
183
        }
184
185
        /**
186
         * Resetea la asignaci?n de dibujado de las bandas de la imagen
187
         * sobre el DataImage cuando se hace un update para esta banda.
188
         */
189 12151 nacho
        public void clearDrawableBands(){
190 11413 nacho
                drawableBands = null;
191 10939 nacho
                for(int i = 0; i < getBandCount(); i++)
192
                        ((Band)bands.get(i)).clearDrawableBands();
193
        }
194
195
        /**
196
         * Para este GeoRasterFile asigna que bandas se pintaran
197
         * sobre el RasterBuf cuando se haga un update. Especificamos a
198
         * trav?s de los par?metros para que posici?n del RasterBuf ir?
199
         * dibujada con que banda del fichero de imagen.
200
         * @param posRasterBuf        Posici?n del RasterBuf que queremos pintar.
201
         * @param imageBand        Banda de la imagen que se pintar?
202
         */
203
        public void addDrawableBand(int posRasterBuf, int imageBand){
204
                try{
205
                        ((Band)bands.get(imageBand)).setPositionToDrawInBuffer(posRasterBuf);
206
                }catch(IndexOutOfBoundsException exc){
207
                        //No hacemos nada simplemente no inserta la banda.
208
                }
209
        }
210
211
        /**
212
         * Obtiene el n?mero de bandas de un RasterBuf sobre las que se pintara
213
         * alguna banda de este fichero cuando se llama a un updateBuffer.
214
         * @return N?mero de bandas. Cero en caso de no tener ninguna asignada.
215
         */
216
        public int getDrawableBandsCount(){
217
                int nbands = 0;
218 11413 nacho
                for(int i = 0;i < bands.size();i++) {
219 10939 nacho
                        Band b = (Band)bands.get(i);
220 12151 nacho
                        if(b.getBufferBandListToDraw() != null)
221
                                nbands += b.getBufferBandListToDraw().length;
222 10939 nacho
                }
223
                return nbands;
224
        }
225
226
        /**
227
         * Obtiene la banda de la posici?n i.
228
         * @param i Posici?n de la banda a obtener.
229
         * @return Banda.
230
         */
231
        public Band getBand(int i){
232
                if(i < 0 || i >= bands.size())
233
                        return null;
234
                return (Band)bands.get(i);
235
        }
236
237
        /**
238
         * Obtiene el n?mero de bandas.
239
         * @return entero con el n?mero de bandas.
240
         */
241
        public int getBandCount(){
242
                return bands.size();
243
        }
244
245
        /**
246
         * A partir de un nombre de fichero y un n?mero de banda obtiene la banda o bandas del buffer de salida
247
         * donde se pinta.
248
         * @param fileName Nombre de fichero
249
         * @param band N?mero de banda de la imagen
250
         * @return banda o bandas del buffer de salida donde se dibuja.
251
         */
252
        public int[] getBufferBandToDraw(String fileName, int band){
253
                for(int i = 0; i < bands.size(); i++){
254
                        if(((Band)bands.get(i)).getFileName().equals(fileName))
255
                                if(((Band)bands.get(i)).getPosition() == band)
256 12151 nacho
                                        return ((Band)bands.get(i)).getBufferBandListToDraw();
257 10939 nacho
                }
258
                int[] r = {-1};
259
                return r;
260
        }
261
        /**
262
         * Obtiene en un array de String la lista de nombres de ficheros
263
         * @return lista de nombres de los ficheros del GeoRasterMultiFile
264
         */
265
        public String[] getBandStringList(){
266
                String[] list = new String[bands.size()];
267
                for(int i = 0; i < bands.size(); i++)
268
                        list[i] = ((Band)bands.get(i)).getFileName();
269
                return list;
270
        }
271
272
        /**
273
         * Obtiene en un array de enteros con la lista de la posici?n de bandas
274
         * @return lista de la posici?n de bandas
275
         */
276
        public int[] getBandPositionList(){
277
                int[] list = new int[bands.size()];
278
                for(int i = 0; i < bands.size(); i++)
279
                        list[i] = ((Band)bands.get(i)).getPosition();
280
                return list;
281
        }
282
283
        /**
284
         * Obtiene el tipo de dato de las bandas. Esta llamada supone que todos los tipos de dato
285
         * de las bandas son igual por lo que devolver? el primero.
286
         * @return Entero que representa el tipo de datos de las bandas
287
         */
288
        public int getBandsDataType(){
289
                if(bands.size() <= 0)
290
                        return IBuffer.TYPE_UNDEFINED;
291
                return ((Band)bands.get(0)).getDataType();
292
        }
293
294
        /**
295
         * Obtiene la posici?n del fichero en la lista a partir del nombre
296
         * @param fileName Nombre del fichero
297
         * @return Posici?n del fichero o -1 si no existe.
298
         */
299
        public int getFileNumber(String fileName){
300
                String aux = "";
301
                int count = -1;
302
                for(int i = 0; i < bands.size(); i++){
303
                        if(((Band)bands.get(i)).getFileName().indexOf(aux) != 0){
304
                                count ++;
305
                                aux = ((Band)bands.get(i)).getFileName();
306
                        }
307
                        if(((Band)bands.get(i)).getFileName().indexOf(fileName) == 0)
308
                                return count;
309
                }
310
                return -1;
311 11413 nacho
        }
312
313
        /**
314 11898 nacho
         * Limpia la lista de bandas
315
         */
316
        public void clear() {
317
                bands.clear();
318
                drawableBands = null;
319
        }
320
321
        /**
322 11413 nacho
         *Muestra la lista de bandas en modo texto
323
         */
324
        public void show() {
325
                System.out.println("BandCount: " + getBandCount());
326
                System.out.println("DrawableBandsCount: " + getDrawableBandsCount());
327
                for (int i = 0; i < getBandCount(); i++) {
328
                        System.out.println("");
329
                        System.out.println("***********************");
330
                        System.out.println("Band: " + i);
331
                        System.out.println("DataType: " + ((Band)getBand(i)).getDataType());
332
                        System.out.println("FileName: " + ((Band)getBand(i)).getFileName());
333
                        System.out.println("Position: " + ((Band)getBand(i)).getPosition());
334 12151 nacho
                        if(((Band)getBand(i)).getBufferBandListToDraw() != null) {
335 11413 nacho
                                System.out.print("Band Dst: ");
336 12151 nacho
                                for (int j = 0; j < ((Band)getBand(i)).getBufferBandListToDraw().length; j++)
337
                                        System.out.print(((Band)getBand(i)).getBufferBandListToDraw()[j] + " ");
338 11413 nacho
                        }
339 12162 nacho
                        System.out.println();
340 11413 nacho
                }
341
342
        }
343
344 10939 nacho
}