forked from geotools/geotools
-
Notifications
You must be signed in to change notification settings - Fork 2
/
BarnesSurfaceProcessTest.java
128 lines (107 loc) · 4.29 KB
/
BarnesSurfaceProcessTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2011, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.process.vector;
import static org.junit.Assert.assertTrue;
import java.awt.geom.Point2D;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.feature.FeatureCollections;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.util.ProgressListener;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory;
/**
* @author Martin Davis - OpenGeo
*
*/
public class BarnesSurfaceProcessTest {
/**
* A test of a simple surface, validating that the process
* can be invoked and return a reasonable result in a simple situation.
*
* @throws Exception
*/
@Test
public void testSimpleSurface() {
ReferencedEnvelope bounds = new ReferencedEnvelope(0, 30, 0, 30, DefaultGeographicCRS.WGS84);
Coordinate[] data = new Coordinate[] {
new Coordinate(10, 10, 100),
new Coordinate(10, 20, 20),
new Coordinate(20, 10, 0),
new Coordinate(20, 20, 80) };
SimpleFeatureCollection fc = createPoints(data, bounds);
ProgressListener monitor = null;
BarnesSurfaceProcess process = new BarnesSurfaceProcess();
GridCoverage2D cov = process.execute(fc, // data
"value", // valueAttr
1000, // dataLimit
10.0, // scale
(Double) null, // convergence
(Integer) 2, // passes
(Integer) null, // minObservations
(Double) null, // maxObservationDistance
-999.0, // noDataValue
1, // pixelsPerCell
0.0, // queryBuffer
bounds, // outputEnv
100, // outputWidth
100, // outputHeight
monitor // monitor)
);
// System.out.println(coverageValue(cov, 20, 20));
double ERROR_TOL = 10;
for (Coordinate p : data) {
float covval = coverageValue(cov, p.x, p.y);
double error = Math.abs(p.z - covval);
assertTrue(error < ERROR_TOL);
}
}
private float coverageValue(GridCoverage2D cov, double x, double y)
{
float[] covVal = new float[1];
Point2D worldPos = new Point2D.Double(x, y);
cov.evaluate(worldPos, covVal);
return covVal[0];
}
private SimpleFeatureCollection createPoints(Coordinate[] pts, ReferencedEnvelope bounds)
{
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setName("obsType");
tb.setCRS(bounds.getCoordinateReferenceSystem());
tb.add("shape", MultiPoint.class);
tb.add("value", Double.class);
SimpleFeatureType type = tb.buildFeatureType();
SimpleFeatureBuilder fb = new SimpleFeatureBuilder(type);
SimpleFeatureCollection fc = FeatureCollections.newCollection();
GeometryFactory factory = new GeometryFactory(new PackedCoordinateSequenceFactory());
for (Coordinate p : pts) {
Geometry point = factory.createPoint(p);
fb.add(point);
fb.add(p.z);
fc.add(fb.buildFeature(null));
}
return fc;
}
}