Statistics
| Revision:

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

History | View | Annotate | Download (4.28 KB)

1

    
2

    
3
package es.unex.sextante.gridTools.closeGapsNN;
4

    
5
import java.util.ArrayList;
6

    
7
import es.unex.sextante.core.GeoAlgorithm;
8
import es.unex.sextante.core.Sextante;
9
import es.unex.sextante.dataObjects.IRasterLayer;
10
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
11
import es.unex.sextante.exceptions.RepeatedParameterNameException;
12
import es.unex.sextante.rasterWrappers.GridCell;
13

    
14

    
15
public class CloseGapsNNAlgorithm
16
         extends
17
            GeoAlgorithm {
18

    
19
   private static final int   NO_DATA = -1;
20

    
21
   public static final String LAYER   = "LAYER";
22
   public static final String RESULT  = "RESULT";
23

    
24
   int                        m_iNX, m_iNY;
25
   IRasterLayer               m_Window;
26
   IRasterLayer               m_Result;
27
   IRasterLayer               m_Filled;
28
   ArrayList                  m_CentralPoints, m_AdjPoints;
29

    
30

    
31
   @Override
32
   public void defineCharacteristics() {
33

    
34
      setName(Sextante.getText("Void_filling_[nearest_neighbour]"));
35
      setGroup(Sextante.getText("Basic_tools_for_raster_layers"));
36
      setUserCanDefineAnalysisExtent(false);
37
      setIsDeterminatedProcess(false);
38

    
39
      try {
40
         m_Parameters.addInputRasterLayer(LAYER, Sextante.getText("Layer"), true);
41
         addOutputRasterLayer(RESULT, Sextante.getText("Filled_layer"));
42
      }
43
      catch (final RepeatedParameterNameException e) {
44
         Sextante.addErrorToLog(e);
45
      }
46

    
47
   }
48

    
49

    
50
   @Override
51
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
52

    
53
      int x, y;
54
      double dValue;
55

    
56
      m_CentralPoints = new ArrayList();
57
      m_AdjPoints = new ArrayList();
58

    
59
      m_Window = m_Parameters.getParameterValueAsRasterLayer(LAYER);
60
      m_Window.setFullExtent();
61
      m_Result = getNewRasterLayer(RESULT, m_Window.getName() + Sextante.getText("[filled]"), m_Window.getDataType(),
62
               m_Window.getWindowGridExtent());
63
      m_Filled = getTempRasterLayer(IRasterLayer.RASTER_DATA_TYPE_INT, m_Window.getWindowGridExtent());
64

    
65

    
66
      m_iNX = m_Window.getNX();
67
      m_iNY = m_Window.getNY();
68

    
69
      m_Filled.setNoDataValue(NO_DATA);
70
      m_Filled.assignNoData();
71

    
72
      m_Result.setNoDataValue(NO_DATA);
73
      m_Result.assignNoData();
74

    
75
      for (y = 0; y < m_iNY; y++) {
76
         for (x = 0; x < m_iNX; x++) {
77
            dValue = m_Window.getCellValueAsDouble(x, y);
78
            if (!m_Window.isNoDataValue(dValue)) {
79
               m_CentralPoints.add(new GridCell(x, y, dValue));
80
               m_Filled.setCellValue(x, y, 0.0);
81
               m_Result.setCellValue(x, y, dValue);
82
            }
83
         }
84
      }
85

    
86
      closeGaps();
87

    
88
      return !m_Task.isCanceled();
89

    
90
   }
91

    
92

    
93
   private void closeGaps() {
94

    
95
      int i, j;
96
      int iPt;
97
      int x, y, x2, y2;
98
      double dValue;
99
      double dAccCost;
100
      double dPrevAccCost;
101
      GridCell cell;
102

    
103
      final double dDist[][] = new double[3][3];
104

    
105
      for (i = -1; i < 2; i++) {
106
         for (j = -1; j < 2; j++) {
107
            dDist[i + 1][j + 1] = Math.sqrt(i * i + j * j);
108
         }
109
      }
110

    
111
      while ((m_CentralPoints.size() != 0) && !m_Task.isCanceled()) {
112
         for (iPt = 0; iPt < m_CentralPoints.size(); iPt++) {
113
            cell = (GridCell) m_CentralPoints.get(iPt);
114
            x = cell.getX();
115
            y = cell.getY();
116
            dValue = cell.getValue();
117
            for (i = -1; i < 2; i++) {
118
               for (j = -1; j < 2; j++) {
119
                  x2 = x + i;
120
                  y2 = y + j;
121
                  if (m_Window.isInWindow(x2, y2)) {
122
                     dAccCost = m_Filled.getCellValueAsDouble(x, y);
123
                     dAccCost += dDist[i + 1][j + 1];
124
                     dPrevAccCost = m_Filled.getCellValueAsDouble(x2, y2);
125
                     if (m_Filled.isNoDataValue(dPrevAccCost) || (dPrevAccCost > dAccCost)) {
126
                        m_Filled.setCellValue(x2, y2, dAccCost);
127
                        m_Result.setCellValue(x2, y2, dValue);
128
                        m_AdjPoints.add(new GridCell(x2, y2, dValue));
129
                     }
130
                  }
131
               }
132
            }
133
         }
134

    
135
         m_CentralPoints = m_AdjPoints;
136
         m_AdjPoints = new ArrayList();
137

    
138
         if (m_Task.isCanceled()) {
139
            return;
140
         }
141

    
142
      }
143

    
144
   }
145

    
146
}