/*
* Geotoolkit.org - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2010-2012, Open Source Geospatial Foundation (OSGeo)
* (C) 2010-2012, Geomatys
*
* 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.geotoolkit.coverage.sql;
import java.io.IOException;
import java.sql.SQLException;
import java.awt.geom.Rectangle2D;
import org.apache.sis.test.DependsOn;
import org.geotoolkit.image.io.metadata.SpatialMetadata;
import org.geotoolkit.coverage.grid.ViewType;
import org.geotoolkit.coverage.grid.GridCoverage2D;
import org.geotoolkit.coverage.io.GridCoverageReadParam;
import org.geotoolkit.coverage.io.CoverageStoreException;
import org.geotoolkit.internal.sql.table.CatalogTestBase;
import org.junit.*;
import static org.geotoolkit.test.Assert.*;
import static org.geotoolkit.test.Commons.*;
import static org.geotoolkit.image.io.metadata.SpatialMetadataFormat.GEOTK_FORMAT_NAME;
/**
* Tests {@link LayerCoverageReader}.
*
* @author Martin Desruisseaux (Geomatys)
* @version 3.16
*
* @since 3.10 (derived from Seagis)
*/
@DependsOn(CoverageDatabaseTest.class)
public final strictfp class LayerCoverageReaderTest extends CatalogTestBase {
/**
* Creates a new test suite.
*/
public LayerCoverageReaderTest() {
super(LayerCoverageReader.class);
}
/**
* The coverage database.
*/
private static CoverageDatabase database;
/**
* Creates the database when first needed.
*/
private static synchronized CoverageDatabase getCoverageDatabase() {
if (database == null) {
database = new CoverageDatabase((TableFactory) getDatabase());
}
return database;
}
/**
* Disposes the database.
*/
@AfterClass
public static synchronized void dispose() {
if (database != null) {
database.dispose();
database = null;
}
}
/**
* Tests loading an image of temperature data in WGS84 CRS.
*
* @throws SQLException If the test can't connect to the database.
* @throws IOException If the image can not be read.
* @throws CoverageStoreException If a logical error occurred.
*/
@Test
public void testTemperature() throws SQLException, IOException, CoverageStoreException {
final CoverageDatabase database = getCoverageDatabase();
final LayerCoverageReader reader = database.createGridCoverageReader(LayerTableTest.TEMPERATURE);
final Layer layer = reader.getInput();
assertEquals(LayerTableTest.TEMPERATURE, layer.getName());
SpatialMetadata metadata = reader.getStreamMetadata();
assertNotNull(metadata);
assertMultilinesEquals(decodeQuotes(
GEOTK_FORMAT_NAME + '\n' +
"└───DiscoveryMetadata\n" +
" └───Extent\n" +
" └───GeographicElement\n" +
" ├───westBoundLongitude=“-180.0”\n" +
" ├───eastBoundLongitude=“180.0”\n" +
" ├───southBoundLatitude=“-90.0”\n" +
" ├───northBoundLatitude=“90.0”\n" +
" └───inclusion=“true”\n"), metadata.toString());
metadata = reader.getCoverageMetadata(0);
assertNotNull(metadata);
assertMultilinesEquals(decodeQuotes(
GEOTK_FORMAT_NAME + '\n' +
"├───ImageDescription\n" +
"│ └───Dimensions\n" +
"│ └───Dimension\n" +
"│ ├───descriptor=“SST [-3 … 32.25°C]”\n" +
"│ ├───minValue=“-2.85”\n" +
"│ ├───maxValue=“35.25”\n" +
"│ ├───units=“Cel”\n" +
"│ ├───validSampleValues=“[1 … 255]”\n" +
"│ ├───fillSampleValues=“0”\n" +
"│ ├───scaleFactor=“0.15”\n" +
"│ ├───offset=“-3.0”\n" +
"│ └───transferFunctionType=“linear”\n" +
"├───RectifiedGridDomain\n" +
"│ ├───origin=“-180.0 90.0 6431.0”\n" +
"│ ├───Limits\n" +
"│ │ ├───low=“0 0 0”\n" +
"│ │ └───high=“4095 2047 6”\n" +
"│ └───OffsetVectors\n" +
"│ ├───OffsetVector\n" +
"│ │ └───values=“0.087890625 0.0 0.0”\n" +
"│ ├───OffsetVector\n" +
"│ │ └───values=“0.0 -0.087890625 0.0”\n" +
"│ └───OffsetVector\n" +
"│ └───values=“0.0 0.0 8.0”\n" +
"└───SpatialRepresentation\n" +
" ├───numberOfDimensions=“3”\n" +
" ├───centerPoint=“0.0 0.0 6459.0”\n" +
" └───pointInPixel=“upperLeft”\n"), metadata.toString());
final CoverageEnvelope envelope = layer.getEnvelope(null, null);
envelope.setTimeRange(LayerTableTest.SUB_START_TIME, LayerTableTest.SUB_END_TIME);
final GridCoverageReadParam param = new GridCoverageReadParam();
param.setEnvelope(envelope);
param.setResolution(0.703125, 0.703125, 0, 0); // Image of size (512, 256).
requireImageData();
GridCoverage2D coverage = (GridCoverage2D) reader.read(0, param);
assertEquals(512, coverage.getRenderedImage().getWidth());
assertEquals(256, coverage.getRenderedImage().getHeight());
GridCoverageLoaderTest.checkTemperatureCoverage(coverage);
show(coverage.view(ViewType.RENDERED));
// Read one more time, in order to ensure that recycling LayerCoverageReader work.
// Before we fixed this test, we got an "Input not set" exception in such situation.
param.setResolution(1.40625, 1.40625, 0, 0);
coverage = (GridCoverage2D) reader.read(0, param);
assertEquals(256, coverage.getRenderedImage().getWidth());
assertEquals(128, coverage.getRenderedImage().getHeight());
GridCoverageLoaderTest.checkTemperatureCoverage(coverage);
}
/**
* Tests loading an image of temperature data in Mercator CRS.
*
* @throws SQLException If the test can't connect to the database.
* @throws IOException If the image can not be read.
* @throws CoverageStoreException If a logical error occurred.
*/
@Test
public void testCoriolis() throws SQLException, IOException, CoverageStoreException {
final CoverageDatabase database = getCoverageDatabase();
final LayerCoverageReader reader = database.createGridCoverageReader(LayerTableTest.NETCDF);
final Layer layer = reader.getInput();
assertEquals(LayerTableTest.NETCDF, layer.getName());
final CoverageEnvelope envelope = layer.getEnvelope(null, 100);
envelope.setHorizontalRange(new Rectangle2D.Double(-40, -40, 80, 80));
final GridCoverageReadParam param = new GridCoverageReadParam();
param.setEnvelope(envelope);
requireImageData();
final GridCoverage2D coverage = (GridCoverage2D) reader.read(0, param);
assertEquals(160, coverage.getRenderedImage().getWidth());
assertEquals(175, coverage.getRenderedImage().getHeight());
GridCoverageLoaderTest.checkCoriolisCoverage(coverage);
show(coverage.view(ViewType.RENDERED));
}
/**
* Tests loading a tiled image.
*
* @throws SQLException If the test can't connect to the database.
* @throws IOException If the image can not be read.
* @throws CoverageStoreException If a logical error occurred.
*/
@Test
public void testBluemarble() throws SQLException, IOException, CoverageStoreException {
final CoverageDatabase database = getCoverageDatabase();
final LayerCoverageReader reader = database.createGridCoverageReader(LayerTableTest.BLUEMARBLE);
final Layer layer = reader.getInput();
assertEquals(LayerTableTest.BLUEMARBLE, layer.getName());
SpatialMetadata metadata = reader.getStreamMetadata();
assertNotNull(metadata);
assertMultilinesEquals(decodeQuotes(
GEOTK_FORMAT_NAME + '\n' +
"└───DiscoveryMetadata\n" +
" └───Extent\n" +
" └───GeographicElement\n" +
" ├───westBoundLongitude=“-180.0”\n" +
" ├───eastBoundLongitude=“180.0”\n" +
" ├───southBoundLatitude=“-90.0”\n" +
" ├───northBoundLatitude=“90.0”\n" +
" └───inclusion=“true”\n"), metadata.toString());
metadata = reader.getCoverageMetadata(0);
assertNotNull(metadata);
assertMultilinesEquals(decodeQuotes(
GEOTK_FORMAT_NAME + '\n' +
"├───RectifiedGridDomain\n" +
"│ ├───origin=“-180.0 90.0”\n" +
"│ ├───Limits\n" +
"│ │ ├───low=“0 0”\n" +
"│ │ └───high=“2879 1439”\n" +
"│ └───OffsetVectors\n" +
"│ ├───OffsetVector\n" +
"│ │ └───values=“0.125 0.0”\n" +
"│ └───OffsetVector\n" +
"│ └───values=“0.0 -0.125”\n" +
"└───SpatialRepresentation\n" +
" ├───numberOfDimensions=“2”\n" +
" ├───centerPoint=“0.0 0.0”\n" +
" └───pointInPixel=“upperLeft”\n"), metadata.toString());
final CoverageEnvelope envelope = layer.getEnvelope(null, 100);
envelope.setHorizontalRange(new Rectangle2D.Double(-40, -40, 80, 80));
final GridCoverageReadParam param = new GridCoverageReadParam();
param.setEnvelope(envelope);
requireImageData();
final GridCoverage2D coverage = (GridCoverage2D) reader.read(0, param);
assertEquals(640, coverage.getRenderedImage().getWidth());
assertEquals(640, coverage.getRenderedImage().getHeight());
GridCoverageLoaderTest.checkBluemarbleCoverage(coverage);
show(coverage.view(ViewType.RENDERED));
}
}