Statistics
| Revision:

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
}