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