Package org.geotools.gce.arcgrid

Source Code of org.geotools.gce.arcgrid.ArcGridReadWriteTest

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2008, 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.gce.arcgrid;

import java.awt.image.Raster;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Random;

import javax.media.jai.ImageLayout;

import org.geotools.TestData;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.factory.Hints;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.resources.coverage.CoverageUtilities;
import org.opengis.coverage.grid.GridCoverageReader;
import org.opengis.coverage.grid.GridCoverageWriter;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValueGroup;

/**
* Test reading and writing arcgrid grid coverages.
*
* @author Daniele Romagnoli
* @author Simone Giannecchini (simboss)
*
*
* @source $URL$
*/
public class ArcGridReadWriteTest extends ArcGridBaseTestCase {
  private final Random generator = new Random();

  /**
   * Creates a new instance of ArcGridReadWriteTest
   *
   * @param name
   *            DOCUMENT ME!
   */
  public ArcGridReadWriteTest(String name) {
    super(name);
  }

  /**
   *
   * @param testParam
   * @throws Exception
   */
  public void runMe(final File testFile) throws Exception {
   

    // create a temporary output file
    // temporary file to use
    File tmpFile = TestData.temp(this, Long.toString(Math
        .round(100000 * generator.nextDouble()))
        + testFile.getName());
    tmpFile.deleteOnExit();

    // ESRI
    LOGGER.info(testFile.getName() + " ESRI");
    writeEsriUnCompressed(testFile, tmpFile);

    tmpFile = TestData.temp(this, Long.toString(Math
        .round(100000 * generator.nextDouble()))
        + testFile.getName());
    tmpFile.deleteOnExit();
    // GRASS
    LOGGER.info(testFile.getName() + " GRASS");
    writeGrassUnCompressed(testFile, tmpFile);

  }

  /**
   * Compares 2 grid covareages, throws an exception if they are not the same.
   *
   * @param gc1
   *            First Grid Coverage
   * @param gc2
   *            Second Grid Coverage
   *
   * @throws Exception
   *             If Coverages are not equal
   */
  static void compare(GridCoverage2D gc1, GridCoverage2D gc2) throws Exception {
    final GeneralEnvelope e1 = (GeneralEnvelope) gc1.getEnvelope();
    final GeneralEnvelope e2 = (GeneralEnvelope) gc2.getEnvelope();

    /** Checking Envelopes */
    if ((e1.getLowerCorner().getOrdinate(0) != e2.getLowerCorner()
        .getOrdinate(0))
        || (e1.getLowerCorner().getOrdinate(1) != e2.getLowerCorner()
            .getOrdinate(1))
        || (e1.getUpperCorner().getOrdinate(0) != e2.getUpperCorner()
            .getOrdinate(0))
        || (e1.getUpperCorner().getOrdinate(1) != e2.getUpperCorner()
            .getOrdinate(1))) {
      throw new Exception("GridCoverage Envelopes are not equal"
          + e1.toString() + e2.toString());
    }

    /** Checking CRS */
    if (e1.getCoordinateReferenceSystem().toWKT().compareToIgnoreCase(
        e2.getCoordinateReferenceSystem().toWKT()) != 0) {
      throw new Exception("GridCoverage CRS are not equal"
          + e1.getCoordinateReferenceSystem().toWKT()
          + e2.getCoordinateReferenceSystem().toWKT());
    }

    /** Checking values */
    final Double noData1 = new Double(ArcGridWriter.getCandidateNoData(gc1));
    final Double noData2 = new Double(ArcGridWriter.getCandidateNoData(gc2));
    final int minTileX1 = gc1.getRenderedImage().getMinTileX();
    final int minTileY1 = gc1.getRenderedImage().getMinTileY();
    final int width = gc1.getRenderedImage().getTileWidth();
    final int height = gc1.getRenderedImage().getTileHeight();
    final int maxTileX1 = minTileX1 + gc1.getRenderedImage().getNumXTiles();
    final int maxTileY1 = minTileY1 + gc1.getRenderedImage().getNumYTiles();
    double value1 = 0, value2 = 0;

    for (int tileIndexX = minTileX1; tileIndexX < maxTileX1; tileIndexX++)
      for (int tileIndexY = minTileY1; tileIndexY < maxTileY1; tileIndexY++) {

        final Raster r1 = gc1.getRenderedImage().getTile(tileIndexX,
            tileIndexY);
        final Raster r2 = gc2.getRenderedImage().getTile(tileIndexX,
            tileIndexY);

        for (int i = r1.getMinX(); i < width; i++) {
          for (int j = r1.getMinY(); j < height; j++) {
            value1 = r1.getSampleDouble(i, j, 0);
            value2 = r2.getSampleDouble(i, j, 0);

            if (!(noData1.compareTo(value1) == 0 && noData2.compareTo(value2) == 0)
                && (value1 != value2)) {
              throw new Exception(
                  "GridCoverage Values are not equal: "
                      + value1 + ", " + value2);
            }

          }
        }
      }

  }

