package org.geotoolkit.pending.demo.coverage;
import org.apache.sis.geometry.GeneralDirectPosition;
import org.geotoolkit.coverage.grid.GridCoverage2D;
import org.geotoolkit.coverage.io.CoverageIO;
import org.geotoolkit.coverage.io.GridCoverageReadParam;
import org.geotoolkit.coverage.io.GridCoverageReader;
import org.geotoolkit.gui.swing.render2d.JMap2DFrame;
import org.geotoolkit.image.iterator.PixelIterator;
import org.geotoolkit.image.iterator.PixelIteratorFactory;
import org.geotoolkit.map.CoverageMapLayer;
import org.geotoolkit.map.MapBuilder;
import org.geotoolkit.map.MapContext;
import org.geotoolkit.nio.IOUtilities;
import org.geotoolkit.pending.demo.Demos;
import org.geotoolkit.style.DefaultStyleFactory;
import org.geotoolkit.style.MutableStyleFactory;
import org.opengis.coverage.grid.GridCoverage;
import java.awt.image.RenderedImage;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
public class CoverageReaderDemo {
public static final MutableStyleFactory SF = new DefaultStyleFactory();
public static void main(String[] args) throws Exception {
Demos.init();
// Create a temp file to extract data from jar file.
final Path tempData = Files.createTempFile("tempCvg", ".grb");
try (InputStream stream = CoverageReaderDemo.class.getResourceAsStream("/data/grib/Atlantic.wave.grb")) {
IOUtilities.writeStream(stream, tempData);
}
/*
* DEFERRED READING
*/
final GridCoverageReadParam readParam = new GridCoverageReadParam();
// Here is the parameter which tells the reader to perform lazy loading.
readParam.setDeferred(true);
final GridCoverageReader reader = CoverageIO.createSimpleReader(tempData);
final GridCoverage coverage = reader.read(0, readParam);
// Ok, so how to use it now ?
// You can get pixel values directly.
coverage.evaluate(new GeneralDirectPosition(-100, 10, 0));
// But in most cases ...
if (coverage instanceof GridCoverage2D) {
// ... You will acquire iterator for fast and safe browsing.
final RenderedImage cvgData = ((GridCoverage2D) coverage).getRenderedImage();
final PixelIterator pxIterator = PixelIteratorFactory.createDefaultIterator(cvgData);
// What should you avoid to do with deferred reading ?
//Don't asked for the entire Raster of the image, it load all image data in memory.
cvgData.getData();
// Do not close your coverage reader before you've ended using your coverage, it would close connexion to the source,
// and tile loading will return you an error.
reader.dispose();
try {
cvgData.getTile(cvgData.getMinTileX(), cvgData.getMinTileY());
} catch (Exception e) {
e.printStackTrace();
}
}
// final File input = new File(CoverageReaderDemo.class.getResource("/data/coverage/clouds.jpg").toURI());
// final GridCoverageReader reader = CoverageIO.createSimpleReader(input);
// //print the iso 19115 metadata
// final Metadata metadata = reader.getMetadata();
// System.out.println(metadata);
//
// //read a piece of coverage
// final GridCoverageReadParam param = new GridCoverageReadParam();
// param.setResolution(1,1);
// param.setEnvelope(new Rectangle2D.Double(0, 0, 100, 100), CommonCRS.WGS84.normalizedGeographic());
//
// final GridCoverage2D coverage = (GridCoverage2D) reader.read(0, param);
// coverage.show();
/*
* USING THE RENDERER.
*/
//create a mapcontext
final MapContext context = MapBuilder.createContext();
final CoverageMapLayer cl = MapBuilder.createCoverageLayer(tempData);
context.layers().add(cl);
//display it
JMap2DFrame.show(context);
}
}