Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / morphometry / hypsometry / HypsometryAlgorithm.java @ 59

History | View | Annotate | Download (3.79 KB)

1
package es.unex.sextante.morphometry.hypsometry;
2

    
3
import es.unex.sextante.core.GeoAlgorithm;
4
import es.unex.sextante.core.Sextante;
5
import es.unex.sextante.dataObjects.IRasterLayer;
6
import es.unex.sextante.dataObjects.ITable;
7
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
8
import es.unex.sextante.exceptions.RepeatedParameterNameException;
9

    
10
public class HypsometryAlgorithm
11
         extends
12
            GeoAlgorithm {
13

    
14
   private static final int   CLASS_COUNT = 100;
15

    
16
   public static final String DEM         = "DEM";
17
   public static final String RESULT      = "RESULT";
18

    
19
   IRasterLayer               m_DEM       = null;
20
   private double             _DX2;
21

    
22

    
23
   @Override
24
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
25

    
26
      int x, y;
27
      int i;
28
      int A, a;
29
      int iNX, iNY;
30
      double z;
31
      double dMin = 0, dMax = 0;
32
      double dDz, dZa;
33
      long Count[];
34
      Object[] values;
35
      final String sFields[] = { Sextante.getText("Relative_elevation"), Sextante.getText("Relative_area"),
36
               Sextante.getText("Absolute_elevation"), Sextante.getText("Absolute_area") };
37
      final Class iTypes[] = { Double.class, Double.class, Double.class, Double.class };
38

    
39
      Count = new long[CLASS_COUNT + 1];
40
      values = new Object[4];
41

    
42
      m_DEM = m_Parameters.getParameterValueAsRasterLayer(DEM);
43
      m_DEM.setFullExtent();
44

    
45
      iNX = m_DEM.getNX();
46
      iNY = m_DEM.getNY();
47

    
48
      _DX2 = m_DEM.getWindowCellSize() * m_DEM.getWindowCellSize();
49

    
50
      A = 0;
51

    
52
      for (y = 0; (y < iNY) && setProgress(y, iNY); y++) {
53
         for (x = 0; x < iNX; x++) {
54
            z = m_DEM.getCellValueAsFloat(x, y);
55
            if (!m_DEM.isNoDataValue(z)) {
56
               if (A <= 0) {
57
                  dMin = dMax = z;
58
               }
59
               else {
60
                  if (dMin > z) {
61
                     dMin = z;
62
                  }
63
                  else if (dMax < z) {
64
                     dMax = z;
65
                  }
66
               }
67
               A++;
68
            }
69
         }
70

    
71
      }
72

    
73
      if ((A > 0) && (dMin < dMax)) {
74

    
75
         for (y = 0; y < iNY; y++) {
76
            for (x = 0; x < iNX; x++) {
77
               z = m_DEM.getCellValueAsFloat(x, y);
78
               if (!m_DEM.isNoDataValue(z)) {
79
                  i = (int) (CLASS_COUNT * (dMax - z) / (dMax - dMin));
80
                  Count[i]++;
81
               }
82
            }
83
         }
84

    
85
         dDz = (dMax - dMin) / CLASS_COUNT;
86
         a = A;
87

    
88
         final String sTableName = Sextante.getText("Hypsometry_[") + m_DEM.getName() + "]";
89
         final ITable table = getNewTable(RESULT, sTableName, iTypes, sFields);
90

    
91
         for (i = CLASS_COUNT; i >= 0; i--) {
92
            dZa = (double) a / (double) A;
93
            a -= Count[i];
94

    
95
            values[0] = new Double(100.0 * i * dDz / (dMax - dMin)); // Relative Height;
96
            values[1] = new Double(100.0 * dZa); // Relative Area
97
            values[2] = new Double(dMin + i * dDz); // Absolute Height
98
            values[3] = new Double(a * _DX2); // Absolute Area
99
            table.addRecord(values);
100

    
101
         }
102

    
103

    
104
         return !m_Task.isCanceled();
105

    
106
      }
107
      else {
108
         return false;
109
      }
110

    
111

    
112
   }
113

    
114

    
115
   @Override
116
   public void defineCharacteristics() {
117

    
118
      setName(Sextante.getText("Hypsometry"));
119
      setGroup(Sextante.getText("Geomorphometry_and_terrain_analysis"));
120

    
121
      try {
122
         m_Parameters.addInputRasterLayer(DEM, Sextante.getText("Elevation"), true);
123
         this.setUserCanDefineAnalysisExtent(false);
124
         addOutputTable(RESULT, Sextante.getText("Hypsometry"));
125
      }
126
      catch (final RepeatedParameterNameException e) {
127
         Sextante.addErrorToLog(e);
128
      }
129

    
130
   }
131

    
132
}