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 | } |