Statistics
| Revision:

root / trunk / extensions / extRemoteSensing / src / org / gvsig / remotesensing / decisiontrees / CopyOfDecisionTreeProcess.java @ 18540

History | View | Annotate | Download (7.63 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 Instituto de Desarrollo Regional 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
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Iba?ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   Instituto de Desarrollo Regional (Universidad de Castilla La-Mancha)
34
 *   Campus Universitario s/n
35
 *   02071 Alabacete
36
 *   Spain
37
 *
38
 *   +34 967 599 200
39
 */
40

    
41
package org.gvsig.remotesensing.decisiontrees;
42

    
43
import java.awt.geom.AffineTransform;
44
import java.io.IOException;
45
import java.util.HashMap;
46
import java.util.Iterator;
47

    
48
import org.gvsig.raster.RasterProcess;
49
import org.gvsig.raster.buffer.RasterBuffer;
50
import org.gvsig.raster.dataset.GeoRasterWriter;
51
import org.gvsig.raster.dataset.NotSupportedExtensionException;
52
import org.gvsig.raster.dataset.io.RasterDriverException;
53
import org.gvsig.raster.grid.GridExtent;
54
import org.gvsig.raster.process.RasterTaskQueue;
55
import org.gvsig.raster.util.RasterToolsUtil;
56
import org.gvsig.rastertools.clipping.WriterBufferServer;
57
import org.gvsig.remotesensing.gridmath.NoAssignedVarsException;
58
import org.nfunk.jep.Variable;
59

    
60
import com.iver.andami.PluginServices;
61

    
62
/**
63
 * Proceso para la generaci?n de un raster de clasificaci?n mediante un ?rbol de decisi?n.
64
 * 
65
 * @author Diego Guerrero Sevilla (diego.guerrero@uclm.es)
66
 *
67
 */
68
public class CopyOfDecisionTreeProcess extends RasterProcess {
69

    
70
        private DecisionTreeNode                         tree                                 = null;
71
        private HashMap                                         varsTable                         = null;
72
        private String                                                 fileName                         = null;
73
        private int                                                 percent                           = 0;
74
        private GridExtent                                        resultExtent                = null;
75
        private RasterBuffer                                 rasterResult                 = null;        
76
        private boolean                                         cancel                                 = false;
77
        private WriterBufferServer                         writerBufferServer        = null;
78

    
79
        
80
        /**
81
        *  Escritura del resultado en disco.
82
        */
83
        private void loadLAyer(){
84
                
85
                try{
86
                        writerBufferServer = new WriterBufferServer(rasterResult);
87
                        AffineTransform aTransform = new AffineTransform(resultExtent.getCellSize(),0.0,0.0,-resultExtent.getCellSize(),resultExtent.getMin().getX(),resultExtent.getMax().getY());
88
                        GeoRasterWriter grw = GeoRasterWriter.getWriter(writerBufferServer, fileName, rasterResult.getBandCount(),aTransform, resultExtent.getNX(),resultExtent.getNY(),rasterResult.getDataType(), GeoRasterWriter.getWriter(fileName).getParams(),null);
89
                        grw.dataWrite();
90
                        grw.writeClose();
91
                
92
                }catch(NotSupportedExtensionException e){
93
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_writer_notsupportedextension"), this, e);
94
                } catch (IOException e) {
95
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "error_writer"), this, e);
96
                }catch(InterruptedException e){
97
                        Thread.currentThread().interrupt();
98
                } catch (RasterDriverException e) {
99
                        RasterToolsUtil.messageBoxError(PluginServices.getText(this, "raster_buffer_invalid_extension"), this, e);
100
                }
101
        }
102

    
103
        public int getPercent() {
104
                if (writerBufferServer==null)
105
                        return percent;
106
                else
107
                        return writerBufferServer.getPercent();
108
        }
109

    
110
        public String getTitle() {
111
                return PluginServices.getText(this,"arbol_decision");
112
        }
113

    
114
        public void init() {
115
                tree = (DecisionTreeNode)getParam("tree");
116
                varsTable = (HashMap)getParam("varsTable");
117
                fileName = getStringParam("filename");
118
                resultExtent = (GridExtent)getParam("resultExtent");
119
        }
