Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / vectorTools / lineAverageSlope / LineAverageSlopeAlgorithm.java @ 59

History | View | Annotate | Download (6.95 KB)

1

    
2

    
3
package es.unex.sextante.vectorTools.lineAverageSlope;
4

    
5
import java.util.ArrayList;
6

    
7
import com.vividsolutions.jts.geom.Coordinate;
8
import com.vividsolutions.jts.geom.Geometry;
9
import com.vividsolutions.jts.geom.GeometryFactory;
10
import com.vividsolutions.jts.geom.Point;
11

    
12
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
13
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer;
14
import es.unex.sextante.core.GeoAlgorithm;
15
import es.unex.sextante.core.Sextante;
16
import es.unex.sextante.dataObjects.IFeature;
17
import es.unex.sextante.dataObjects.IFeatureIterator;
18
import es.unex.sextante.dataObjects.IRasterLayer;
19
import es.unex.sextante.dataObjects.IVectorLayer;
20
import es.unex.sextante.dataObjects.vectorFilters.BoundingBoxFilter;
21
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
22
import es.unex.sextante.exceptions.RepeatedParameterNameException;
23
import es.unex.sextante.math.simpleStats.SimpleStats;
24
import es.unex.sextante.outputs.OutputVectorLayer;
25

    
26

    
27
public class LineAverageSlopeAlgorithm
28
         extends
29
            GeoAlgorithm {
30

    
31
   public static final String  RESULT   = "RESULT";
32
   public static final String  DISTANCE = "DISTANCE";
33
   public static final String  DEM      = "DEM";
34
   public static final String  LINES    = "LINES";
35
   private static final double NODATA   = -99999;
36

    
37
   private IVectorLayer        m_Output;
38
   private double              m_dDist;
39
   private IRasterLayer        m_DEM;
40

    
41

    
42
   @Override
43
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
44

    
45
      int i;
46

    
47
      IVectorLayer lines;
48

    
49
      try {
50
         m_dDist = m_Parameters.getParameterValueAsDouble(DISTANCE);
51
         lines = m_Parameters.getParameterValueAsVectorLayer(LINES);
52
         m_DEM = m_Parameters.getParameterValueAsRasterLayer(DEM);
53
         m_DEM.setFullExtent();
54

    
55
         if (!m_bIsAutoExtent) {
56
            lines.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
57
         }
58

    
59
         final Class[] types = new Class[lines.getFieldCount() + 2];
60
         final String[] sFields = new String[lines.getFieldCount() + 2];
61
         types[lines.getFieldCount()] = Double.class;
62
         sFields[lines.getFieldCount()] = Sextante.getText("Slope");
63
         types[lines.getFieldCount() + 1] = Double.class;
64
         sFields[lines.getFieldCount() + 1] = "Max " + Sextante.getText("Slope");
65
         for (int j = 0; j < lines.getFieldCount(); j++) {
66
            sFields[j] = lines.getFieldName(j);
67
            types[j] = lines.getFieldType(j);
68
         }
69
         m_Output = getNewVectorLayer(RESULT, lines.getName() + "[" + Sextante.getText("Slope") + "]",
70
                  IVectorLayer.SHAPE_TYPE_LINE, types, sFields);
71

    
72
         i = 0;
73
         final int iShapeCount = lines.getShapesCount();
74
         final IFeatureIterator iter = lines.iterator();
75
         while (iter.hasNext() && setProgress(i, iShapeCount)) {
76
            final IFeature feature = iter.next();
77
            final Geometry geom = feature.getGeometry();
78
            final SimpleStats stats = getSlopeStats(geom);
79
            final Object[] orgValues = feature.getRecord().getValues();
80
            final Object[] values = new Object[orgValues.length + 2];
81
            System.arraycopy(orgValues, 0, values, 0, orgValues.length);
82
            values[orgValues.length] = stats.getMean();
83
            values[orgValues.length + 1] = stats.getMax();
84
            m_Output.addFeature(geom, values);
85
            i++;
86
         }
87
      }
88
      catch (final Exception e) {
89
         throw new GeoAlgorithmExecutionException(e.getMessage());
90
      }
91

    
92
      return !m_Task.isCanceled();
93

    
94
   }
