root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / tin / tinWithBreaklines / TinWithBreaklinesAlgorithm.java @ 59
History | View | Annotate | Download (5.3 KB)
1 |
|
---|---|
2 |
|
3 |
package es.unex.sextante.tin.tinWithBreaklines; |
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.triangulate.ConformingDelaunayTriangulationBuilder; |
11 |
|
12 |
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer; |
13 |
import es.unex.sextante.core.GeoAlgorithm; |
14 |
import es.unex.sextante.core.Sextante; |
15 |
import es.unex.sextante.dataObjects.IFeature; |
16 |
import es.unex.sextante.dataObjects.IFeatureIterator; |
17 |
import es.unex.sextante.dataObjects.IVectorLayer; |
18 |
import es.unex.sextante.dataObjects.vectorFilters.BoundingBoxFilter; |
19 |
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException; |
20 |
import es.unex.sextante.outputs.OutputVectorLayer; |
21 |
|
22 |
|
23 |
public class TinWithBreaklinesAlgorithm |
24 |
extends
|
25 |
GeoAlgorithm { |
26 |
|
27 |
public static final String POINTS = "POINTS"; |
28 |
public static final String LINES = "LINES"; |
29 |
public static final String TRIANGLES = "TRIANGLES"; |
30 |
public static final String ELEVATION_FIELD = "ELEVATION_FIELD"; |
31 |
|
32 |
private IVectorLayer m_Points = null; |
33 |
private IVectorLayer m_Lines = null; |
34 |
private IVectorLayer m_Triangles = null; |
35 |
private int m_iElevationField; |
36 |
|
37 |
|
38 |
@Override
|
39 |
public void defineCharacteristics() { |
40 |
|
41 |
setName(Sextante.getText("Create_tin_with_breaklines"));
|
42 |
setGroup(Sextante.getText("TIN"));
|
43 |
setUserCanDefineAnalysisExtent(true);
|
44 |
|
45 |
try {
|
46 |
m_Parameters.addInputVectorLayer(POINTS, Sextante.getText("Points_layer"), AdditionalInfoVectorLayer.SHAPE_TYPE_POINT,
|
47 |
true);
|
48 |
m_Parameters.addInputVectorLayer(LINES, Sextante.getText("Breaklines"), AdditionalInfoVectorLayer.SHAPE_TYPE_LINE, true); |
49 |
|
50 |
m_Parameters.addTableField(ELEVATION_FIELD, Sextante.getText("Height_field"), "POINTS"); |
51 |
|
52 |
addOutputVectorLayer(TRIANGLES, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_POLYGON);
|
53 |
} |
54 |
catch (final Exception e) { |
55 |
Sextante.addErrorToLog(e); |
56 |
} |
57 |
|
58 |
} |
59 |
|
60 |
|
61 |
@Override
|
62 |
public boolean processAlgorithm() throws GeoAlgorithmExecutionException { |
63 |
|
64 |
int i;
|
65 |
int iShapeCount;
|
66 |
final GeometryFactory gf = new GeometryFactory(); |
67 |
|
68 |
m_Points = m_Parameters.getParameterValueAsVectorLayer(POINTS); |
69 |
m_Lines = m_Parameters.getParameterValueAsVectorLayer(LINES); |
70 |
if (!m_bIsAutoExtent) {
|
71 |
m_Points.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
72 |
m_Lines.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
73 |
} |
74 |
m_iElevationField = m_Parameters.getParameterValueAsInt(ELEVATION_FIELD); |
75 |
|
76 |
final Class types[] = { Integer.class, String.class, Integer.class, Double.class }; |
77 |
final String sNames[] = { "ID", "HardLines", "type", "elevation" }; |
78 |
m_Triangles = getNewVectorLayer(TRIANGLES, "TIN_" + m_Points.getName(), IVectorLayer.SHAPE_TYPE_POLYGON, types, sNames);
|
79 |
|
80 |
i = 0;
|
81 |
final ArrayList<Geometry> pointsList = new ArrayList<Geometry>(); |
82 |
iShapeCount = m_Points.getShapesCount(); |
83 |
IFeatureIterator iter = m_Points.iterator(); |
84 |
while (iter.hasNext() && setProgress(i, iShapeCount)) {
|
85 |
final IFeature feature = iter.next();
|
86 |
final Coordinate coord = feature.getGeometry().getCoordinate();
|
87 |
try {
|
88 |
final double dElevation = Double.parseDouble(feature.getRecord().getValue(m_iElevationField).toString()); |
89 |
coord.z = dElevation; |
90 |
} |
91 |
catch (final Exception e) { |
92 |
throw new GeoAlgorithmExecutionException(Sextante.getText("Wrong_values_in_elevation_field")); |
93 |
} |
94 |
pointsList.add(gf.createPoint(coord)); |
95 |
i++; |
96 |
} |
97 |
iter.close(); |
98 |
|
99 |
final ArrayList<Geometry> linesList = new ArrayList<Geometry>(); |
100 |
iShapeCount = m_Lines.getShapesCount(); |
101 |
iter = m_Lines.iterator(); |
102 |
while (iter.hasNext() && setProgress(i, iShapeCount)) {
|
103 |
final IFeature feature = iter.next();
|
104 |
linesList.add(feature.getGeometry()); |
105 |
i++; |
106 |
} |
107 |
iter.close(); |
108 |
m_Task.setDeterminate(false);
|
109 |
final Geometry pointsGeomcol = gf.createGeometryCollection(pointsList.toArray(new Geometry[0])); |
110 |
final Geometry linesGeomcol = gf.createGeometryCollection(linesList.toArray(new Geometry[0])); |
111 |
final ConformingDelaunayTriangulationBuilder delaunay = new ConformingDelaunayTriangulationBuilder(); |
112 |
delaunay.setSites(pointsGeomcol); |
113 |
delaunay.setConstraints(linesGeomcol); |
114 |
final Geometry triangles = delaunay.getTriangles(gf);
|
115 |
|
116 |
final int iTriangles = triangles.getNumGeometries(); |
117 |
for (int iTriangle = 0; iTriangle < iTriangles; iTriangle++) { |
118 |
final Geometry triangle = triangles.getGeometryN(iTriangle);
|
119 |
final Object[] record = { new Integer(iTriangle), "", -1, getElevation(triangle) }; |
120 |
m_Triangles.addFeature(triangle, record); |
121 |
} |
122 |
|
123 |
return !m_Task.isCanceled();
|
124 |
|
125 |
} |
126 |
|
127 |
|
128 |
/* return elevation as average of all 3 triangle vertices */
|
129 |
private double getElevation(final Geometry triangle) { |
130 |
|
131 |
final Coordinate[] coords = triangle.getCoordinates(); |
132 |
return (coords[0].z + coords[1].z + coords[2].z) / 3.; |
133 |
|
134 |
} |
135 |
|
136 |
} |