Package org.geotools.process.raster

Source Code of org.geotools.process.raster.ZonalStatsProcessTest

///*
// *    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) {
            }

        }
    }
}
TOP

Related Classes of org.geotools.process.raster.ZonalStatsProcessTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.