Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / gridAnalysis / ahp / AHPAlgorithm.java @ 59

History | View | Annotate | Download (7.36 KB)

1
package es.unex.sextante.gridAnalysis.ahp;
2

    
3
import java.util.ArrayList;
4

    
5
import es.unex.sextante.additionalInfo.AdditionalInfoMultipleInput;
6
import es.unex.sextante.core.GeoAlgorithm;
7
import es.unex.sextante.core.Sextante;
8
import es.unex.sextante.dataObjects.IRasterLayer;
9
import es.unex.sextante.dataObjects.IRecordsetIterator;
10
import es.unex.sextante.dataObjects.ITable;
11
import es.unex.sextante.docEngines.html.HTMLDoc;
12
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
13
import es.unex.sextante.exceptions.RepeatedParameterNameException;
14
import es.unex.sextante.rasterWrappers.GridWrapper;
15

    
16
public class AHPAlgorithm
17
         extends
18
            GeoAlgorithm {
19

    
20
   public static final String  INPUT    = "INPUT";
21
   public static final String  PAIRWISE = "PAIRWISE";
22
   public static final String  RESULT   = "RESULT";
23
   public static final String  STATS    = "STATS";
24

    
25
   private static final double RI[]     = new double[] { 0.0, 0.0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51, 1.48,
26
            1.56, 1.57, 1.59           };
27

    
28
   private String              m_sNames[];
29
   private double              m_dWeights[];
30
   private ITable              m_Pairwise;
31
   private double              m_dPairwise[][];
32
   private ArrayList           layers;
33

    
34

    
35
   @Override
36
   public void defineCharacteristics() {
37

    
38
      setName(Sextante.getText("Analytical_Hierarchy_Process__AHP"));
39
      setGroup(Sextante.getText("Raster_layer_analysis"));
40
      setUserCanDefineAnalysisExtent(true);
41

    
42
      try {
43
         m_Parameters.addMultipleInput(INPUT, Sextante.getText("Layers"), AdditionalInfoMultipleInput.DATA_TYPE_RASTER, true);
44
         m_Parameters.addInputTable(PAIRWISE, Sextante.getText("Pairwise_comparisons"), true);
45
         addOutputRasterLayer(RESULT, Sextante.getText("Result"));
46
         addOutputText(STATS, Sextante.getText("Statistics"));
47
      }
48
      catch (final RepeatedParameterNameException e) {
49
         Sextante.addErrorToLog(e);
50
      }
51

    
52
   }
53

    
54

    
55
   @Override
56
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
57

    
58
      int i;
59
      int x, y;
60
      double dResult;
61
      double dValues[];
62
      boolean bNoDataValue;
63
      IRasterLayer windows[];
64

    
65
      layers = m_Parameters.getParameterValueAsArrayList(INPUT);
66
      m_Pairwise = m_Parameters.getParameterValueAsTable(PAIRWISE);
67
      if ((layers.size() == 0) || (layers.size() > RI.length)) {
68
         throw new GeoAlgorithmExecutionException(Sextante.getText("Error_wrong_number_of_layers"));
69
      }
70

    
71
      getWeights();
72
      final IRasterLayer result = getNewRasterLayer(RESULT, Sextante.getText("Analytical_Hierarchy_Process"),
73
               IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
74

    
75
      windows = new IRasterLayer[layers.size()];
76

    
77
      for (i = 0; i < layers.size(); i++) {
78
         windows[i] = (IRasterLayer) layers.get(i);
79
         windows[i].setWindowExtent(result.getWindowGridExtent());
80
         windows[i].setInterpolationMethod(GridWrapper.INTERPOLATION_BSpline);
81
      }
82

    
83
      final int iNX = result.getWindowGridExtent().getNX();
84
      final int iNY = result.getWindowGridExtent().getNY();
85

    
86
      dValues = new double[layers.size()];
87

    
88
      for (y = 0; (y < iNY) && setProgress(y, iNY); y++) {
89
         for (x = 0; x < iNX; x++) {
90
            bNoDataValue = false;
91
            for (i = 0; i < dValues.length; i++) {
92
               dValues[i] = windows[i].getCellValueAsDouble(x, y);
93
               if (windows[i].isNoDataValue(dValues[i])) {
94
                  bNoDataValue = true;
95
                  break;
96
               }
97
            }
98
            if (bNoDataValue) {
99
               result.setNoData(x, y);
100
            }
101
            else {
102
               dResult = 0;
103
               for (i = 0; i < dValues.length; i++) {
104
                  dResult += (dValues[i] * m_dWeights[i]);
105
               }
106
               result.setCellValue(x, y, dResult);
107
            }
108
         }
109
      }
110

    
111
      showInfo();
112

    
113
      return !m_Task.isCanceled();
114

    
115
   }
116

    
117

    
118
   private void getWeights() throws GeoAlgorithmExecutionException {
119

    
120
      int i, j;
121
      int iRow, iCol;
122
      final int iField[] = new int[layers.size()];
123
      boolean bMatchFound;
124
      IRasterLayer layer;
125
      String sName;
126
      String sFieldName;
127
      Object[] record;
128
      m_dPairwise = new double[layers.size()][layers.size()];
129

    
130
      m_sNames = new String[layers.size()];
131
      for (i = 0; i < layers.size(); i++) {
132
         layer = (IRasterLayer) layers.get(i);
133
         sName = layer.getName();
134
         m_sNames[i] = sName;
135
         bMatchFound = false;
136
         for (j = 0; j < m_Pairwise.getFieldCount(); j++) {
137
            sFieldName = m_Pairwise.getFieldName(j);
138
            if (sName.equals(sFieldName)) {
139
               bMatchFound = true;
140
               iField[i] = j;
141
               break;
142
            }
143
         }
144
         if (!bMatchFound) {
145
            throw new GeoAlgorithmExecutionException("AHP Could not Assign weights");
146
         }
147
      }
148

    
149
      i = 0;
150
      final IRecordsetIterator iter = m_Pairwise.iterator();
151
      while (iter.hasNext()) {
152
         record = iter.next().getValues();
153
         for (j = 0; j < iField.length; j++) {
154
            m_dPairwise[i][j] = new Double(record[iField[i]].toString()).doubleValue();
155
         }
156
         i++;
157
      }
158
      iter.close();
159

    
160
      final double[] dSum = new double[m_dPairwise.length];
161
      for (iCol = 0; iCol < m_dPairwise.length; iCol++) {
162
         for (iRow = 0; iRow < m_dPairwise.length; iRow++) {
163
            dSum[iCol] += m_dPairwise[iRow][iCol];
164
         }
165
      }
166

    
167
      for (iCol = 0; iCol < m_dPairwise.length; iCol++) {
168
         for (iRow = 0; iRow < m_dPairwise.length; iRow++) {
169
            m_dPairwise[iRow][iCol] /= dSum[iCol];
170
         }
171
      }
172

    
173
      m_dWeights = new double[m_dPairwise.length];
174
      for (iRow = 0; iRow < m_dPairwise.length; iRow++) {
175
         for (iCol = 0; iCol < m_dPairwise.length; iCol++) {
176
            m_dWeights[iRow] += m_dPairwise[iRow][iCol];
177
         }
178
         m_dWeights[iRow] /= m_dPairwise.length;
179
      }
180

    
181
   }
182

    
183

    
184
   private void showInfo() {
185

    
186
      int i, j;
187
      double dSum;
188
      //DecimalFormat df = new DecimalFormat("##.###");
189
      final HTMLDoc doc = new HTMLDoc();
190
      doc.open("AHP");
191
      doc.addHeader("AHP", 2);
192
      doc.addHeader(Sextante.getText("Analytical_Hierarchy_Process_Weights"), 3);
193
      doc.startUnorderedList();
194
      for (i = 0; i < m_dWeights.length; i++) {
195
         doc.addListElement(m_sNames[i] + ": " + Double.toString(m_dWeights[i]));
196
      }
197
      doc.closeUnorderedList();
198

    
199
      double dRelSum = 0;
200

    
201
      for (i = 0; i < m_dPairwise.length; i++) {
202
         dSum = 0;
203
         for (j = 0; j < m_dPairwise.length; j++) {
204
            dSum += m_dWeights[j] * m_dPairwise[i][j];
205
         }
206
         dRelSum += dSum / m_dWeights[i];
207
      }
208
      final double dLambda = dRelSum / m_dWeights.length;
209
      final double dConsistency = (dLambda - m_dWeights.length) / (m_dWeights.length - 1);
210
      final double dCR = dConsistency / RI[m_dWeights.length];
211
      if (dCR < 0.10) {
212
         doc.addBoldText(Sextante.getText("Warning_Inconsistent_weighting_values"));
213
         Sextante.addWarningToLog("AHP:" + Sextante.getText("Warning_Inconsistent_weighting_values"));
214
      }
215
      doc.close();
216

    
217
      addOutputText(STATS, "AHP", doc.getHTMLCode());
218

    
219

    
220
   }
221

    
222
}