120

    
121
        public void process() throws InterruptedException {
122
                RasterTaskQueue.register(rasterTask);
123
                RasterBuffer inputBuffer=null;
124
                try{
125
                
126
                        //Comprobar que est?n todas las variables asignadas
127
                        for (Iterator iter = tree.getParser().getSymbolTable().values().iterator(); iter.hasNext();) {
128
                                Variable variable = (Variable) iter.next();        
129
                                if (!varsTable.containsKey(variable.getName()))
130
                                        try {
131
                                                throw new NoAssignedVarsException();
132
                                        } catch (NoAssignedVarsException e) {
133
                                                RasterToolsUtil.messageBoxError(PluginServices.getText(this,"variables_sin_asignar"),this);
134
                                        }
135
                        }
136
                        
137
                        // Construccion del rasterbuffer que recoge el resultado del calculo 
138
                        rasterResult = RasterBuffer.getBuffer(RasterBuffer.TYPE_INT, resultExtent.getNX() ,resultExtent.getNY(), 1, true);
139
        
140
                                
141
                        // Calculo de grid resultante
142
                        int iNX = resultExtent.getNX();
143
                        int iNY = resultExtent.getNY();
144
                
145
                        // Calculo de grid resultante
146
                        for (int x=0;x<iNX;x++){
147
                                if (cancel) return;  //Proceso cancelado 
148
                                for(int y=0;y<iNY;y++){
149
                                        int i=0;
150
                                        for (Iterator iter = varsTable.keySet().iterator(); iter.hasNext();) {
151
                                                String varName = (String)iter.next();
152
                                                Object data[]= (Object[])varsTable.get(varName);
153
                                                inputBuffer= (RasterBuffer)data[0];
154
                                        
155
                                                int dataType= ((Integer)data[1]).intValue();
156
                                                double value=0;
157
                                        
158
                                                //        BUFFER TIPO_BYTE
159
                                                if(dataType == RasterBuffer.TYPE_BYTE){                
160
                                                        value = inputBuffer.getElemByte(y, x, 0);                        
161
                                                        if(value!=inputBuffer.getNoDataValue()){        
162
                                                                tree.setVarValue(varName,new Double(value));
163
                                                                i++;                                        
164
                                                        }
165
                                                                                                
166
                                                        else{                                        
167
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
168
                                                                break;        
169
                                                        }                                        
170
                                                }
171
                                                // BUFFER TIPO_SHORT
172
                                                else if(dataType == RasterBuffer.TYPE_SHORT){                
173
                                                        value = inputBuffer.getElemShort(y, x, 0);                        
174
                                                        if(value!=inputBuffer.getNoDataValue()){        
175
                                                                tree.setVarValue(varName,new Double(value));
176
                                                                i++;                                        
177
                                                        }
178
                                                                                                
179
                                                        else{                                        
180
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
181
                                                                break;        
182
                                                        }                                        
183
                                                }
184
                                                // BUFFER TIPO_INT
185
                                                else if(dataType == RasterBuffer.TYPE_INT){                
186
                                                        value = inputBuffer.getElemInt(y, x, 0);                        
187
                                                        if(value!=inputBuffer.getNoDataValue()){        
188
                                                                tree.setVarValue(varName,new Double(value));
189
                                                                i++;                                        
190
                                                        }
191
                                                                                                
192
                                                        else{                                        
193
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
194
                                                                break;        
195
                                                        }                                        
196
                                                }
197
                                                // BUFFER TIPO_FLOAT
198
                                                else if(dataType == RasterBuffer.TYPE_FLOAT){                
199
                                                        value = inputBuffer.getElemFloat(y, x, 0);                        
200
                                                        if(value!=inputBuffer.getNoDataValue()){        
201
                                                                tree.setVarValue(varName,new Double(value));
202
                                                                i++;                                        
203
                                                        }
204
                                                                                                
205
                                                        else{                                        
206
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
207
                                                                break;        
208
                                                        }                                        
209
                                                }
210
                                                // BUFFER TIPO_DOUBLE
211
                                                else if(dataType == RasterBuffer.TYPE_DOUBLE){                
212
                                                        value = inputBuffer.getElemDouble(y, x, 0);                        
213
                                                        if(value!=inputBuffer.getNoDataValue()){        
214
                                                                tree.setVarValue(varName,new Double(value));
215
                                                                i++;                                        
216
                                                        }
217
                                                                                                
218
                                                        else{                                        
219
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
220
                                                                break;        
221
                                                        }                                        
222
                                                }
223
                                        }
224
                                        
225
                                        // Evaluacion de la exprsion en el x,y.
226
                                        if (i == varsTable.size()){
227
                                                rasterResult.setElem(y, x, 0, tree.execute());
228
                                                percent = x*100/rasterResult.getWidth();
229
                                        }        
230
                                        
231
                                }
232
                        }
233
                        loadLAyer();
234
                }finally{
235
                        externalActions.end(fileName);
236
                }
237
        }
238
}