  /**
   * A Simple Test Method which read an arcGrid and write it as a GRASS Ascii
   * Grid
   *
   * @param wf
   * @param rf
   */
  public void writeGrassUnCompressed(File rf, File wf) throws Exception {

            final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM,DefaultGeographicCRS.WGS84);
    /** Step 1: Reading the coverage */
    GridCoverageReader reader = new ArcGridReader(rf,hints);
    final GridCoverage2D gc1 = (GridCoverage2D) reader.read(null);
    assertTrue(CoverageUtilities.hasRenderingCategories(gc1));

    /** Step 2: Write grid coverage out to temp file */
    final GridCoverageWriter writer = new ArcGridWriter(wf);

    // setting write parameters
    ParameterValueGroup params;
    params = writer.getFormat().getWriteParameters();
    params.parameter("GRASS").setValue(true);
    final ArcGridWriteParams wp = new ArcGridWriteParams();
    wp.setSourceBands(new int[] { 0 });
    params.parameter(
        AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName().toString())
        .setValue(wp);
    // params.parameter("compressed").setValue(false);
    GeneralParameterValue[] gpv = {
        params.parameter("GRASS"),
        params.parameter(AbstractGridFormat.GEOTOOLS_WRITE_PARAMS
            .getName().toString()) };
    writer.write(gc1, gpv);
    writer.dispose();

    /** Step 3: Read the just written coverage */
    GridCoverageReader reader2 = new ArcGridReader(wf,hints);
    final GridCoverage2D gc2 = (GridCoverage2D) reader2.read(null);

    /** Step 4: Check if the 2 coverage are equals */
    compare(gc1, gc2);

