Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / gridStatistics / base / MultiGridStatsBaseAlgorithm.java @ 59

History | View | Annotate | Download (3.47 KB)

1

    
2

    
3
package es.unex.sextante.gridStatistics.base;
4

    
5
import java.awt.image.DataBuffer;
6
import java.util.ArrayList;
7

    
8
import es.unex.sextante.additionalInfo.AdditionalInfoMultipleInput;
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

    
16
public abstract class MultiGridStatsBaseAlgorithm
17
         extends
18
            GeoAlgorithm {
19

    
20
   public static final String INPUT        = "INPUT";
21
   public static final String FORCE_NODATA = "NODATA";
22
   public static final String RESULT       = "RESULT";
23

    
24

    
25
   protected double           NO_DATA;
26

    
27

    
28
   @Override
29
   public void defineCharacteristics() {
30

    
31
      setUserCanDefineAnalysisExtent(true);
32

    
33
      try {
34
         m_Parameters.addMultipleInput(INPUT, Sextante.getText("Layers"), AdditionalInfoMultipleInput.DATA_TYPE_RASTER, true);
35
         m_Parameters.addBoolean(FORCE_NODATA, Sextante.getText("Force_no-data_value"), true);
36
         addOutputRasterLayer(RESULT, this.getName());
37
      }
38
      catch (final RepeatedParameterNameException e) {
39
         Sextante.addErrorToLog(e);
40
      }
41

    
42
   }
43

    
44

    
45
   @Override
46
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
47

    
48
      int i;
49
      int x, y;
50
      int iNX, iNY;
51
      double dValue;
52
      IRasterLayer[] window;
53

    
54
      NO_DATA = m_OutputFactory.getDefaultNoDataValue();
55

    
56
      final ArrayList input = m_Parameters.getParameterValueAsArrayList("INPUT");
57
      final boolean bForceNoData = m_Parameters.getParameterValueAsBoolean("NODATA");
58

    
59
      if (input.size() == 0) {
60
         return false;
61
      }
62

    
63
      final IRasterLayer result = getNewRasterLayer(RESULT, this.getName(), IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
64

    
65
      result.setNoDataValue(m_OutputFactory.getDefaultNoDataValue());
66
      result.assignNoData();
67

    
68
      window = new IRasterLayer[input.size()];
69
      for (i = 0; i < input.size(); i++) {
70
         window[i] = (IRasterLayer) input.get(i);
71
         window[i].setWindowExtent(result.getWindowGridExtent());
72
         if ((window[i].getDataType() == DataBuffer.TYPE_FLOAT) || (window[i].getDataType() == DataBuffer.TYPE_DOUBLE)) {
73
            window[i].setInterpolationMethod(IRasterLayer.INTERPOLATION_BSpline);
74
         }
75
         else {
76
            window[i].setInterpolationMethod(IRasterLayer.INTERPOLATION_NearestNeighbour);
77
         }
78
      }
79

    
80
      iNX = window[0].getNX();
81
      iNY = window[0].getNY();
82

    
83
      final double dValues[] = new double[input.size()];
84

    
85
      for (y = 0; (y < iNY) && setProgress(y, iNY); y++) {
86
         for (x = 0; x < iNX; x++) {
87
            for (i = 0; i < window.length; i++) {
88
               dValue = window[i].getCellValueAsDouble(x, y);
89
               if (!window[i].isNoDataValue(dValue)) {
90
                  dValues[i] = dValue;
91
               }
92
               else {
93
                  if (bForceNoData) {
94
                     result.setNoData(x, y);
95
                     break;
96
                  }
97
                  else {
98
                     dValues[i] = m_OutputFactory.getDefaultNoDataValue();
99
                  }
100
               }
101
            }
102
            result.setCellValue(x, y, processValues(dValues));
103
         }
104

    
105
      }
106

    
107
      return !m_Task.isCanceled();
108

    
109

    
110
   }
111

    
112

    
113
   protected abstract double processValues(double[] dValues);
114

    
115

    
116
}