Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / hydrology / strahlerOrder / StrahlerOrderAlgorithm.java @ 59

History | View | Annotate | Download (3.28 KB)

1
package es.unex.sextante.hydrology.strahlerOrder;
2

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

    
10
public class StrahlerOrderAlgorithm
11
         extends
12
            GeoAlgorithm {
13

    
14
   private final static int   m_iOffsetX[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
15
   private final static int   m_iOffsetY[] = { 1, 1, 0, -1, -1, -1, 0, 1 };
16

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

    
20
   private int                m_iNX, m_iNY;
21

    
22
   private IRasterLayer       m_DEM        = null;
23
   private IRasterLayer       m_Strahler;
24

    
25

    
26
   @Override
27
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
28

    
29
      int x, y;
30

    
31
      m_DEM = m_Parameters.getParameterValueAsRasterLayer(DEM);
32

    
33
      m_Strahler = getNewRasterLayer(RESULT, Sextante.getText("Strahler_Order"), IRasterLayer.RASTER_DATA_TYPE_INT);
34

    
35
      m_Strahler.assign(0.0);
36

    
37
      final AnalysisExtent extent = m_Strahler.getWindowGridExtent();
38

    
39
      m_DEM.setWindowExtent(extent);
40

    
41
      m_iNX = m_DEM.getNX();
42
      m_iNY = m_DEM.getNY();
43

    
44
      for (y = 0; (y < m_iNY) && setProgress(y, m_iNY); y++) {
45
         for (x = 0; x < m_iNX; x++) {
46
            getStrahlerOrder(x, y);
47
         }
48
      }
49

    
50
      return !m_Task.isCanceled();
51

    
52
   }
53

    
54

    
55
   @Override
56
   public void defineCharacteristics() {
57

    
58
      setName(Sextante.getText("Strahler_Order"));
59
      setGroup(Sextante.getText("Indices_and_other_hydrological_parameters"));
60
      setUserCanDefineAnalysisExtent(true);
61

    
62
      try {
63
         m_Parameters.addInputRasterLayer(DEM, Sextante.getText("Elevation"), true);
64
         addOutputRasterLayer(RESULT, Sextante.getText("Strahler_Order"));
65
      }
66
      catch (final RepeatedParameterNameException e) {
67
         Sextante.addErrorToLog(e);
68
      }
69

    
70
   }
71

    
72

    
73
   private void getStrahlerOrder(final int x,
74
                                 final int y) {
75

    
76
      int i;
77
      int ix, iy;
78
      int iDirection;
79
      int iMaxOrder = 1;
80
      int iOrder = 1;
81
      int iMaxOrderCells = 0;
82

    
83
      if (m_DEM.isNoDataValue(m_DEM.getCellValueAsDouble(x, y))) {
84
         return;
85
      }
86

    
87
      if (m_Strahler.getCellValueAsInt(x, y) == 0) {
88
         ;
89
         m_Strahler.setCellValue(x, y, iMaxOrder);
90
         for (i = 0; i < 8; i++) {
91
            ix = x + m_iOffsetX[i];
92
            iy = y + m_iOffsetY[i];
93
            iDirection = m_DEM.getDirToNextDownslopeCell(ix, iy);
94
            if (iDirection == (i + 4) % 8) {
95
               getStrahlerOrder(ix, iy);
96
               iOrder = m_Strahler.getCellValueAsInt(ix, iy);
97
               if (iOrder > iMaxOrder) {
98
                  iMaxOrder = iOrder;
99
                  iMaxOrderCells = 1;
100
               }
101
               else if (iOrder == iMaxOrder) {
102
                  iMaxOrderCells++;
103
               }
104
            }
105
         }
106

    
107
         if (iMaxOrderCells > 1) {
108
            iMaxOrder++;
109
         }
110

    
111
         m_Strahler.setCellValue(x, y, iMaxOrder);
112

    
113
      }
114

    
115
      //return iMaxOrder;
116

    
117
   }
118

    
119
}