    /** Step 5: Show the new coverage */
    if (TestData.isInteractiveTest()) {
      gc1.show();
      gc2.show();
    } else {
      gc1.getRenderedImage().getData();
      gc2.getRenderedImage().getData();
    }
  }

  /**
   * A Simple Test Method which read an arcGrid and write it as an ArcGrid
   *
   * @param rf
   * @param wf
   */
  public void writeEsriUnCompressed(File rf, File wf) throws Exception {

            final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM,DefaultGeographicCRS.WGS84);
    /** Step 1: Reading the coverage */
    GridCoverageReader reader = new ArcGridReader(rf,hints);
    final GridCoverage2D gc1 = (GridCoverage2D) reader.read(null);
    assertTrue(CoverageUtilities.hasRenderingCategories(gc1));

    /** Step 2: Write grid coverage out to temp file */
    final GridCoverageWriter writer = new ArcGridWriter(wf);

    // setting write parameters
    ParameterValueGroup params;
    params = writer.getFormat().getWriteParameters();
    params.parameter("GRASS").setValue(false);
    final ArcGridWriteParams wp = new ArcGridWriteParams();
    wp.setSourceBands(new int[] { 0 });
    params.parameter(
        AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName().toString())
        .setValue(wp);
    // params.parameter("compressed").setValue(false);
    GeneralParameterValue[] gpv = {
        params.parameter("GRASS"),
        params.parameter(AbstractGridFormat.GEOTOOLS_WRITE_PARAMS
            .getName().toString()) };
    writer.write(gc1, gpv);
    writer.dispose();

    /** Step 3: Read the just written coverage */
    GridCoverageReader reader2 = new ArcGridReader(wf,hints);
    final GridCoverage2D gc2 = (GridCoverage2D) reader2.read(null);

    /** Step 4: Check if the 2 coverage are equals */
    compare(gc1, gc2);

    /** Step 5: Show the new coverage */
    if (TestData.isInteractiveTest()) {
      gc1.show();
      gc2.show();
    } else {
      gc1.getRenderedImage().getData();
      gc2.getRenderedImage().getData();
    }

  }

  public void testErrorConditions() throws IOException {

    // testing format and reader
    LOGGER.info("testErrorConditions");
    final File testFile = TestData.file(this, "arcgrid/precip30min.asc");
    final URL testURL = TestData.url(this, "arcgrid/precip30min.asc");
    final ArcGridFormat af = new ArcGridFormat();
    assertTrue("Unable to get an a reader for a file", af.accepts(testFile));
    assertTrue("Unable to get an a reader for a URL", af.accepts(testURL));

    assertNotNull("Unable to get an a reader for a file", af
        .getReader(testFile));
    assertNotNull("Unable to get an a reader for a URL", af
        .getReader(testURL));
    assertFalse("We should not get a reader for a non existing file", af
        .accepts(TestData.temp(this, "temp")));
    assertTrue(
        "Write params of incorrect type",
        af.getDefaultImageIOWriteParameters() instanceof ArcGridWriteParams);

    boolean caught = false;
    try {
      af.getReader(TestData
          .openStream(this, "arcgrid/precip30min.asc"));
    } catch (IllegalArgumentException e) {
      caught = true;
    }
    assertTrue("Streams are  supported now", !caught);

    // testing writer
    assertNotNull("Unable to get a writer for a file", af
        .getWriter(TestData.temp(this, "temp")));
    assertNotNull("Unable to get a writer for a url", af.getWriter(TestData
        .temp(this, "temp").toURI().toURL()));
    assertNotNull("We should be ablet to write on an http link", af
        .getWriter(new URL("http://www.geo-solutions.it")));

  }

  public static final void main(String[] args) throws Exception {
    junit.textui.TestRunner.run(ArcGridReadWriteTest.class);
  }
 
  public void testImageLayout() throws Exception{
      // test ImageLayout
            LOGGER.info("testImageLayout");
            final File testFile = TestData.file(this, "arcgrid/precip30min.asc");
            final ArcGridFormat af = new ArcGridFormat();
            assertTrue("Unable to get an a reader for a file", af.accepts(testFile));
            final ArcGridReader reader = af.getReader(testFile);
            assertNotNull("Unable to get a reader for a file", reader);

            // getting imagelayout
            final ImageLayout layout1 = reader.getImageLayout();
            assertNotNull("Unable to get a layout for this reader", layout1);
            assertEquals(0, layout1.getMinX(null));
            assertEquals(0, layout1.getMinY(null));
            assertEquals(720, layout1.getWidth(null));
            assertEquals(360, layout1.getHeight(null));
            assertEquals(0, layout1.getTileGridXOffset(null));
            assertEquals(0, layout1.getTileGridYOffset(null));
            assertEquals(720, layout1.getTileWidth(null));
            assertEquals(360, layout1.getTileHeight(null))
           
            // make sure we get the same one with the name
            assertEquals(layout1, reader.getImageLayout(reader.getGridCoverageNames()[0]));
           
  }

}
TOP

Related Classes of org.geotools.gce.arcgrid.ArcGridReadWriteTest

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.