root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / vectorTools / delaunay / DelaunayAlgorithm.java @ 59
History | View | Annotate | Download (3.43 KB)
1 | 59 | nbrodin | |
---|---|---|---|
2 | |||
3 | package es.unex.sextante.vectorTools.delaunay; |
||
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.exceptions.RepeatedParameterNameException; |
||
21 | import es.unex.sextante.outputs.OutputVectorLayer; |
||
22 | |||
23 | |||
24 | public class DelaunayAlgorithm |
||
25 | extends
|
||
26 | GeoAlgorithm { |
||
27 | |||
28 | public static final String POINTS = "POINTS"; |
||
29 | public static final String TRIANGLES = "TRIANGLES"; |
||
30 | |||
31 | private IVectorLayer m_Points;
|
||
32 | private IVectorLayer m_Triangles;
|
||
33 | |||
34 | |||
35 | @Override
|
||
36 | public void defineCharacteristics() { |
||
37 | |||
38 | setName(Sextante.getText("Delaunay_triangulation"));
|
||
39 | setGroup(Sextante.getText("Tools_for_point_layers"));
|
||
40 | setUserCanDefineAnalysisExtent(true);
|
||
41 | |||
42 | try {
|
||
43 | m_Parameters.addInputVectorLayer(POINTS, Sextante.getText("Points_layer"), AdditionalInfoVectorLayer.SHAPE_TYPE_POINT,
|
||
44 | true);
|
||
45 | |||
46 | addOutputVectorLayer(TRIANGLES, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_POLYGON);
|
||
47 | } |
||
48 | catch (final RepeatedParameterNameException e) { |
||
49 | Sextante.addErrorToLog(e); |
||
50 | } |
||
51 | |||
52 | } |
||
53 | |||
54 | |||
55 | @Override
|
||
56 | public boolean processAlgorithm() throws GeoAlgorithmExecutionException { |
||
57 | |||
58 | int i;
|
||
59 | final int iShapeCount; |
||
60 | final GeometryFactory gf = new GeometryFactory(); |
||
61 | |||
62 | m_Points = m_Parameters.getParameterValueAsVectorLayer(POINTS); |
||
63 | if (!m_bIsAutoExtent) {
|
||
64 | m_Points.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
||
65 | } |
||
66 | |||
67 | final Class types[] = { Integer.class }; |
||
68 | final String sNames[] = { "ID" }; |
||
69 | m_Triangles = getNewVectorLayer(TRIANGLES, m_Points.getName() + "[" + Sextante.getText("triangulated") + "]", |
||
70 | IVectorLayer.SHAPE_TYPE_POLYGON, types, sNames); |
||
71 | |||
72 | i = 0;
|
||
73 | final ArrayList<Geometry> list = new ArrayList<Geometry>(); |
||
74 | iShapeCount = m_Points.getShapesCount(); |
||
75 | final IFeatureIterator iter = m_Points.iterator();
|
||
76 | while (iter.hasNext() && setProgress(i, iShapeCount)) {
|
||
77 | final IFeature feature = iter.next();
|
||
78 | final Coordinate coord = feature.getGeometry().getCoordinate();
|
||
79 | list.add(gf.createPoint(coord)); |
||
80 | i++; |
||
81 | } |
||
82 | iter.close(); |
||
83 | |||
84 | m_Task.setDeterminate(false);
|
||
85 | final Geometry geomcol = gf.createGeometryCollection(list.toArray(new Geometry[0])); |
||
86 | final ConformingDelaunayTriangulationBuilder delaunay = new ConformingDelaunayTriangulationBuilder(); |
||
87 | delaunay.setSites(geomcol); |
||
88 | final Geometry triangles = delaunay.getTriangles(gf);
|
||
89 | |||
90 | final int iTriangles = triangles.getNumGeometries(); |
||
91 | for (int iTriangle = 0; iTriangle < iTriangles; iTriangle++) { |
||
92 | final Geometry triangle = triangles.getGeometryN(iTriangle);
|
||
93 | final Object[] record = { new Integer(iTriangle) }; |
||
94 | m_Triangles.addFeature(triangle, record); |
||
95 | } |
||
96 | |||
97 | return !m_Task.isCanceled();
|
||
98 | |||
99 | } |
||
100 | |||
101 | } |