package mil.nga.giat.geowave.test.landsat; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.StringReader; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.imageio.ImageIO; import javax.media.jai.Interpolation; import javax.media.jai.PlanarImage; import mil.nga.giat.geowave.adapter.raster.plugin.GeoWaveGTRasterFormat; import mil.nga.giat.geowave.adapter.raster.plugin.GeoWaveRasterConfig; import mil.nga.giat.geowave.adapter.raster.plugin.GeoWaveRasterReader; import mil.nga.giat.geowave.core.cli.api.OperationParams; import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider.SpatialIndexBuilder; import mil.nga.giat.geowave.core.store.GeoWaveStoreFinder; import mil.nga.giat.geowave.core.store.StoreFactoryOptions; import mil.nga.giat.geowave.core.store.index.PrimaryIndex; import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions; import mil.nga.giat.geowave.format.landsat8.BandFeatureIterator; import mil.nga.giat.geowave.format.landsat8.Landsat8BasicCommandLineOptions; import mil.nga.giat.geowave.format.landsat8.Landsat8DownloadCommandLineOptions; import mil.nga.giat.geowave.format.landsat8.Landsat8RasterIngestCommandLineOptions; import mil.nga.giat.geowave.format.landsat8.RasterIngestRunner; import mil.nga.giat.geowave.format.landsat8.SceneFeatureIterator; import mil.nga.giat.geowave.test.GeoWaveITRunner; import mil.nga.giat.geowave.test.TestUtils; import mil.nga.giat.geowave.test.annotation.GeoWaveTestStore; import mil.nga.giat.geowave.test.annotation.GeoWaveTestStore.GeoWaveStoreType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.operation.projection.MapProjection; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import freemarker.template.Configuration; import freemarker.template.Template; @RunWith(GeoWaveITRunner.class) public class LandsatIT { private static class RasterIngestTester extends RasterIngestRunner { DataStorePluginOptions dataStoreOptions; public RasterIngestTester( final DataStorePluginOptions dataStoreOptions, final Landsat8BasicCommandLineOptions analyzeOptions, final Landsat8DownloadCommandLineOptions downloadOptions, final Landsat8RasterIngestCommandLineOptions ingestOptions, final List<String> parameters ) { super( analyzeOptions, downloadOptions, ingestOptions, parameters); this.dataStoreOptions = dataStoreOptions; } @Override protected void runInternal( final OperationParams params ) throws Exception { // TODO Auto-generated method stub super.runInternal(params); } @Override protected void processParameters( final OperationParams params ) throws Exception { store = dataStoreOptions.createDataStore(); indices = new PrimaryIndex[] { new SpatialIndexBuilder().createIndex() }; coverageNameTemplate = new Template( "name", new StringReader( ingestOptions.getCoverageName()), new Configuration()); } } @GeoWaveTestStore({ GeoWaveStoreType.ACCUMULO, GeoWaveStoreType.BIGTABLE, GeoWaveStoreType.HBASE }) protected DataStorePluginOptions dataStoreOptions; private static final String REFERENCE_LANDSAT_IMAGE_PATH = "src/test/resources/landsat/expected.png"; private static final int MIN_PATH = 198; private static final int MAX_PATH = 199; private static final int MIN_ROW = 36; private static final int MAX_ROW = 37; private static final double WEST = -2.2; private static final double EAST = -1.4; private static final double NORTH = 34.25; private static final double SOUTH = 33.5; private final static Logger LOGGER = LoggerFactory.getLogger(LandsatIT.class); private static long startMillis; @BeforeClass public static void startTimer() { startMillis = System.currentTimeMillis(); LOGGER.warn("-----------------------------------------"); LOGGER.warn("* *"); LOGGER.warn("* RUNNING LandsatIT *"); LOGGER.warn("* *"); LOGGER.warn("-----------------------------------------"); } @AfterClass public static void reportTest() { LOGGER.warn("-----------------------------------------"); LOGGER.warn("* *"); LOGGER.warn("* FINISHED LandsatIT *"); LOGGER .warn("* " + ((System.currentTimeMillis() - startMillis) / 1000) + "s elapsed. *"); LOGGER.warn("* *"); LOGGER.warn("-----------------------------------------"); } @Test public void testMosaic() throws Exception { MapProjection.SKIP_SANITY_CHECKS = true; TestUtils.deleteAll(dataStoreOptions); // just use the QA band as QA is the smallest, get the best cloud cover, // but ensure it is before now so no recent collection affects the test final Landsat8BasicCommandLineOptions analyzeOptions = new Landsat8BasicCommandLineOptions(); analyzeOptions .setCqlFilter(String .format( "BBOX(%s,%f,%f,%f,%f) AND %s='B4' AND %s <= '%s' AND path >= %d AND path <= %d AND row >= %d AND row <= %d", SceneFeatureIterator.SHAPE_ATTRIBUTE_NAME, WEST, SOUTH, EAST, NORTH, BandFeatureIterator.BAND_ATTRIBUTE_NAME, SceneFeatureIterator.ACQUISITION_DATE_ATTRIBUTE_NAME, "2016-06-01T00:00:00Z", MIN_PATH, MAX_PATH, MIN_ROW, MAX_ROW)); analyzeOptions.setNBestPerSpatial(true); analyzeOptions.setNBestScenes(1); analyzeOptions.setUseCachedScenes(true); final Landsat8DownloadCommandLineOptions downloadOptions = new Landsat8DownloadCommandLineOptions(); final Landsat8RasterIngestCommandLineOptions ingestOptions = new Landsat8RasterIngestCommandLineOptions(); ingestOptions.setRetainImages(true); ingestOptions.setCreatePyramid(true); ingestOptions.setCreateHistogram(true); ingestOptions.setCoverageName("test"); // crop to the specified bbox ingestOptions.setCropToSpatialConstraint(true); final RasterIngestTester runner = new RasterIngestTester( dataStoreOptions, analyzeOptions, downloadOptions, ingestOptions, null); runner.runInternal(null); final StringBuilder str = new StringBuilder( StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION).append( "=").append( dataStoreOptions.getGeowaveNamespace()).append( ";equalizeHistogramOverride=false;interpolationOverride=").append( Interpolation.INTERP_NEAREST); str.append( ";").append( GeoWaveStoreFinder.STORE_HINT_KEY).append( "=").append( dataStoreOptions.getType()); final Map<String, String> options = dataStoreOptions.getOptionsAsMap(); for (final Entry<String, String> entry : options.entrySet()) { if (!entry.getKey().equals( StoreFactoryOptions.GEOWAVE_NAMESPACE_OPTION)) { str.append( ";").append( entry.getKey()).append( "=").append( entry.getValue()); } } final GeneralEnvelope queryEnvelope = new GeneralEnvelope( new double[] { WEST, SOUTH }, new double[] { EAST, NORTH }); queryEnvelope.setCoordinateReferenceSystem(GeoWaveGTRasterFormat.DEFAULT_CRS); final GeoWaveRasterReader reader = new GeoWaveRasterReader( GeoWaveRasterConfig.readFromConfigParams(str.toString())); final GridCoverage2D gridCoverage = reader.renderGridCoverage( "test", new Rectangle( 0, 0, 1024, 1024), queryEnvelope, null, null, null); final RenderedImage result = gridCoverage.getRenderedImage(); // test the result with expected, allowing for minimal error final BufferedImage reference = ImageIO.read(new File( REFERENCE_LANDSAT_IMAGE_PATH)); TestUtils.testTileAgainstReference( PlanarImage.wrapRenderedImage( result).getAsBufferedImage(), reference, 0, 0.005); MapProjection.SKIP_SANITY_CHECKS = false; } }