Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.api / src / main / java / org / gvsig / fmap / dal / coverage / grid / filter / BaseRasterFilter.java @ 755

History | View | Annotate | Download (11.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.fmap.dal.coverage.grid.filter;
23

    
24
import java.util.Hashtable;
25
import java.util.TreeMap;
26

    
27
import org.gvsig.fmap.dal.coverage.RasterLocator;
28
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
29
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
30
import org.gvsig.fmap.dal.coverage.datastruct.Params;
31
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
32
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
33
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
34
import org.gvsig.fmap.dal.coverage.process.TaskEventManager;
35
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
36
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dynobject.DynStruct;
39
import org.gvsig.tools.persistence.PersistenceManager;
40
import org.gvsig.tools.persistence.PersistentState;
41
import org.gvsig.tools.persistence.exception.PersistenceException;
42

    
43
/**
44
 * Base class for all filters
45
 *
46
 * @author Nacho Brodin (nachobrodin@gmail.com)
47
 */
48
public abstract class BaseRasterFilter implements RasterFilter, Cloneable {
49
        public static final String PERSISTENT_NAME        = "RasterFilterList_Persistent";
50
    public static final String PERSISTENT_DESCRIPTION = "RasterFilterList Persistent";
51
        protected Buffer           raster                 = null;
52
        protected Buffer           rasterResult           = null;
53
        protected int              height                 = 0;
54
        protected int              width                  = 0;
55
        protected Hashtable<String, Object> 
56
                                   params                 = new Hashtable<String, Object>();
57
        protected TreeMap<String, Object>   
58
                                   environment            = new TreeMap<String, Object>();
59
        protected Extent           extent                 = null;
60
        private int                percent                = 0;
61
        private String             fName                  = "";
62
        /**
63
         * Variable que control la aplicaci?n o no del filtro. Si est? a false aunque est? en
64
         * la pila el filtro no se ejecutar?.
65
         */
66
        protected boolean           exec                  = true;
67
        protected RasterUtils       util                  = null;
68
        protected TaskEventManager  taskEventManager      = null;
69
        
70
        /**
71
         * Clase que representa un kernel de NxN p?xeles para realizar operaciones sobre
72
         * un pixel.
73
         * @author Nacho Brodin (nachobrodin@gmail.com)
74
         */
75
        public static class Kernel {
76
                public double[][]        kernel        = null;
77
                protected double        divisor = 0;
78

    
79
                /**
80
                 * Constructor. Crea la matriz de datos para el kernel.
81
                 * @param k datos del kernel
82
                 */
83
                public Kernel(double[][] k) {
84
                        this.kernel = k;
85

    
86
                        for (int i = 0; i < kernel.length; i++)
87
                                for (int j = 0; j < kernel[0].length; j++)
88
                                        divisor = divisor + kernel[i][j];
89
                }
90

    
91
                /**
92
                 * Constructor. Crea la matriz de datos para el kernel.
93
                 * @param k datos del kernel
94
                 */
95
                public Kernel(double[][] k, double divisor) {
96
                        this.kernel = k;
97
                        this.divisor = divisor;
98
                }
99

    
100
                public double kernelOperation(Kernel k) {
101
                        double res = 0;
102
                        for (int i = 0; i < kernel.length; i++)
103
                                for (int j = 0; j < kernel[0].length; j++)
104
                                        res += kernel[i][j] * k.kernel[i][j];
105
                        return res;
106
                }
107

    
108
                /**
109
                 * Aplica la operaci?n de convoluci?n del kernel con otro kernel
110
                 * pasado por par?metro
111
                 * @param k
112
                 * @return
113
                 */
114
                public double convolution(Kernel k) {
115
                        double res = this.kernelOperation(k);
116
                        if (this.divisor != 0)
117
                                res = res / divisor;
118
                        //return Math.abs(res);
119
                        return res;
120
                }
121

    
122
                public double getDivisor() {
123
                        return divisor;
124
                }
125

    
126
                public void setDivisor(double divisor) {
127
                        this.divisor = divisor;
128
                }
129

    
130
                /**
131
                 * Obtiene el tama?o del kernel que viene dado por
132
                 * el n?mero de pixeles de su lado.
133
                 * @return
134
                 */
135
                public int getLado() {
136
                        return kernel.length;
137
                }
138

    
139
                /**
140
                 * Aplica ls operaci?n 0xff para todos los elementos del
141
                 * kernel. Presupone que este es de tipo byte y no hace ninguna
142
                 * comprobaci?n al respecto. Se deja en manos del usuario aplicar esta
143
                 * operaci?n solo cuando los elementos del kernel sean de este tipo de dato.
144
                 */
145
                public void rgbNormalization() {
146
                        for (int i = 0; i < kernel.length; i++)
147
                                for (int j = 0; j < kernel[0].length; j++)
148
                                        kernel[i][j] = ((byte)kernel[i][j]) & 0xff;
149
                }
150
        }
151

    
152
        /**
153
         * Constructor
154
         */
155
        public BaseRasterFilter() {
156
                if(RasterLocator.getManager() != null)
157
                        util = RasterLocator.getManager().getRasterUtils();
158
        }
159

    
160
        /**
161
         * Aplica el filtro sobre el raster pasado pixel a pixel
162
         * @throws ProcessInterruptedException
163
         */
164
        public void execute() throws ProcessInterruptedException {
165
                taskEventManager = RasterLocator.getManager().createRasterTask(this);
166
                pre();
167
                if (raster != null && raster.getDataType() != this.getInRasterDataType())
168
                        exec = false;
169
                percent = 0;
170
                if (exec)
171
                        for (int row = 0; row < height; row ++) {
172
                                for (int col = 0; col < width; col ++)
173
                                        try {
174
                                                process(col, row);
175
                                        }catch (ArrayIndexOutOfBoundsException e) {
176
                                        }
177

    
178
                                if (taskEventManager.getEvent() != null)
179
                                        taskEventManager.manageEvent(taskEventManager.getEvent());
180

    
181
                                percent = (row * 100) / height;
182
                        }
183
                percent = 100;
184
                post();
185
        }
186

    
187
        /**
188
         * A?ade un par?metro al filtro
189
         *
190
         * @param name Clave del par?metro
191
         * @param param Objeto pasado como par?metro
192
         */
193
        public void addParam(String name, Object param) {
194
                if (param != null)
195
                        params.put(name, param);
196
                else
197
                        params.remove(name);
198
        }
199

    
200
        /**
201
         * Elimina un par?metro del filtro
202
         * @param name Clave del par?metro a eliminar
203
         */
204
        public void removeParam(String name) {
205
                params.remove(name);
206
        }
207

    
208
        /**
209
         * Obtiene un par?metro a partir de la clave
210
         * @param name Par?metro
211
         * @return Par?metro
212
         */
213
        public Object getParam(String name) {
214
                return params.get(name);
215
        }
216
        
217
        /*
218
         * (non-Javadoc)
219
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#getParams()
220
         */
221
        @SuppressWarnings("unchecked")
222
        public Hashtable getParams() {
223
                return params;
224
        }
225
        
226
        /*
227
         * (non-Javadoc)
228
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#setParams(java.util.Hashtable)
229
         */
230
        @SuppressWarnings("unchecked")
231
        public void setParams(Hashtable params) {
232
                this.params = params;
233
        }
234

    
235
                /**
236
         * @param extent The extent to set.
237
         */
238
        public void setExtent(Extent extent) {
239
                this.extent = extent;
240
        }
241

    
242
        /**
243
         * Obtiene true si el filtro va a ser ejecutado o false si no va a serlo
244
         * @return
245
         */
246
        public boolean isExec() {
247
                return exec;
248
        }
249

    
250
        /**
251
         * Asigna el valor a la variable exec. Esta estar? a true si el filtro se ejecutar? la pr?xima
252
         * vez que se repinte o false si no se ejecuta.
253
         * @param exec
254
         */
255
        public void setExec(boolean exec) {
256
                this.exec = exec;
257
        }
258

    
259
        /**
260
         * Pone a cero el contador del porcentaje del proceso de filtrado
261
         * @return
262
         */
263
        public void resetPercent() {
264
                percent = 0;
265
        }
266

    
267
        /**
268
         * Obtiene el porcentaje recorrido del proceso de filtrado
269
         * @return
270
         */
271
        public int getPercent() {
272
                return percent;
273
        }
274

    
275
        /**
276
         * Funci?n que contiene el c?digo a ejecutar antes de aplicar el filtro
277
         */
278
        abstract public void pre();
279

    
280
        /**
281
         * Funci?n que contiene el c?digo a ejecutar despues de aplicar el filtro
282
         */
283
        abstract public void post();
284

    
285
        /**
286
         * Ejecuci?n del filtro para un pixel de la imagen
287
         */
288
        abstract public void process(int x, int y);
289

    
290
        /**
291
         * Obtiene el tipo de datos del raster de entrada
292
         */
293
        abstract public int getInRasterDataType();
294

    
295
        /**
296
         * Obtiene el tipo de datos del raster de salida
297
         */
298
        abstract public int getOutRasterDataType();
299

    
300
        /**
301
         * Obtiene el resultado del filtro despues de su ejecuci?n a trav?s de una clave
302
         * @param name        clave para obtener un objeto resultado del filtro.
303
         */
304
        abstract public Object getResult(String name);
305

    
306
        /*
307
         * (non-Javadoc)
308
         * @see org.gvsig.raster.grid.filter.IRasterFilter#getGroup()
309
         */
310
        abstract public String getGroup();
311

    
312
        /*
313
         * (non-Javadoc)
314
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#getUIParams(java.lang.String)
315
         */
316
        abstract public Params getUIParams(String nameFilter);
317

    
318
        /*
319
         * (non-Javadoc)
320
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#getNames()
321
         */
322
        abstract public String[] getNames();
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#isVisible()
327
         */
328
        public boolean isVisible() {
329
                return true;
330
        }
331

    
332
        /* (non-Javadoc)
333
         * @see java.lang.Object#clone()
334
         */
335
        public Object clone() throws CloneNotSupportedException {
336
                return super.clone();
337
        }
338

    
339
        /*
340
         * (non-Javadoc)
341
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#getName()
342
         */
343
        public String getName() {
344
                return fName;
345
        }
346

    
347
        /*
348
         * (non-Javadoc)
349
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#setName(java.lang.String)
350
         */
351
        public void setName(String name) {
352
                fName = name;
353
        }
354

    
355
        /*
356
         * (non-Javadoc)
357
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#getEnv()
358
         */
359
        @SuppressWarnings("unchecked")
360
        public TreeMap getEnv() {
361
                return environment;
362
        }
363

    
364
        /*
365
         * (non-Javadoc)
366
         * @see org.gvsig.fmap.dal.coverage.grid.RasterFilter#setEnv(java.util.TreeMap)
367
         */
368
        @SuppressWarnings("unchecked")
369
        public void setEnv(TreeMap env) {
370
                this.environment = env;
371
        }
372

    
373
        protected void mergeBufferTransparency(Buffer rasterAlpha) {
374
                Transparency transparency = (Transparency) environment.get("Transparency");
375

    
376
                if (transparency != null) {
377
                        if (transparency.getAlphaBand() != null)
378
                                transparency.mergeBuffer(rasterAlpha, transparency.getAlphaBand());
379
                        else
380
                                transparency.setAlphaBand(rasterAlpha);
381

    
382
                        transparency.activeTransparency();
383
                }
384
        }
385

    
386
        /**
387
         * Releases buffer resources
388
         */
389
        public void free() {
390
                if (raster != null)
391
                        raster.free();
392
                if (rasterResult != null)
393
                        rasterResult.free();
394
                rasterResult = null;
395
                raster = null;
396
        }
397
        
398
        /*
399
         * (non-Javadoc)
400
         * @see org.gvsig.tools.persistence.Persistent#loadFromState(org.gvsig.tools.persistence.PersistentState)
401
         */
402
        public void loadFromState(PersistentState state)
403
                        throws PersistenceException {
404
                this.exec = state.getBoolean("exec");
405
                this.fName = state.getString("fName");
406
                this.extent = (Extent)state.get("extent");
407
        }
408

    
409
        /*
410
         * (non-Javadoc)
411
         * @see org.gvsig.tools.persistence.Persistent#saveToState(org.gvsig.tools.persistence.PersistentState)
412
         */
413
        public void saveToState(PersistentState state) throws PersistenceException {
414
                state.set("exec", exec);
415
                state.set("fName", fName);
416
                state.set("extent", extent);
417
        }        
418
        
419
        public static void registerPersistence() {
420
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
421
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
422
                if( definition == null ) {
423
                        definition = manager.addDefinition(
424
                                        RasterFilterList.class,
425
                                        PERSISTENT_NAME,
426
                                        PERSISTENT_DESCRIPTION,
427
                                        null, 
428
                                        null
429
                        );
430
                        
431
                        definition.addDynFieldBoolean("exec").setMandatory(false);
432
                        definition.addDynFieldString("fName").setMandatory(false);
433
                        definition.addDynFieldObject("extent").setMandatory(false);
434
                }
435
        }
436
}