svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libRaster / src / org / gvsig / raster / RasterLibrary.java @ 29786
History | View | Annotate | Download (13.5 KB)
1 | 11526 | bsanchez | /* 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 | 10960 | nacho | package org.gvsig.raster; |
20 | |||
21 | import java.io.File; |
||
22 | import java.util.ArrayList; |
||
23 | |||
24 | 22299 | bsanchez | import org.gvsig.raster.dataset.serializer.ColorInterpretationRmfSerializer; |
25 | import org.gvsig.raster.dataset.serializer.GeoInfoRmfSerializer; |
||
26 | 22337 | bsanchez | import org.gvsig.raster.dataset.serializer.GeoPointListRmfSerializer; |
27 | 22299 | bsanchez | import org.gvsig.raster.dataset.serializer.ProjectionRmfSerializer; |
28 | import org.gvsig.raster.dataset.serializer.StatisticsRmfSerializer; |
||
29 | import org.gvsig.raster.datastruct.serializer.ColorTableRmfSerializer; |
||
30 | import org.gvsig.raster.datastruct.serializer.HistogramRmfSerializer; |
||
31 | import org.gvsig.raster.datastruct.serializer.NoDataRmfSerializer; |
||
32 | 17051 | nbrodin | import org.gvsig.raster.grid.filter.bands.ColorBalanceCMYManager; |
33 | import org.gvsig.raster.grid.filter.bands.ColorBalanceRGBManager; |
||
34 | 12218 | nacho | import org.gvsig.raster.grid.filter.bands.ColorTableListManager; |
35 | 15970 | nbrodin | import org.gvsig.raster.grid.filter.bands.HSLToRGBManager; |
36 | import org.gvsig.raster.grid.filter.bands.RGBToHSLManager; |
||
37 | 17148 | nbrodin | import org.gvsig.raster.grid.filter.bands.ToLumSaManager; |
38 | 12095 | dguerrero | import org.gvsig.raster.grid.filter.convolution.ConvolutionListManager; |
39 | 12000 | bsanchez | import org.gvsig.raster.grid.filter.correction.MedianListManager; |
40 | 22580 | nbrodin | import org.gvsig.raster.grid.filter.correction.ModeManager; |
41 | 11526 | bsanchez | import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager; |
42 | 20272 | bsanchez | import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager; |
43 | 19556 | nbrodin | import org.gvsig.raster.grid.filter.enhancement.EqualizationManager; |
44 | 13385 | amunoz | import org.gvsig.raster.grid.filter.pansharp.PanSharpeningListManager; |
45 | 11986 | bsanchez | import org.gvsig.raster.grid.filter.segmentation.FirstDerivativeListManager; |
46 | 12333 | bsanchez | import org.gvsig.raster.grid.filter.statistics.StatisticsListManager; |
47 | 18960 | nbrodin | import org.gvsig.raster.util.PropertyEvent; |
48 | import org.gvsig.raster.util.PropertyListener; |
||
49 | 26873 | vcaballero | import org.gvsig.tools.ToolsLocator; |
50 | import org.gvsig.tools.extensionpoint.ExtensionPointManager; |
||
51 | 10960 | nacho | /**
|
52 | 11351 | nacho | * Clase principal de la libreria. En ella se definen variables globales con informaci?n
|
53 | * de uso general, as? como acciones a realizar al arracar la librer?a. El m?todo que
|
||
54 | * contiene las acciones de arranque es wakeUp. Las tareas principales de este m?todo
|
||
55 | 12333 | bsanchez | * son de registro de drivers de lectura y escritura y eliminaci?n del directorio de
|
56 | 11351 | nacho | * temporales.
|
57 | 12333 | bsanchez | *
|
58 | 10960 | nacho | * @author Nacho Brodin (nachobrodin@gmail.com)
|
59 | */
|
||
60 | public class RasterLibrary { |
||
61 | 17353 | nbrodin | /**
|
62 | * Control de librer?a ya inicializada.
|
||
63 | */
|
||
64 | public static boolean wakeup = false; |
||
65 | 16637 | nbrodin | public static ArrayList writersClassList = new ArrayList(); |
66 | 11986 | bsanchez | |
67 | 10960 | nacho | /**
|
68 | * En la generaci?n autom?tica de clases esta variable representa el n?mero de
|
||
69 | * clases en las que se hace la divisi?n.
|
||
70 | */
|
||
71 | 16637 | nbrodin | public static int defaultNumberOfClasses = 64; |
72 | 12504 | bsanchez | |
73 | 11207 | nacho | /**
|
74 | 12504 | bsanchez | * En la genraci?n de las paletas de color, esta variable representa el n?mero
|
75 | * de colores en las que se hace la divisi?n para generar la paleta nueva.
|
||
76 | * Con esto conseguimos velocidad de procesamiento. Cuanto menor sea, peor
|
||
77 | * ser? la calidad representada de la imagen.
|
||
78 | */
|
||
79 | 16637 | nbrodin | public static int defaultNumberOfColors = 256; |
80 | 12504 | bsanchez | /**
|
81 | 12333 | bsanchez | * Tama?o de bloque en los procesos que recorren un raster completo a base de ventanas con recorrido
|
82 | * descendente. Esta variable indica la altura de dicho bloque. Por lo tanto cada bloque ser? de
|
||
83 | * raster.width X blockHeight. Tipicamente recorridos de este tipo se usan para el calculo de estad?sticas,
|
||
84 | * histogramas, salvado a raster, etc... Es importante para el buen funcionamiento que este bloque sea
|
||
85 | 11386 | nacho | * potencia de dos.
|
86 | 11207 | nacho | */
|
87 | 16637 | nbrodin | public static int blockHeight = 512; |
88 | 11986 | bsanchez | |
89 | 10960 | nacho | //*************CACHE*******************
|
90 | /**
|
||
91 | 12333 | bsanchez | * Tama?o aproximado de cach? en Megas. Si este valor es alto cabr?n muchas p?ginas en memoria
|
92 | 10960 | nacho | * a la vez y si es bajo cabr?n pocas. Hay que tener en cuenta que al instanciar se convertira en bytes
|
93 | * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
|
||
94 | * de la cache en bytes. El tama?o aqu? especificado es aproximado. Este variar? dependiendo de los
|
||
95 | * par?metros del raster a cachear ya que las p?ginas deben tener una altura potencia de 2.
|
||
96 | */
|
||
97 | 18960 | nbrodin | public static long cacheSize = 25; |
98 | 10960 | nacho | /**
|
99 | * Tama?o m?ximo de la p?gina en Megas. Hay que tener en cuenta que al instanciar se convertira en bytes
|
||
100 | * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
|
||
101 | * de la p?gina en bytes
|
||
102 | */
|
||
103 | 18960 | nbrodin | public static double pageSize = 4; |
104 | 10960 | nacho | /**
|
105 | * N?mero de p?ginas que tiene cada conjunto de cach?
|
||
106 | */
|
||
107 | 18960 | nbrodin | public static int pagsPerGroup = 5; |
108 | 11986 | bsanchez | |
109 | 10960 | nacho | //*************PATHS*******************
|
110 | 11986 | bsanchez | |
111 | 10960 | nacho | /**
|
112 | * Directorio temporal para la cach?. Si gastamos el mismo que andami este se ocupar? de gestionar su
|
||
113 | * destrucci?n al cerrar gvSIG.
|
||
114 | */
|
||
115 | 27699 | nbrodin | private static String tempCacheDirectoryPath = System |
116 | .getProperty("java.io.tmpdir")
|
||
117 | + File.separator + "tmp-andami"; |
||
118 | 10960 | nacho | /**
|
119 | 11483 | nacho | * Ruta o rutas donde busca jars con clases que incorporen elementos nuevos que extiendan
|
120 | * otros ya existentes. Estos pueden ser drivers o filtros.
|
||
121 | */
|
||
122 | 18960 | nbrodin | public static String[] pathExtensions = {"." + File.separator}; |
123 | 17040 | bsanchez | |
124 | 11483 | nacho | /**
|
125 | 17660 | bsanchez | * Valor noData por defecto para la librer?a. En caso de no tener un valor asociado
|
126 | 16637 | nbrodin | * al raster se usar? este.
|
127 | */
|
||
128 | 18960 | nbrodin | public static double defaultNoDataValue = -99999; |
129 | /**
|
||
130 | * Contador global de las capas generadas para raster
|
||
131 | */
|
||
132 | private static int layerCount = 1; |
||
133 | private static ArrayList propetiesListeners = new ArrayList(); |
||
134 | 17040 | bsanchez | |
135 | 20430 | bsanchez | public static final int NODATATYPE_DISABLED = 0; |
136 | public static final int NODATATYPE_LAYER = 1; |
||
137 | public static final int NODATATYPE_USER = 2; |
||
138 | 16637 | nbrodin | /**
|
139 | 10960 | nacho | * Ejecuta las acciones necesarias para arrancar la librer?a.
|
140 | */
|
||
141 | 11527 | bsanchez | public static void wakeUp() { |
142 | 22299 | bsanchez | if (wakeup)
|
143 | 17353 | nbrodin | return;
|
144 | 22299 | bsanchez | |
145 | 28498 | nbrodin | ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager(); |
146 | 22299 | bsanchez | // Punto de extensi?n para registro de drivers de lectura
|
147 | 28498 | nbrodin | extensionPoints.add("RasterReader", "Raster Reader Classes"); |
148 | 22422 | bsanchez | // Punto de extensi?n para registro de drivers de escritura
|
149 | 28498 | nbrodin | extensionPoints.add("RasterWriter", "Raster Writer Classes"); |
150 | 22422 | bsanchez | // Punto de extensi?n de los filtros
|
151 | 28498 | nbrodin | extensionPoints.add("RasterFilter", "Raster Filter Classes"); |
152 | // Punto de extensi?n de los serializadores
|
||
153 | extensionPoints.add("Serializer", "Raster Serializer Classes"); |
||
154 | // Registro de clases por defecto
|
||
155 | extensionPoints.add("DefaultDriver", "Default Raster Drivers"); |
||
156 | 11710 | bsanchez | |
157 | 22422 | bsanchez | // Invoca las llamadas est?ticas de cada clase para registrarlas en los puntos de extensi?n
|
158 | 12122 | bsanchez | BrightnessContrastListManager.register(); |
159 | FirstDerivativeListManager.register(); |
||
160 | MedianListManager.register(); |
||
161 | ConvolutionListManager.register(); |
||
162 | 12218 | nacho | ColorTableListManager.register(); |
163 | 12333 | bsanchez | StatisticsListManager.register(); |
164 | 13385 | amunoz | PanSharpeningListManager.register(); |
165 | 15970 | nbrodin | RGBToHSLManager.register(); |
166 | HSLToRGBManager.register(); |
||
167 | 17051 | nbrodin | ColorBalanceCMYManager.register(); |
168 | ColorBalanceRGBManager.register(); |
||
169 | 17148 | nbrodin | ToLumSaManager.register(); |
170 | 19337 | nbrodin | EnhancementStretchListManager.register(); |
171 | 19556 | nbrodin | EqualizationManager.register(); |
172 | 22580 | nbrodin | ModeManager.register(); |
173 | 22299 | bsanchez | // EnhancementListManager.register();
|
174 | // RGBToCMYKManager.register();
|
||
175 | 11710 | bsanchez | // Registrar los nuevos filtros del directorio
|
176 | 22299 | bsanchez | // registerClasses();
|
177 | 11986 | bsanchez | |
178 | 22299 | bsanchez | // Registro de serializadores
|
179 | ColorInterpretationRmfSerializer.register(); |
||
180 | GeoInfoRmfSerializer.register(); |
||
181 | 22337 | bsanchez | GeoPointListRmfSerializer.register(); |
182 | 22299 | bsanchez | ProjectionRmfSerializer.register(); |
183 | StatisticsRmfSerializer.register(); |
||
184 | ColorTableRmfSerializer.register(); |
||
185 | HistogramRmfSerializer.register(); |
||
186 | NoDataRmfSerializer.register(); |
||
187 | |||
188 | // Limpiamos el directorio temporal
|
||
189 | 10960 | nacho | RasterLibrary.cleanUpTempFiles(); |
190 | 28174 | nbrodin | // Crea el directorio de temporales
|
191 | getTemporalPath(); |
||
192 | 17353 | nbrodin | wakeup = true;
|
193 | 10960 | nacho | } |
194 | 11986 | bsanchez | |
195 | 10960 | nacho | /**
|
196 | 11526 | bsanchez | * Elimina los ficheros del directorio temporal. Realizamos esta acci?n al
|
197 | * levantar la librer?a.
|
||
198 | 10960 | nacho | */
|
199 | 11526 | bsanchez | public static void cleanUpTempFiles() { |
200 | try {
|
||
201 | File tempDirectory = new File(tempCacheDirectoryPath); |
||
202 | 10960 | nacho | |
203 | 11526 | bsanchez | File[] files = tempDirectory.listFiles(); |
204 | 26932 | jmvivo | if (files != null) |
205 | 11526 | bsanchez | for (int i = 0; i < files.length; i++) { |
206 | // s?lo por si en un futuro se necesitan crear directorios temporales
|
||
207 | if (files[i].isDirectory())
|
||
208 | deleteDirectory(files[i]); |
||
209 | files[i].delete(); |
||
210 | } |
||
211 | tempDirectory.delete(); |
||
212 | } catch (Exception e) { |
||
213 | } |
||
214 | } |
||
215 | 10960 | nacho | |
216 | 11526 | bsanchez | /**
|
217 | * Recursive directory delete.
|
||
218 | * @param f
|
||
219 | */
|
||
220 | private static void deleteDirectory(File f) { |
||
221 | File[] files = f.listFiles(); |
||
222 | for (int i = 0; i < files.length; i++) { |
||
223 | if (files[i].isDirectory())
|
||
224 | deleteDirectory(files[i]); |
||
225 | files[i].delete(); |
||
226 | } |
||
227 | } |
||
228 | 26873 | vcaballero | |
229 | 18960 | nbrodin | //******* Servicio de nombres de capas ?nicos **************
|
230 | 26873 | vcaballero | |
231 | 18960 | nbrodin | /**
|
232 | * La gesti?n de nombres ?nicos en la generaci?n de capas se lleva de forma
|
||
233 | * autom?tica. Cuando alguien crea una capa nueva, si esta no tiene nombre especifico,
|
||
234 | * obtiene su nombre mediante este m?todo. La siguiente vez que se llame dar? un nombre
|
||
235 | * distinto. El nombre de la capa ser? NewLayer_ seguido de un contador de actualizaci?n
|
||
236 | * autom?tica cada vez que se usa.
|
||
237 | * @return Nombre ?nico para la capa.
|
||
238 | */
|
||
239 | public static String usesOnlyLayerName() { |
||
240 | String oldValue = getOnlyLayerName();
|
||
241 | String newValue = "NewLayer_" + (++RasterLibrary.layerCount); |
||
242 | 26932 | jmvivo | for (int i = 0; i < propetiesListeners.size(); i++) |
243 | 26873 | vcaballero | if(propetiesListeners.get(i) instanceof PropertyListener) |
244 | 18960 | nbrodin | ((PropertyListener)propetiesListeners.get(i)).actionValueChanged(new PropertyEvent(oldValue, "NewLayer", newValue, oldValue)); |
245 | return newValue;
|
||
246 | } |
||
247 | 26873 | vcaballero | |
248 | 18960 | nbrodin | /**
|
249 | * Obtiene el nombre ?nico de la siguiente capa sin actualizar el contador. Es
|
||
250 | * solo para consulta. La siguiente vez que se llama a getOnlyLayerName o usesOnlyLayerName
|
||
251 | 26873 | vcaballero | * devolver? el mismo nomnbre.
|
252 | 18960 | nbrodin | * @return Nombre ?nico para la capa.
|
253 | */
|
||
254 | public static String getOnlyLayerName() { |
||
255 | return "NewLayer_" + RasterLibrary.layerCount; |
||
256 | } |
||
257 | 26873 | vcaballero | |
258 | 18960 | nbrodin | /**
|
259 | * A?adir un listener a la lista de eventos
|
||
260 | * @param listener
|
||
261 | */
|
||
262 | public static void addOnlyLayerNameListener(PropertyListener listener) { |
||
263 | if (!propetiesListeners.contains(listener))
|
||
264 | propetiesListeners.add(listener); |
||
265 | } |
||
266 | 26873 | vcaballero | |
267 | 18960 | nbrodin | /**
|
268 | * Elimina un listener de la lista de eventos
|
||
269 | * @param listener
|
||
270 | */
|
||
271 | public static void removeOnlyLayerNameListener(PropertyListener listener) { |
||
272 | for (int i = 0; i < propetiesListeners.size(); i++) |
||
273 | if(propetiesListeners.get(i) == listener)
|
||
274 | propetiesListeners.remove(i); |
||
275 | } |
||
276 | 22422 | bsanchez | |
277 | 18960 | nbrodin | //******* End: Servicio de nombres de capas ?nicos **************
|
278 | 26873 | vcaballero | |
279 | 22422 | bsanchez | /**
|
280 | * Esta funci?n crea el directorio para temporales y devuelve el manejador
|
||
281 | * del directorio
|
||
282 | * @return
|
||
283 | */
|
||
284 | static public File getTemporalFile() { |
||
285 | File tempDirectory = new File(tempCacheDirectoryPath); |
||
286 | if (!tempDirectory.exists())
|
||
287 | tempDirectory.mkdir(); |
||
288 | return tempDirectory;
|
||
289 | } |
||
290 | 10960 | nacho | |
291 | 11526 | bsanchez | /**
|
292 | 22422 | bsanchez | * Esta funci?n crea el directorio para temporales y devuelve la ruta de este
|
293 | * @return
|
||
294 | */
|
||
295 | static public String getTemporalPath() { |
||
296 | return getTemporalFile().getAbsolutePath();
|
||
297 | } |
||
298 | |||
299 | /*
|
||
300 | private static Hashtable clasesJar = new Hashtable();
|
||
301 | |||
302 | *
|
||
303 | 11526 | bsanchez | * Esta funci?n buscar? todos los jars en las rutas de pathExtensions y
|
304 | * registrar? todos las clases registrables. En este momento hay posibilidad
|
||
305 | * de registro de drivers y filtros.
|
||
306 | 22422 | bsanchez | *
|
307 | 14134 | nbrodin | private static void registerClasses() throws Exception {
|
308 | RasterClassLoader loader = new RasterClassLoader();
|
||
309 | 17040 | bsanchez | |
310 | 14134 | nbrodin | //Cargamos sobre jarList todos los File correspondientes a los jar contenidos en pathExtensions
|
311 | File[] jarList = null;
|
||
312 | 11526 | bsanchez | for (int iPath = 0; iPath < pathExtensions.length; iPath++) {
|
313 | 14134 | nbrodin | File directory = new File(pathExtensions[iPath]);
|
314 | if (directory.isDirectory() && directory.canRead()) {
|
||
315 | jarList = directory.listFiles(new FileFilter() {
|
||
316 | public boolean accept(File pathname) {
|
||
317 | return (pathname.getName().toUpperCase().endsWith(".JAR"));
|
||
318 | }
|
||
319 | 17040 | bsanchez | });
|
320 | 11505 | nacho | }
|
321 | }
|
||
322 | 17040 | bsanchez | |
323 | 14134 | nbrodin | //Creamos las URL
|
324 | URL[] urls = new URL[jarList.length];
|
||
325 | |||
326 | for (int j = 0; j < jarList.length; j++) {
|
||
327 | try {
|
||
328 | urls[j] = new URL("file:" + jarList[j]);
|
||
329 | } catch (MalformedURLException e) {
|
||
330 | Logger.getLogger(RasterLibrary.class.getName()).debug("Error formando la URL, jar incorrecto", e);
|
||
331 | }
|
||
332 | }
|
||
333 | 17040 | bsanchez | |
334 | 14134 | nbrodin | //Comprobamos que no haya clases repetidas
|
335 | ZipFile[] jarFiles = new ZipFile[jarList.length];
|
||
336 | for (int i = 0; i < jarList.length; i++) {
|
||
337 | try {
|
||
338 | jarFiles[i] = new ZipFile(jarList[i].getPath());
|
||
339 | |||
340 | Enumeration entradas = jarFiles[i].entries();
|
||
341 | |||
342 | while (entradas.hasMoreElements()) {
|
||
343 | ZipEntry file = (ZipEntry) entradas.nextElement();
|
||
344 | String fileName = file.getName();
|
||
345 | |||
346 | 17040 | bsanchez | if (!fileName.toLowerCase().endsWith(".class"))
|
347 | 14134 | nbrodin | continue;
|
348 | 17040 | bsanchez | |
349 | 14134 | nbrodin | fileName = fileName.substring(0, fileName.length() - 6).replace('/', '.');
|
350 | |||
351 | if (clasesJar.get(fileName) != null) {
|
||
352 | throw new JarException("CLASES REPETIDAS: " + fileName + " " + " en " +
|
||
353 | jarFiles[i].getName() + " y en " + ((ZipFile) clasesJar.get(fileName)).getName());
|
||
354 | }
|
||
355 | |||
356 | clasesJar.put(fileName, jarFiles[i]);
|
||
357 | }
|
||
358 | } catch (ZipException e) {
|
||
359 | throw new IOException(" Jar: " + jarList[i].getPath() + ": " + jarFiles[i]);
|
||
360 | } catch (IOException e) {
|
||
361 | throw e;
|
||
362 | }
|
||
363 | }
|
||
364 | 11526 | bsanchez | }
|
365 | 22422 | bsanchez | */
|
366 | 10960 | nacho | } |