Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / pointAnalysis / nearestNeighbour / NNAnalysisAlgorithm.java @ 59

History | View | Annotate | Download (5.18 KB)

1

    
2

    
3
package es.unex.sextante.pointAnalysis.nearestNeighbour;
4

    
5
import java.awt.geom.Rectangle2D;
6
import java.text.DecimalFormat;
7

    
8
import com.vividsolutions.jts.geom.Coordinate;
9
import com.vividsolutions.jts.geom.Geometry;
10

    
11
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer;
12
import es.unex.sextante.core.GeoAlgorithm;
13
import es.unex.sextante.core.Sextante;
14
import es.unex.sextante.dataObjects.IFeature;
15
import es.unex.sextante.dataObjects.IFeatureIterator;
16
import es.unex.sextante.dataObjects.IVectorLayer;
17
import es.unex.sextante.dataObjects.vectorFilters.BoundingBoxFilter;
18
import es.unex.sextante.docEngines.html.HTMLDoc;
19
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
20
import es.unex.sextante.exceptions.RepeatedParameterNameException;
21

    
22

    
23
public class NNAnalysisAlgorithm
24
         extends
25
            GeoAlgorithm {
26

    
27
   private static final String RESULT = "RESULT";
28
   private static final String POINTS = "POINTS";
29

    
30

    
31
   @Override
32
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
33

    
34
      int i, j;
35
      double x1, x2, y1, y2;
36
      double dDifX, dDifY;
37
      double dArea;
38
      double dPerimeter;
39
      double dMin;
40
      double dAvg;
41
      double dExpectedAvg, dExpectedAvgC;
42
      double dVar, dVarC;
43
      double dNNI, dNNIC;
44
      double dZ, dZC;
45
      double dSum = 0;
46
      int iCount;
47

    
48
      final IVectorLayer layer = m_Parameters.getParameterValueAsVectorLayer(POINTS);
49
      if (!m_bIsAutoExtent) {
50
         layer.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
51
      }
52
      final Rectangle2D rect = layer.getFullExtent();
53
      dArea = rect.getWidth() * rect.getHeight();
54
      dPerimeter = 2 * rect.getWidth() + 2 * rect.getHeight();
55
      iCount = layer.getShapesCount();
56
      i = 0;
57
      final IFeatureIterator iter = layer.iterator();
58
      while (iter.hasNext() && setProgress(i, iCount)) {
59
         final IFeature feature = iter.next();
60
         final Geometry geom = feature.getGeometry();
61
         final Coordinate coord = geom.getCoordinate();
62
         x1 = coord.x;
63
         y1 = coord.y;
64
         dMin = Double.MAX_VALUE;
65
         j = 0;
66
         final IFeatureIterator iter2 = layer.iterator();
67
         while (iter2.hasNext()) {
68
            final IFeature feature2 = iter2.next();
69
            if (i != j) {
70
               final Geometry geom2 = feature2.getGeometry();
71
               final Coordinate coord2 = geom2.getCoordinate();
72
               x2 = coord2.x;
73
               y2 = coord2.y;
74
               dDifX = x2 - x1;
75
               dDifY = y2 - y1;
76
               dMin = Math.min(dMin, Math.sqrt(dDifX * dDifX + dDifY * dDifY));
77
            }
78
            j++;
79
         }
80
         iter2.close();
81
         dSum += dMin;
82
         i++;
83
      }
84
      iter.close();
85

    
86
      dAvg = dSum / iCount;
87
      dExpectedAvg = 0.5 * Math.sqrt(dArea / iCount);
88
      dExpectedAvgC = 0.5 * Math.sqrt(dArea / iCount) + (0.0514 + 0.041 / Math.sqrt(iCount)) * dPerimeter / iCount;
89
      dVar = (1. / Math.PI - 0.25) * dArea / Math.pow(iCount, 2.);
90
      dVarC = 0.0703 * dArea / Math.pow(iCount, 2.) + 0.037 * dPerimeter * Math.sqrt(dArea / Math.pow(iCount, 5.));
91
      dNNI = dAvg / dExpectedAvg;
92
      dNNIC = dAvg / dExpectedAvgC;
93
      dZ = (dAvg - dExpectedAvg) / Math.sqrt(dVar);
94
      dZC = (dAvg - dExpectedAvgC) / Math.sqrt(dVarC);
95

    
96
      final DecimalFormat df = new DecimalFormat("##.###");
97
      final HTMLDoc doc = new HTMLDoc();
98
      doc.open(Sextante.getText("Nearest_neighbour"));
99
      doc.addHeader(Sextante.getText("Nearest_neighbour"), 2);
100
      doc.startUnorderedList();
101
      doc.addListElement(Sextante.getText("Mean_distance") + ": " + df.format(dAvg));
102
      doc.addListElement(Sextante.getText("Expected_distance") + ": " + df.format(dExpectedAvg));
103
      doc.addListElement(Sextante.getText("Edge-corrected_expected_distance") + ": " + df.format(dExpectedAvgC));
104
      doc.addListElement(Sextante.getText("Variance") + ": " + df.format(dVar));
105
      doc.addListElement(Sextante.getText("Edge-corrected_variance") + ": " + df.format(dVarC));
106
      doc.addListElement(Sextante.getText("Nearest_neighbour_index") + ": " + df.format(dNNI));
107
      doc.addListElement(Sextante.getText("Corrected_nearest_neighbour_index") + ": " + df.format(dNNIC));
108
      doc.addListElement(Sextante.getText("Z_value") + ": " + df.format(dZ));
109
      doc.addListElement(Sextante.getText("Corrected_Z_value") + ": " + df.format(dZC));
110
      doc.closeUnorderedList();
111
      doc.close();
112
      addOutputText(RESULT, Sextante.getText("Statistics") + "[" + layer.getName() + "]", doc.getHTMLCode());
113

    
114
      return !m_Task.isCanceled();
115

    
116
   }
117

    
118

    
119
   @Override
120
   public void defineCharacteristics() {
121

    
122
      setName(Sextante.getText("Nearest_neighbour_analysis"));
123
      setGroup(Sextante.getText("Tools_for_point_layers"));
124
      setUserCanDefineAnalysisExtent(true);
125

    
126
      try {
127
         m_Parameters.addInputVectorLayer(POINTS, Sextante.getText("Points"), AdditionalInfoVectorLayer.SHAPE_TYPE_POINT, true);
128
         addOutputText(RESULT, Sextante.getText("Statistics"));
129
      }
130
      catch (final RepeatedParameterNameException e) {
131
         Sextante.addErrorToLog(e);
132
      }
133

    
134
   }
135

    
136
}