Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / gridAnalysis / cva / CVAAlgorithm.java @ 59

History | View | Annotate | Download (3.45 KB)

1
package es.unex.sextante.gridAnalysis.cva;
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 CVAAlgorithm
11
         extends
12
            GeoAlgorithm {
13

    
14
   public static final String A1    = "A1";
15
   public static final String A2    = "A2";
16
   public static final String B1    = "B1";
17
   public static final String B2    = "B2";
18
   public static final String ANGLE = "ANGLE";
19
   public static final String DIST  = "DIST";
20

    
21

    
22
   @Override
23
   public void defineCharacteristics() {
24

    
25
      setName(Sextante.getText("Change_Vector_Analysis"));
26
      setGroup(Sextante.getText("Raster_layer_analysis"));
27
      setUserCanDefineAnalysisExtent(true);
28

    
29
      try {
30
         m_Parameters.addInputRasterLayer(A1, Sextante.getText("Layer_1__init"), true);
31
         m_Parameters.addInputRasterLayer(A2, Sextante.getText("Layer_2__init"), true);
32
         m_Parameters.addInputRasterLayer(B1, Sextante.getText("Layer_1__final"), true);
33
         m_Parameters.addInputRasterLayer(B2, Sextante.getText("Layer_2__final"), true);
34
         addOutputRasterLayer(ANGLE, Sextante.getText("Angle"));
35
         addOutputRasterLayer(DIST, Sextante.getText("Modulus"));
36
      }
37
      catch (final RepeatedParameterNameException e) {
38
         Sextante.addErrorToLog(e);
39
      }
40

    
41
   }
42

    
43

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

    
47
      int x, y;
48
      double dAngle, dDist;
49
      double a1, a2, b1, b2;
50
      int iNX, iNY;
51
      IRasterLayer layerA1, layerA2, layerB1, layerB2;
52
      IRasterLayer Angle, Distance;
53

    
54
      layerA1 = m_Parameters.getParameterValueAsRasterLayer(A1);
55
      layerA2 = m_Parameters.getParameterValueAsRasterLayer(A2);
56
      layerB1 = m_Parameters.getParameterValueAsRasterLayer(B1);
57
      layerB2 = m_Parameters.getParameterValueAsRasterLayer(B2);
58

    
59
      Distance = getNewRasterLayer(DIST, Sextante.getText("Modulus"), IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
60
      Angle = getNewRasterLayer(ANGLE, Sextante.getText("Angle"), IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
61

    
62
      final AnalysisExtent extent = Distance.getWindowGridExtent();
63

    
64
      layerA1.setWindowExtent(extent);
65
      layerA2.setWindowExtent(extent);
66
      layerB1.setWindowExtent(extent);
67
      layerB2.setWindowExtent(extent);
68

    
69
      iNX = extent.getNX();
70
      iNY = extent.getNY();
71

    
72
      for (y = 0; (y < iNY) && setProgress(y, iNY); y++) {
73
         for (x = 0; x < iNX; x++) {
74
            a1 = layerA1.getCellValueAsDouble(x, y);
75
            a2 = layerA2.getCellValueAsDouble(x, y);
76
            b1 = layerB1.getCellValueAsDouble(x, y);
77
            b2 = layerB2.getCellValueAsDouble(x, y);
78
            if (layerA1.isNoDataValue(a1) || layerA2.isNoDataValue(a2) || layerB1.isNoDataValue(b1) || layerB2.isNoDataValue(b2)) {
79
               Distance.setNoData(x, y);
80
               Angle.setNoData(x, y);
81
            }
82
            else {
83
               dDist = Math.sqrt((a1 - a2) * (a1 - a2) + (b1 - b2) * (b1 - b2));
84
               dAngle = Math.atan((a1 - a2) / (b1 - b2));
85
               Distance.setCellValue(x, y, dDist);
86
               Angle.setCellValue(x, y, dAngle);
87
            }
88

    
89
         }
90
      }
91

    
92
      return !m_Task.isCanceled();
93

    
94
   }
95

    
96

    
97
}