Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extRemoteSensing / src / org / gvsig / remotesensing / decisiontrees / DecisionTreeProcess.java @ 20393

History | View | Annotate | Download (7.16 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.buffer.WriterBufferServer;
51
import org.gvsig.raster.dataset.GeoRasterWriter;
52
import org.gvsig.raster.dataset.NotSupportedExtensionException;
53
import org.gvsig.raster.dataset.io.RasterDriverException;
54
import org.gvsig.raster.grid.GridExtent;
55
import org.gvsig.raster.process.RasterTaskQueue;
56
import org.gvsig.raster.util.RasterToolsUtil;
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 DecisionTreeProcess 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
                        // Construccion del rasterbuffer que recoge el resultado del calculo 
127
                        rasterResult = RasterBuffer.getBuffer(RasterBuffer.TYPE_INT, resultExtent.getNX() ,resultExtent.getNY(), 1, true);
128
                                
129
                        // Calculo de grid resultante
130
                        int iNX = resultExtent.getNX();
131
                        int iNY = resultExtent.getNY();
132
                
133
                        // Calculo de grid resultante
134
                        for (int x=0;x<iNX;x++){
135
                                if (cancel) return;  //Proceso cancelado 
136
                                for(int y=0;y<iNY;y++){
137
                                        int i=0;
138
                                        for (Iterator iter = varsTable.keySet().iterator(); iter.hasNext();) {
139
                                                String varName = (String)iter.next();
140
                                                Object data[]= (Object[])varsTable.get(varName);
141
                                                inputBuffer= (RasterBuffer)data[0];
142
                                        
143
                                                int dataType= ((Integer)data[1]).intValue();
144
                                                double value=0;
145
                                        
146
                                                //        BUFFER TIPO_BYTE
147
                                                if(dataType == RasterBuffer.TYPE_BYTE){                
148
                                                        value = inputBuffer.getElemByte(y, x, 0);                        
149
                                                        if(value!=inputBuffer.getNoDataValue()){        
150
                                                                tree.setVarValue(varName,new Double(value));
151
                                                                i++;                                        
152
                                                        }
153
                                                                                                
154
                                                        else{                                        
155
                                                                rasterResult.setElem(y, x, 0, rasterResult.noDataValue);
156
                                                                break;        
157
                                                        }                                        
158
                                                }
159
                                                // BUFFER TIPO_SHORT
160
                                                else if(dataType == RasterBuffer.TYPE_SHORT){                
161
                                                        value = inputBuffer.getElemShort(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_INT
173
                                                else if(dataType == RasterBuffer.TYPE_INT){                
174
                                                        value = inputBuffer.getElemInt(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_FLOAT
186
                                                else if(dataType == RasterBuffer.TYPE_FLOAT){                
187
                                                        value = inputBuffer.getElemFloat(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_DOUBLE
199
                                                else if(dataType == RasterBuffer.TYPE_DOUBLE){                
200
                                                        value = inputBuffer.getElemDouble(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
                                        }
212
                                        
213
                                        // Evaluacion de la exprsion en el x,y.
214
                                        if (i == varsTable.size()){
215
                                                rasterResult.setElem(y, x, 0, tree.execute());
216
                                                percent = x*100/rasterResult.getWidth();
217
                                        }        
218
                                        
219
                                }
220
                        }
221
                        loadLAyer();
222
                }finally{
223
                        externalActions.end(fileName);
224
                }
225
        }
226
}