Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRemoteSensing / src / org / gvsig / remotesensing / decisiontrees / CopyOfDecisionTreeProcess.java @ 18577

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

    
57
import org.gvsig.rastertools.clipping.WriterBufferServer;
58
import org.gvsig.remotesensing.gridmath.NoAssignedVarsException;
59
import org.nfunk.jep.Variable;
60

    
61
import com.iver.andami.PluginServices;
62

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

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

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

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

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

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

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