///*
// * GeoTools - The Open Source Java GIS Toolkit
// * http://geotools.org
// *
// * (C) 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.raster;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader;
import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.media.jai.PlanarImage;
import junit.framework.Assert;
import org.geotools.coverage.CoverageFactoryFinder;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.data.DataStore;
import org.geotools.data.FeatureSource;
import org.geotools.data.FileDataStoreFinder;
import org.geotools.data.WorldFileReader;
import org.geotools.data.property.PropertyDataStore;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.test.TestData;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.operation.MathTransform;
/**
* @author DamianoG
*
*/
public class ZonalStatsProcessTest extends Assert {
private RasterZonalStatistics process;
private DataStore ds;
private static Map<String, String> results = null;
static {
results = new HashMap<String, String>();
results.put(
"testpolygon.11",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.1>=MULTIPOLYGON (((11.89513017802011 46.20793481460109, 11.895809089115916 46.20792743071521, 11.895112009452415 46.2070509839355, 11.89513017802011 46.20793481460109))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.1>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.1>=1, SimpleFeatureImpl.Attribute: count<count id=testpolygon.1>=661, SimpleFeatureImpl.Attribute: min<min id=testpolygon.1>=1251.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.1>=1630.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.1>=894829.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.1>=1353.7503782148278, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.1>=69.14742498772046]");
results.put(
"testpolygon.12",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.1>=MULTIPOLYGON (((11.89513017802011 46.20793481460109, 11.895809089115916 46.20792743071521, 11.895112009452415 46.2070509839355, 11.89513017802011 46.20793481460109))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.1>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.1>=2, SimpleFeatureImpl.Attribute: count<count id=testpolygon.1>=696, SimpleFeatureImpl.Attribute: min<min id=testpolygon.1>=1251.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.1>=1589.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.1>=944959.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.1>=1357.6997126436784, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.1>=70.2289804693121]");
results.put(
"testpolygon.21",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.2>=MULTIPOLYGON (((11.896630238926786 46.207395686643665, 11.897000925691524 46.207985638846736, 11.897753464657697 46.20749492858355, 11.896630238926786 46.207395686643665))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.2>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.2>=1, SimpleFeatureImpl.Attribute: count<count id=testpolygon.2>=722, SimpleFeatureImpl.Attribute: min<min id=testpolygon.2>=1191.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.2>=1411.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.2>=904757.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.2>=1253.1260387811649, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.2>=42.393728281454365]");
results.put(
"testpolygon.22",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.2>=MULTIPOLYGON (((11.896630238926786 46.207395686643665, 11.897000925691524 46.207985638846736, 11.897753464657697 46.20749492858355, 11.896630238926786 46.207395686643665))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.2>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.2>=2, SimpleFeatureImpl.Attribute: count<count id=testpolygon.2>=704, SimpleFeatureImpl.Attribute: min<min id=testpolygon.2>=1192.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.2>=1430.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.2>=883082.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.2>=1254.3778409090917, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.2>=43.45595854784222]");
results.put(
"testpolygon.31",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.3>=MULTIPOLYGON (((11.897871315022112 46.20812076814061, 11.898581076580497 46.20816171238038, 11.898470449632523 46.20767324666812, 11.897871315022112 46.20812076814061))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.3>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.3>=1, SimpleFeatureImpl.Attribute: count<count id=testpolygon.3>=398, SimpleFeatureImpl.Attribute: min<min id=testpolygon.3>=1178.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.3>=1351.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.3>=509230.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.3>=1279.472361809045, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.3>=35.005332302692366]");
results.put(
"testpolygon.32",
"SimpleFeatureImpl:testpolygon=[SimpleFeatureImpl.Attribute: z_the_geom<z_the_geom id=testpolygon.3>=MULTIPOLYGON (((11.897871315022112 46.20812076814061, 11.898581076580497 46.20816171238038, 11.898470449632523 46.20767324666812, 11.897871315022112 46.20812076814061))), SimpleFeatureImpl.Attribute: z_name<z_name id=testpolygon.3>=, SimpleFeatureImpl.Attribute: classification<classification id=testpolygon.3>=2, SimpleFeatureImpl.Attribute: count<count id=testpolygon.3>=383, SimpleFeatureImpl.Attribute: min<min id=testpolygon.3>=1189.0, SimpleFeatureImpl.Attribute: max<max id=testpolygon.3>=1348.0, SimpleFeatureImpl.Attribute: sum<sum id=testpolygon.3>=490572.0, SimpleFeatureImpl.Attribute: avg<avg id=testpolygon.3>=1280.8668407310697, SimpleFeatureImpl.Attribute: stddev<stddev id=testpolygon.3>=32.66128762163009]");
}
@Before
public void setup() throws Exception {
process = new RasterZonalStatistics();
File file = TestData.file(this, null);
ds = new PropertyDataStore(file);
TestData.unzipFile(this, "test.zip");
}
@After
public void tearDown() {
ds.dispose();
}
@Test
public void simpleZonalStatsProcess() throws Exception {
DataStore store = null;
TIFFImageReader reader = null;
GridCoverage2D coverage2D = null;
GridCoverage2D covClassificator = null;
SimpleFeatureIterator iterator = null;
try {
// build the feature collection
final File fileshp = TestData.file(this, "testpolygon.shp");
store = FileDataStoreFinder.getDataStore(fileshp.toURI().toURL());
assertNotNull(store);
assertTrue(store instanceof ShapefileDataStore);
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = store
.getFeatureSource(store.getNames().get(0));
SimpleFeatureCollection featureCollection = (SimpleFeatureCollection) featureSource
.getFeatures();
// build the DataFile
final File tiff = TestData.file(this, "test.tif");
final File tfw = TestData.file(this, "test.tfw");
reader = (it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader) new TIFFImageReaderSpi()
.createReaderInstance();
assertNotNull(reader);
reader.setInput(ImageIO.createImageInputStream(tiff));
final BufferedImage image = reader.read(0);
final MathTransform transform = new WorldFileReader(tfw).getTransform();
coverage2D = CoverageFactoryFinder.getGridCoverageFactory(null).create(
"coverage",
image,
new GridGeometry2D(new GridEnvelope2D(PlanarImage.wrapRenderedImage(image)
.getBounds()), transform, DefaultGeographicCRS.WGS84),
new GridSampleDimension[] { new GridSampleDimension("coverage") }, null, null);
assertNotNull(coverage2D);
// build the classificator
// generate the classificator image
final BufferedImage imageClassificator = new BufferedImage(120, 80,
BufferedImage.TYPE_BYTE_INDEXED);
final WritableRaster raster = imageClassificator.getRaster();
for (int i = raster.getWidth(); --i >= 0;) {
for (int j = raster.getHeight(); --j >= 0;) {
// create a simple raster used for classification
int sampleValue = (i % 2 == 0) ? 1 : 2;
raster.setSample(i, j, 0, sampleValue);
}
}
// create the coverage for the classification layer
covClassificator = CoverageFactoryFinder.getGridCoverageFactory(null).create(
"coverageClassificator",
imageClassificator,
new GridGeometry2D(new GridEnvelope2D(PlanarImage.wrapRenderedImage(
imageClassificator).getBounds()), coverage2D.getEnvelope()),
new GridSampleDimension[] { new GridSampleDimension("coverage") }, null, null);
assertNotNull(coverage2D);
// invoke the process
SimpleFeatureCollection sfc = process.execute(coverage2D, null, featureCollection,
covClassificator);
iterator = sfc.features();
assertNotNull(iterator);
while (iterator.hasNext()) {
SimpleFeature feature = iterator.next();
assertTrue((feature.toString()).equals(results.get(feature.getID()
+ feature.getAttribute("classification"))));
}
} finally {
try {
if (store != null) {
store.dispose();
}
} catch (Exception e) {
}
try {
if (reader != null) {
reader.dispose();
}
} catch (Exception e) {
}
try {
if (coverage2D != null) {
coverage2D.dispose(true);
}
} catch (Exception e) {
}
try {
if (covClassificator != null) {
covClassificator.dispose(true);
}
} catch (Exception e) {
}
try {
if (iterator != null) {
iterator.close();
}
} catch (Exception e) {
}
}
}
}