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 |
} |