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 | 59 | nbrodin | |
---|---|---|---|
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 | } |