Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / gridTools / aggregate / AggregateAlgorithm.java @ 59

History | View | Annotate | Download (5.62 KB)

1
package es.unex.sextante.gridTools.aggregate;
2

    
3
import java.util.HashMap;
4
import java.util.Iterator;
5
import java.util.Set;
6

    
7
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
8
import es.unex.sextante.core.AnalysisExtent;
9
import es.unex.sextante.core.GeoAlgorithm;
10
import es.unex.sextante.core.Sextante;
11
import es.unex.sextante.dataObjects.IRasterLayer;
12
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
13
import es.unex.sextante.exceptions.RepeatedParameterNameException;
14

    
15
public class AggregateAlgorithm
16
         extends
17
            GeoAlgorithm {
18

    
19
   public static final String GRID   = "GRID";
20
   public static final String METHOD = "METHOD";
21
   public static final String SIZE   = "SIZE";
22
   public static final String RESULT = "RESULT";
23

    
24
   public static final int    SUM    = 0;
25
   public static final int    MAX    = 1;
26
   public static final int    MIN    = 2;
27
   public static final int    MODE   = 3;
28

    
29

    
30
   @Override
31
   public void defineCharacteristics() {
32

    
33
      final String[] sMethod = { Sextante.getText("Sum"), Sextante.getText("Maximum"), Sextante.getText("Minimum"),
34
               Sextante.getText("Moda") };
35

    
36
      setName(Sextante.getText("Aggregate"));
37
      setGroup(Sextante.getText("Basic_tools_for_raster_layers"));
38
      setUserCanDefineAnalysisExtent(false);
39

    
40
      try {
41
         m_Parameters.addInputRasterLayer(GRID, Sextante.getText("Layer"), true);
42
         m_Parameters.addSelection(METHOD, Sextante.getText("M\u00e9todo"), sMethod);
43
         m_Parameters.addNumericalValue(SIZE, Sextante.getText("Aggregation_factor"),
44
                  AdditionalInfoNumericalValue.NUMERICAL_VALUE_INTEGER, 2, 2, Integer.MAX_VALUE);
45
         addOutputRasterLayer(RESULT, Sextante.getText("Aggregated_layer"));
46
      }
47
      catch (final RepeatedParameterNameException e) {
48
         Sextante.addErrorToLog(e);
49
      }
50

    
51
   }
52

    
53

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

    
57
      int x, y;
58
      int x2, y2;
59
      int i, j;
60
      int iNX, iNY;
61
      int iSize;
62
      int iMethod;
63
      double dMin, dMax;
64
      double dSum;
65
      double dValue;
66
      double dCellSize;
67
      Integer count;
68
      Double value;
69
      final HashMap map = new HashMap();
70
      AnalysisExtent resultExtent;
71
      IRasterLayer window;
72

    
73
      iSize = m_Parameters.getParameterValueAsInt(SIZE);
74
      iMethod = m_Parameters.getParameterValueAsInt(METHOD);
75
      window = m_Parameters.getParameterValueAsRasterLayer(GRID);
76

    
77
      window.setFullExtent();
78
      final AnalysisExtent ge = window.getLayerGridExtent();
79

    
80
      iNX = (int) Math.floor((window.getNX() / iSize));
81
      iNY = (int) Math.floor((window.getNY() / iSize));
82
      dCellSize = window.getLayerCellSize() * iSize;
83

    
84
      resultExtent = new AnalysisExtent();
85
      resultExtent.setCellSize(dCellSize);
86
      resultExtent.setXRange(ge.getXMin(), ge.getXMin() + iNX * dCellSize, true);
87
      resultExtent.setYRange(ge.getYMin(), ge.getYMin() + iNY * dCellSize, true);
88

    
89

    
90
      final String sName = window.getName() + Sextante.getText("[aggregated]");
91

    
92
      final IRasterLayer result = getNewRasterLayer(RESULT, sName, window.getDataType(), resultExtent);
93

    
94
      for (y = 0, y2 = 0; (y2 < iNY) && setProgress(y, iNY); y += iSize, y2++) {
95
         for (x = 0, x2 = 0; x2 < iNX; x += iSize, x2++) {
96
            dMax = dMin = window.getCellValueAsDouble(x, y);
97
            dSum = 0;
98
            for (i = 0; i < iSize; i++) {
99
               for (j = 0; j < iSize; j++) {
100
                  dValue = window.getCellValueAsDouble(x + i, y + j);
101
                  if (!window.isNoDataValue(dValue)) {
102
                     if (dValue > dMax) {
103
                        dMax = dValue;
104
                     }
105
                     if (dValue < dMin) {
106
                        dMin = dValue;
107
                     }
108
                     dSum += dValue;
109
                     value = new Double(dValue);
110
                     count = (Integer) map.get(new Double(dValue));
111
                     if (count != null) {
112
                        count = new Integer(count.intValue() + 1);
113
                     }
114
                     else {
115
                        count = new Integer(1);
116
                     }
117
                     map.put(new Double(dValue), count);
118

    
119
                  }
120
               }
121
            }
122

    
123

    
124
            int iCount;
125
            int iMaxCount = 0;
126
            double dMode = window.getNoDataValue();
127

    
128
            final Set set = map.keySet();
129
            final Iterator iter = set.iterator();
130

    
131
            while (iter.hasNext()) {
132
               value = (Double) iter.next();
133
               dValue = value.doubleValue();
134
               count = (Integer) map.get(value);
135
               if (count == null) {
136
                  count = new Integer(1);
137
               }
138
               iCount = count.intValue();
139
               if (iCount > iMaxCount) {
140
                  dMode = dValue;
141
                  iMaxCount = iCount;
142
               }
143
               map.put(value, new Integer(iCount + 1));
144
            }
145
            switch (iMethod) {
146
               case SUM:
147
                  result.setCellValue(x2, y2, dSum);
148
                  break;
149
               case MIN:
150
                  result.setCellValue(x2, y2, dMin);
151
                  break;
152
               case MAX:
153
                  result.setCellValue(x2, y2, dMax);
154
                  break;
155
               case MODE:
156
                  result.setCellValue(x, y, dMode);
157
               default:
158
                  break;
159
            }
160
         }
161
      }
162

    
163
      return !m_Task.isCanceled();
164

    
165

    
166
   }
167

    
168
}