Statistics
| Revision:

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

    
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
}