95

    
96

    
97
   private SimpleStats getSlopeStats(final Geometry geom) {
98

    
99
      int i, j;
100
      int iPoints;
101
      double dX1, dX2, dY1, dY2;
102
      double dAddedPointX, dAddedPointY;
103
      double dDX, dDY;
104
      double dRemainingDistFromLastSegment = 0;
105
      double dDistToNextPoint;
106
      double dDist;
107
      Point point;
108

    
109
      final Coordinate[] coords = geom.getCoordinates();
110

    
111
      final ArrayList<Point> points = new ArrayList<Point>();
112

    
113
      final GeometryFactory gf = new GeometryFactory();
114
      dAddedPointX = dX1 = coords[0].x;
115
      dAddedPointY = dY1 = coords[0].y;
116
      point = gf.createPoint(new Coordinate(dAddedPointX, dAddedPointY));
117
      points.add(point);
118
      for (i = 0; i < coords.length - 1; i++) {
119
         dX2 = coords[i + 1].x;
120
         dX1 = coords[i].x;
121
         dY2 = coords[i + 1].y;
122
         dY1 = coords[i].y;
123
         dDX = dX2 - dX1;
124
         dDY = dY2 - dY1;
125
         dDistToNextPoint = Math.sqrt(dDX * dDX + dDY * dDY);
126

    
127
         if (dRemainingDistFromLastSegment + dDistToNextPoint > m_dDist) {
128
            iPoints = (int) ((dRemainingDistFromLastSegment + dDistToNextPoint) / m_dDist);
129
            dDist = m_dDist - dRemainingDistFromLastSegment;
130
            for (j = 0; j < iPoints; j++) {
131
               dDist = m_dDist - dRemainingDistFromLastSegment;
132
               dDist += j * m_dDist;
133
               dAddedPointX = dX1 + dDist * dDX / dDistToNextPoint;
134
               dAddedPointY = dY1 + dDist * dDY / dDistToNextPoint;
135
               point = gf.createPoint(new Coordinate(dAddedPointX, dAddedPointY));
136
               points.add(point);
137
            }
138
            dDX = dX2 - dAddedPointX;
139
            dDY = dY2 - dAddedPointY;
140
            dRemainingDistFromLastSegment = Math.sqrt(dDX * dDX + dDY * dDY);
141
         }
142
         else {
143
            dRemainingDistFromLastSegment += dDistToNextPoint;
144
         }
145

    
146
      }
147

    
148
      final SimpleStats stats = new SimpleStats();
149
      for (int k = 0; k < points.size() - 1; k++) {
150
         point = points.get(k);
151
         final double dElevation = m_DEM.getValueAt(point.getX(), point.getY());
152
         final Point point2 = points.get(k + 1);
153
         final double dElevation2 = m_DEM.getValueAt(point2.getX(), point2.getY());
154
         dDist = Math.sqrt(Math.pow(point.getX() - point2.getX(), 2.) + Math.pow(point.getY() - point2.getY(), 2.));
155
         final double dSlope = Math.abs((dElevation2 - dElevation) / dDist);
156
         stats.addValue(dSlope);
157
      }
158

    
159
      return stats;
160

    
161
   }
162

    
163

    
164
   @Override
165
   public void defineCharacteristics() {
166

    
167
      setName(Sextante.getText("Average_slope_line"));
168
      setGroup(Sextante.getText("Tools_for_line_layers"));
169
      setUserCanDefineAnalysisExtent(true);
170

    
171
      try {
172
         m_Parameters.addInputVectorLayer(LINES, Sextante.getText("Lines"), AdditionalInfoVectorLayer.SHAPE_TYPE_LINE, true);
173
         m_Parameters.addNumericalValue(DISTANCE, Sextante.getText("Distance_between_points"),
174
                  AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE, 1, 0, Double.MAX_VALUE);
175
         m_Parameters.addInputRasterLayer(DEM, Sextante.getText("DEM"), true);
176
         addOutputVectorLayer(RESULT, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_LINE);
177
      }
178
      catch (final RepeatedParameterNameException e) {
179
         Sextante.addErrorToLog(e);
180
      }
181

    
182
   }
183

    
184
}