/*
* 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.*;
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.DefaultFeatureCollection;
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);
}
assertEquals(1, cov.getSampleDimensions().length);
assertEquals("values", cov.getSampleDimensions()[0].getDescription().toString());
}
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);
DefaultFeatureCollection fc = new DefaultFeatureCollection();
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;
}
}