Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / enhancement / EnhancementListManager.java @ 11792

History | View | Annotate | Download (8.56 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

    
20
package org.gvsig.raster.grid.filter.enhancement;
21

    
22
import java.util.ArrayList;
23

    
24
import org.gvsig.i18n.Messages;
25
import org.gvsig.raster.dataset.FileNotOpenException;
26
import org.gvsig.raster.dataset.IBuffer;
27
import org.gvsig.raster.dataset.IStatistics;
28
import org.gvsig.raster.dataset.Params;
29
import org.gvsig.raster.dataset.RasterDriverException;
30
import org.gvsig.raster.grid.filter.IRasterFilterListManager;
31
import org.gvsig.raster.grid.filter.RasterFilter;
32
import org.gvsig.raster.grid.filter.RasterFilterList;
33
import org.gvsig.raster.grid.filter.RasterFilterListManager;
34
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
35
import org.gvsig.raster.util.extensionPoints.ExtensionPoints;
36
import org.gvsig.raster.util.extensionPoints.ExtensionPointsSingleton;
37

    
38
/**
39
 * Gestor de la pila de filtros para el filtro de realce.
40
 * @author Nacho Brodin (nachobrodin@gmail.com)
41
 */
42
public class EnhancementListManager implements IRasterFilterListManager {
43
        
44
        protected RasterFilterList                         filterList = null;
45
        private RasterFilterListManager                filterListManager = null;
46
        private IStatistics                                        stats = null;
47
        
48
        /**
49
         * Constructor
50
         * @param filterListManager
51
         */
52
        public EnhancementListManager(RasterFilterListManager filterListManager) {
53
                this.filterListManager = filterListManager;
54
                this.filterList = filterListManager.getFilterList();
55
                stats = (IStatistics)filterList.getParam("IStatistics");
56
        }
57
        
58
        /**
59
         * Asigna el objeto con las estadisticas.
60
         * @param stats
61
         */
62
        public void setStatistics(IStatistics stats) {
63
                this.stats = stats;
64
        }
65
        
66
        static {
67
                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
68
                extensionPoints.add("RasterFilter", "Enhancement", EnhancementListManager.class);
69
        }
70
        
71
        /**
72
         * A?ade un filtro de realce. Esta versi?n tiene el par?metro para a?adirle el nombre
73
         * del fichero. Esto se usa para que si a un fichero se le ha calculado ya el recorte de colas
74
         * no se vuelva a calcular, evitando as? que si hacemos un draw a una imagen por bloques cada
75
         * bloque tenga un c?lculo distinto para el recorte.
76
         * @param removeAll        true si se desea eliminar cualquier filtro de brillo que 
77
         * hubiera en la pila antes y false si se acumula sobre lo que haya
78
         */
79
        public void addEnhancedFilter(boolean removeEnds, IStatistics stats, double tailTrim, int insertionMode, int[] renderBands) {
80
                String fName = Messages.getText(LinearEnhancementFilter.genericName);
81

    
82
                if (insertionMode == RasterFilterList.ADD_END_AND_DELETE && filterList.isActive(fName)) {
83
                        filterList.remove(fName);
84
                        filterListManager.controlTypes();
85
                }
86

    
87
                RasterFilter filter = null;
88

    
89
                switch (filterList.getDataTypeInFilter(fName, insertionMode)) {
90
                        case IBuffer.TYPE_IMAGE:
91
                                // filter = new LinearEnhancementImageFilter();
92
                                break;
93
                        case IBuffer.TYPE_SHORT:
94
                                filter = new LinearEnhancementShortFilter();
95
                                break;
96
                        case IBuffer.TYPE_USHORT:
97
                        case IBuffer.TYPE_INT:
98
                                // filter = new LinearEnhancementIntegerFilter();
99
                                break;
100
                        case IBuffer.TYPE_FLOAT:
101
                                filter = new LinearEnhancementFloatFilter();
102
                                break;
103
                        case IBuffer.TYPE_DOUBLE:
104
                                filter = new LinearEnhancementDoubleFilter();
105
                                break;
106
                }
107

    
108
                if (filter != null) {
109
                        filter.addParam("stats", stats);
110
                        if (removeEnds) {
111
                                filter.addParam("remove", new Boolean(true));
112
                        } else {
113
                                filter.addParam("remove", new Boolean(false));
114
                        }
115
                        filter.addParam("tailTrim", new Double(tailTrim));
116
                        filter.addParam("renderBands", renderBands);
117

    
118
                        if (insertionMode == RasterFilterList.MODIFY_LAST) {
119
                                if (filterList.isActive(fName)) {
120
                                        filterList.replace(filter, fName);
121
                                        return;
122
                                }
123
                        }
124
                        filterList.add(filter);
125
                }
126
        }
127

    
128
        /**
129
         * Obtiene un Array de Strings a partir de una pila de filtros. Cada elemento
130
         * del array tendr? la forma de elemento=valor.
131
         */
132
        public ArrayList getStringsFromFilterList(ArrayList filterList, RasterFilter rf) {
133
                if (rf instanceof LinearEnhancementFilter) {
134
                        filterList.add("filter.enhanced.active=true");
135
                        filterList.add("filter.enhanced.tailTrim=" + ((LinearEnhancementFilter) rf).getTailTrim().toString());
136
                        StringBuffer values = new StringBuffer();
137
                        for (int i = 0; i < ((LinearEnhancementFilter) rf).renderBands.length; i++) {
138
                                values.append(((LinearEnhancementFilter) rf).renderBands[i]);
139
                                if (i < ((LinearEnhancementFilter) rf).renderBands.length - 1)
140
                                        values.append(",");
141
                        }
142
                        filterList.add("filter.enhanced.renderbands=" + values.toString());
143
                        filterList.add("filter.enhanced.remove=" + ((LinearEnhancementFilter) rf).getRemoveEnds().toString());
144
                }
145

    
146
                return filterList;
147
        }
148

    
149
        /*
150
         * (non-Javadoc)
151
         * @see org.gvsig.raster.grid.filter.IRasterFilterListManager#createFilterListFromStrings(java.util.ArrayList, java.lang.String, int)
152
         */
153
        public int createFilterListFromStrings(ArrayList filters, String fil, int filteri) {
154
                if (fil.startsWith("filter.enhanced.active") && RasterFilterListManager.getValue(fil).equals("true")) {
155
                        filters.remove(filteri);
156
                        double tailTrim = 0D;
157
                        int[] renderBands = new int[] { 0, 0, 0 };
158

    
159
                        for (int propFilter = 0; propFilter < filters.size(); propFilter++) {
160
                                String elem = (String) filters.get(propFilter);
161

    
162
                                if (elem.startsWith("filter.enhanced.tailTrim")) {
163
                                        try {
164
                                                tailTrim = new Double(RasterFilterListManager.getValue(elem)).doubleValue();
165
                                        } catch (NumberFormatException ex) {
166
                                                // tailTrim sigue valiendo 0
167
                                        }
168
                                }
169

    
170
                                if (elem.startsWith("filter.enhanced.renderbands")) {
171
                                        String value = RasterFilterListManager.getValue(elem);
172
                                        String[] valueList = value.split(",");
173
                                        renderBands = new int[valueList.length];
174
                                        for (int i = 0; i < renderBands.length; i++) {
175
                                                try {
176
                                                        renderBands[i] = Integer.parseInt(valueList[i]);
177
                                                } catch (NumberFormatException e) {
178
                                                        // No a?ade el valor
179
                                                }
180
                                        }
181
                                        // filters.remove(propFilter);
182
                                        // propFilter--;
183
                                }
184

    
185
                                if (elem.startsWith("filter.enhanced.remove")) {
186
                                        addEnhancedFilter(Boolean.valueOf(RasterFilterListManager.getValue(elem)).booleanValue(), stats, tailTrim, RasterFilterList.ADD_END, renderBands);
187
                                        filters.remove(propFilter);
188
                                        propFilter--;
189
                                }
190
                        }
191

    
192
                        filteri = -1;
193
                }
194
                return filteri;
195
        }
196

    
197
        /*
198
         * (non-Javadoc)
199
         * @see org.gvsig.raster.grid.filter.IRasterFilterListManager#getRasterFilterList()
200
         */
201
        public ArrayList getRasterFilterList() {
202
                ArrayList filters = new ArrayList();
203
                filters.add(LinearEnhancementFilter.class);
204
                return filters;
205
        }
206

    
207
        /*
208
         * (non-Javadoc)
209
         * @see org.gvsig.raster.grid.filter.IRasterFilterListManager#addFilter(java.lang.Class, org.gvsig.raster.dataset.Params)
210
         */
211
        public void addFilter(Class classFilter, Params params) {
212
                if (classFilter.equals(LinearEnhancementFilter.class)) {
213
                        boolean removeEnds = false;
214
                        double tailTrim = 0.0;
215
                        int[] renderBands = { 0, 1, 2 };
216

    
217
                        for (int i = 0; i < params.getNumParams(); i++) {
218
                                if (params.getParam(i).id.equals("RemoveEnds"))
219
                                        removeEnds = new Boolean(params.getParam(i).defaultValue).booleanValue();
220
                                if (params.getParam(i).id.equals("TailTrim"))
221
                                        tailTrim = Double.parseDouble(params.getParam(i).defaultValue) / 100.0;
222
                        }
223

    
224
//                        RasterFilterListManager filterManager = new RasterFilterListManager(.getFilterList());
225
                        IStatistics stats = (IStatistics) filterList.getParam("IStatistics");
226
                        if (tailTrim == 0) { // En este caso siempre es necesario el m?ximo y m?nimo
227
                                if (!stats.isCalculated()) {
228
                                        try {
229
                                                stats.calcFullStatistics();
230
                                        } catch (FileNotOpenException e) {
231
                                                // No podemos aplicar el filtro
232
                                                return;
233
                                        } catch (RasterDriverException e) {
234
                                                // No podemos aplicar el filtro
235
                                                return;
236
                                        }
237
                                }
238
                        } else {
239
                                StatisticsListManager slm = new StatisticsListManager(filterListManager, stats);
240
                                slm.addTailFilter(tailTrim, 0D, removeEnds, stats);
241
                        }
242
                        addEnhancedFilter(removeEnds, stats, tailTrim, RasterFilterList.ADD_END, renderBands);
243
                }
244
        }
245
}