Package org.geotools.arcsde.raster.gce

Source Code of org.geotools.arcsde.raster.gce.ArcSDEGridCoverage2DReaderJAILegacyOnlineTest

/**
*
*/
package org.geotools.arcsde.raster.gce;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.awt.Rectangle;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;

import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RecyclingTileFactory;
import javax.media.jai.TileCache;

import org.geotools.arcsde.ArcSDERasterFormatFactory;
import org.geotools.arcsde.session.ArcSDEConnectionConfig;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.coverage.grid.ViewType;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.OverviewPolicy;
import org.geotools.coverage.grid.io.imageio.GeoToolsWriteParams;
import org.geotools.gce.geotiff.GeoTiffFormat;
import org.geotools.gce.geotiff.GeoTiffWriteParams;
import org.geotools.gce.geotiff.GeoTiffWriter;
import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.image.jai.Registry;
import org.geotools.parameter.Parameter;
import org.geotools.util.logging.Logging;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.geometry.Envelope;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValueGroup;

import com.vividsolutions.jts.util.Stopwatch;

/**
* Tests over legacy data that should not be deleted
*
*
*
* @source $URL$
*/
@SuppressWarnings("nls")
@Ignore
public class ArcSDEGridCoverage2DReaderJAILegacyOnlineTest {

    private static final String RASTER_TEST_DEBUG_TO_DISK = "raster.test.debugToDisk";

    private static final Logger LOGGER = Logging.getLogger("org.geotools.arcsde.gce");

    /**
     * Whether to write the fetched rasters to disk or not
     */
    private static boolean DEBUG;

    static RasterTestData rasterTestData;

    private static String tableName;

    /**
     * If false, {@link #writeToDisk(RenderedImage, String)} is gonna write to a NULL OutputStream
     * instead of to a File
     */
    private boolean doWriteToDisk = true;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        rasterTestData = new RasterTestData();
        rasterTestData.setUp();
        DEBUG = Boolean
                .valueOf(rasterTestData.getRasterTestDataProperty(RASTER_TEST_DEBUG_TO_DISK));
        // rasterTestData.setOverrideExistingTestTables(false);
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        rasterTestData.tearDown();
    }

    /**
     * @throws java.lang.Exception
     */
    @Before
    public void setUp() throws Exception {
        // nothing to do
    }

    /**
     * @throws java.lang.Exception
     */
    @After
    public void tearDown() throws Exception {
        // try {
        // LOGGER.info("tearDown: deleting " + tableName);
        // // wait I may delete an actual business table, comment out until this suite is fully
        // // based on fake data rasterTestData.deleteTable(tableName);
        // } catch (Exception e) {
        // LOGGER.log(Level.INFO, "Error deleting test table " + tableName, e);
        // }
    }

    /**
     * Test method for
     * {@link org.geotools.arcsde.raster.gce.ArcSDEGridCoverage2DReaderJAI#getInfo()}.
     */
    @Test
    @Ignore
    public void testGetInfo() {
        fail("Not yet implemented");
    }

    @Test
    public void testIMG_USGSQUAD_SGBASE() throws Exception {
        tableName = "SDE.IMG_USGSQUAD_SGBASE";
        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final int count = 10;
        long time = 0;
        // warm up
        _testIMG_USGSQUAD_SGBASE(reader);
        for (int i = 0; i < count; i++) {
            time += _testIMG_USGSQUAD_SGBASE(reader);
        }
        System.err.println(count + " reads in " + time + "ms");
    }

    private long _testIMG_USGSQUAD_SGBASE(AbstractGridCoverage2DReader reader) throws Exception {

        // http://localhost:8080/geoserver/wms?WIDTH=256&LAYERS=sde%3AIMG_USGSQUAD_SGBASE&STYLES=&SRS=EPSG%3A26986&HEIGHT=256&FORMAT=image%2Fjpeg&TILED=true&TILESORIGIN=169118.35%2C874964.388&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=239038.74625,916916.62575,253022.8255,930900.705

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();

        final int reqWidth = 256;
        final int reqHeight = 256;

        GeneralEnvelope reqEnvelope = new GeneralEnvelope(originalEnvelope);
        reqEnvelope.setEnvelope(239038.74625, 916916.62575, 253022.8255, 930900.705);

        Stopwatch sw = new Stopwatch();
        sw.start();

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        RenderedImage image = coverage.getRenderedImage();
        writeToDisk(image, "testRead_" + tableName);
        sw.stop();
        return sw.getTime();
    }

    @Test
    public void testIMG_USGSQUAD_SGBASE2() throws Exception {
        initJAI();
        tableName = "SDE.IMG_USGSQUAD_SGBASE";
        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        // http://localhost:8080/geoserver/wms?WIDTH=256&LAYERS=sde%3AIMG_USGSQUAD_SGBASE&STYLES=&SRS=EPSG%3A26986&HEIGHT=256&FORMAT=image%2Fjpeg&TILED=true&TILESORIGIN=169118.35%2C874964.388&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=239038.74625,916916.62575,253022.8255,930900.705

        final GeneralEnvelope requestEnvelope =  new GeneralEnvelope(reader.getOriginalEnvelope());
        final GridEnvelope originalGridRange = reader.getOriginalGridRange();

        final int reqWidth = 1000;// originalGridRange.getSpan(0) / 30;
        final int reqHeight = 447;//originalGridRange.getSpan(1) / 30;


        requestEnvelope.setEnvelope(249403.30079879,929431.93501181,251110.35576095,930194.98857989);
        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, requestEnvelope);
        assertNotNull("read coverage returned null", coverage);

        RenderedImage image = coverage.getRenderedImage();
        writeToDisk(image, "testRead_" + tableName);
    }

    @Test
    public void testCOLOROQ_TEST() throws Exception {
        tableName = "SDE.RASTER.COLOROQ_TEST";
        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        System.out.println(reader.getInfo().getDescription());

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();

        final int reqWidth = 225;
        final int reqHeight = 512;

        GeneralEnvelope reqEnvelope = originalEnvelope;

        assertTrue(originalEnvelope.intersects(reqEnvelope, true));

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        writeToDisk(coverage, "testRead_" + tableName);

        RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
        writeToDisk(image, tableName);
    }

    @Test
    public void testReadIMG_USGSQUADM_Buggy() throws Exception {
        // http://localhost:8080/geoserver/wms?HEIGHT=500&WIDTH=1200&LAYERS=sde:IMG_USGSQUADM&STYLES=&SRS=EPSG%3A26986&FORMAT=image%2Fjpeg&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=253178.45971681,872419.13604732,253521.78247071,872562.18719478
        // http://arcy.opengeo.org:8080/geoserver/wms?SRS=EPSG%3A26986&WIDTH=950&STYLES=&HEIGHT=400&LAYERS=massgis%3ASDE.IMG_USGSQUADM&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=290557.15234375,932233.3984375,325347.19140625,946881.8359375
        tableName = "SDE.IMG_USGSQUADM";
        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        LOGGER.info("Original envelope: " + reader.getOriginalEnvelope());
        final GeneralEnvelope requestEnvelope = new GeneralEnvelope(reader.getOriginalEnvelope());
        requestEnvelope.setEnvelope(32168.0, 773720.0, 333224.0, 962136.0);
        final int reqWidth = 294;
        final int reqHeight =184;

        //requestEnvelope.setEnvelope(33000.0, 774000.0, 333002.0, 962000.0);
//        final int reqWidth = 150001;// 294;
//        final int reqHeight = 94000;// 184;

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, requestEnvelope);
        assertNotNull("read coverage returned null", coverage);

        System.err.println("Requested envelope " + requestEnvelope);
        System.err.println("Result envelope    " + coverage.getGridGeometry().getEnvelope());
        System.err.println("Result grid range  " + coverage.getGridGeometry().getGridRange());

        initJAI();
        // RenderedImage image = coverage.getRenderedImage();
        writeToDisk(coverage, "testRead_" + tableName);
    }

    private void initJAI() {
        final boolean tileRecycling = true;
        final double memoryFactor = 0.5;
        final float memoryThreshold = 0.75f;
        final boolean useImageIOCache = false;
        final int tileThreads = 7;
        final int tilePriority = 5;

        JAI jaiDef = JAI.getDefaultInstance();

        // setting JAI wide hints
        jaiDef.setRenderingHint(JAI.KEY_CACHED_TILE_RECYCLING_ENABLED, tileRecycling);

        // tile factory and recycler
        final RecyclingTileFactory recyclingFactory = new RecyclingTileFactory();
        jaiDef.setRenderingHint(JAI.KEY_TILE_FACTORY, recyclingFactory);
        jaiDef.setRenderingHint(JAI.KEY_TILE_RECYCLER, recyclingFactory);

        // Setting up Cache Capacity
        TileCache jaiCache = jaiDef.getTileCache();

        long jaiMemory = (long) (memoryFactor * Runtime.getRuntime().maxMemory());
        jaiCache.setMemoryCapacity(jaiMemory);

        // Setting up Cahce Threshold
        jaiCache.setMemoryThreshold(memoryThreshold);

        jaiDef.getTileScheduler().setParallelism(tileThreads);
        jaiDef.getTileScheduler().setPrefetchParallelism(7);
        jaiDef.getTileScheduler().setPriority(tilePriority);
        jaiDef.getTileScheduler().setPrefetchPriority(5);

        // ImageIO Caching
        ImageIO.setUseCache(useImageIOCache);

        // ImageIO.setCacheDirectory(new File("/Users/groldan/tmp/cache"));

        // Workaround for native mosaic BUG
        Registry.setNativeAccelerationAllowed("Mosaic", false, jaiDef);
    }

    public static void main(String[] argv) {
        try {
            ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.setUpBeforeClass();
            ArcSDEGridCoverage2DReaderJAILegacyOnlineTest test = new ArcSDEGridCoverage2DReaderJAILegacyOnlineTest();
            test.setUp();

            test.testReadIMG_USGSQUADM();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    @Test
    public void testReadIMG_USGSQUADM() throws Exception {

        initJAI();

        doWriteToDisk = false;

        tableName = "SDE.RASTER.IMG_USGSQUADM";
        // tableName = "SDE.RASTER.IMG_USGSQUAD_SGBASE";
        getReader();

        final int count = 10;
        final int threads = 30;
        final AtomicInteger writeCount = new AtomicInteger();
        Stopwatch sw = new Stopwatch();
        sw.start();

        List<Callable<Object>> tasks = new ArrayList<Callable<Object>>(threads);

        final long[] stats = { Long.MAX_VALUE, Long.MIN_VALUE, 0, 0 };// min/max/total/max mem

        for (int t = 0; t < threads; t++) {
            tasks.add(new Callable<Object>() {
                public Object call() throws Exception {
                    try {

                        final AbstractGridCoverage2DReader reader = getReader();
                        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

                        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
                        final GridEnvelope originalGridRange = reader.getOriginalGridRange();

                        final int reqWidth = originalGridRange.getSpan(0) / 200;
                        final int reqHeight = originalGridRange.getSpan(1) / 200;

                        for (int i = 0; i < count; i++) {
                            final GeneralEnvelope reqEnv = new GeneralEnvelope(originalEnvelope);
                            {
                                double dx = (originalEnvelope.getSpan(0) / 2) / (2 * i + 1);
                                double dy = (originalEnvelope.getSpan(1) / 2) / (2 * i + 1);
                                reqEnv.setEnvelope(originalEnvelope.getMedian(0) - dx,
                                        originalEnvelope.getMedian(1) - dy,
                                        originalEnvelope.getMedian(0) + dx,
                                        originalEnvelope.getMedian(1) + dy);
                            }

                            final GridCoverage2D coverage = readCoverage(reader, reqWidth,
                                    reqHeight, reqEnv);
                            assertNotNull("read coverage returned null", coverage);

                            RenderedImage image = coverage.view(ViewType.PHOTOGRAPHIC)
                                    .getRenderedImage();
                            // RenderedImage image =
                            // coverage.view(ViewType.NATIVE).getRenderedImage();
                            Stopwatch sw = new Stopwatch();
                            sw.start();
                            writeToDisk(image, "testRead_" + tableName);
                            sw.stop();
                            long memMB = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime()
                                    .freeMemory()) / 1024 / 1024;
                            System.err.println("wrote #" + writeCount.incrementAndGet() + " in "
                                    + sw.getTimeString() + ": Mem: " + memMB + "M. Thread: "
                                    + Thread.currentThread().getName() + ", iteration #" + i);

                            synchronized (stats) {
                                stats[0] = Math.min(stats[0], sw.getTime());
                                stats[1] = Math.max(stats[1], sw.getTime());
                                stats[2] = stats[2] + sw.getTime();
                                stats[3] = Math.max(stats[3], memMB);
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                    return null;
                }
            });
        }

        ExecutorService threadPool = Executors.newFixedThreadPool(threads);
        threadPool.invokeAll(tasks);

        threadPool.shutdown();
        while (!threadPool.isTerminated()) {
            Thread.sleep(100);
        }
        sw.stop();
        System.err.println("____ Finished in " + sw.getTimeString() + ". Min: " + stats[0]
                + ", Max: " + stats[1] + ", total execution time: " + stats[2] + ", Avg: "
                + (stats[2] / (threads * count)) + ". Max mem: " + stats[3] + "MB");
        System.err.println("__________________\n  SNAPSHOT!!!!!!!!");
        // Thread.sleep(5000);
    }

    @Test
    public void testReadIMGCOQ_2005() throws Exception {
        tableName = "SDE.RASTER.IMG_COQ2005_CLIP_BOS";

        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
        GridEnvelope originalGridRange = reader.getOriginalGridRange();

        final int reqWidth = originalGridRange.getSpan(0) / 2;
        final int reqHeight = originalGridRange.getSpan(1) / 2;

        Envelope reqEnvelope = originalEnvelope;

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        GridGeometry2D gg = coverage.getGridGeometry();
        Envelope2D envelope2D = gg.getEnvelope2D();
        GridEnvelope gridRange = gg.getGridRange();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnvelope);

        System.out.println("result envelope   : " + envelope2D);

        // RenderedImage image = coverage.getRenderedImage();
        // writeToDisk(coverage, "testRead_" + tableName);

        RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
        writeToDisk(image, tableName);

        writeBand(image, new int[] { 0 }, "red");
        writeBand(image, new int[] { 1 }, "green");
        writeBand(image, new int[] { 2 }, "blue");
        writeBand(image, new int[] { 3 }, "alpha");

        writeBand(image, new int[] { 0, 1, 2 }, "rgb");
    }

    @Test
    public void testIMG_WIND_SPD30M_ADAMS() throws Exception {
        tableName = "SDE.RASTER.IMG_WIND_SPD30M_ADAMS";

        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
        GridEnvelope originalGridRange = reader.getOriginalGridRange();

        final int reqWidth = originalGridRange.getSpan(0);
        final int reqHeight = originalGridRange.getSpan(1);

        GeneralEnvelope reqEnvelope = originalEnvelope;
        reqEnvelope.setCoordinateReferenceSystem(originalEnvelope.getCoordinateReferenceSystem());

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        GridGeometry2D gg = coverage.getGridGeometry();
        Envelope2D envelope2D = gg.getEnvelope2D();
        GridEnvelope gridRange = gg.getGridRange();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnvelope);

        System.out.println("result envelope   : " + envelope2D);

        // writeToDisk(coverage, "testRead_" + tableName);
    }

    @Test
    public void testReadNOAA_13006_1() throws Exception {
        tableName = "SDE.RASTER.NOAA_13006_1";

        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();

        final int reqWidth = 100;// 800;// originalGridRange.getSpan(0) / 8;
        final int reqHeight = 75;// 595;// originalGridRange.getSpan(1) / 8;

        GeneralEnvelope reqEnvelope = new GeneralEnvelope(new double[] { 274059, 837434 },
                new double[] { 355782, 898216 });
        reqEnvelope.setCoordinateReferenceSystem(originalEnvelope.getCoordinateReferenceSystem());

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        GridGeometry2D gg = coverage.getGridGeometry();
        Envelope2D envelope2D = gg.getEnvelope2D();
        GridEnvelope gridRange = gg.getGridRange();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnvelope);

        System.out.println("result envelope   : " + envelope2D);

        writeToDisk(coverage, "testRead_" + tableName);

        RenderedImage image = coverage.getRenderedImage();
        ColorModel colorModel = image.getColorModel();

        assertTrue(colorModel instanceof IndexColorModel);
        IndexColorModel cm = ((IndexColorModel) colorModel);

        int numComponents = cm.getMapSize();
        byte[] r = new byte[numComponents];
        byte[] g = new byte[numComponents];
        byte[] b = new byte[numComponents];
        byte[] a = new byte[numComponents];
        cm.getReds(r);
        cm.getGreens(g);
        cm.getBlues(b);
        cm.getAlphas(a);
        for (int i = 0; i < numComponents; i++) {
            System.out.print(i + " = ");
            System.out.print((int) r[i] & 0xFF);
            System.out.print(',');
            System.out.print((int) g[i] & 0xFF);
            System.out.print(',');
            System.out.print((int) b[i] & 0xFF);
            System.out.print(',');
            System.out.print((int) a[i] & 0xFF);
            System.out.print('\n');
        }
    }

    private void writeBand(RenderedImage image, int[] bands, String channel) throws Exception {
        ParameterBlock pb = new ParameterBlock();
        pb.addSource(image);
        pb.add(bands);
        PlanarImage alpha = JAI.create("bandSelect", pb);
        writeToDisk(alpha, tableName + "_" + channel);
    }

    @Test
    public void testReadIMGCOQ_2001() throws Exception {
        tableName = "SDE.RASTER.IMG_COQ2001_CLIP_BOS_1";
        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
        GridEnvelope originalGridRange = reader.getOriginalGridRange();

        final int reqWidth = originalGridRange.getSpan(0) / 4;
        final int reqHeight = originalGridRange.getSpan(1) / 4;

        Envelope reqEnvelope = originalEnvelope;
        // GeneralEnvelope reqEnvelope = new GeneralEnvelope(originalEnvelope
        // .getCoordinateReferenceSystem());
        //
        // final double reqMinx = 235901.26048201;
        // final double reqMiny = 901552.0880242661;
        // final double reqMaxx = 236781.26048201;
        // final double reqMaxy = 902253.0880242661;
        //
        // reqEnvelope.setEnvelope(reqMinx, reqMiny, reqMaxx, reqMaxy);

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        GridGeometry2D gg = coverage.getGridGeometry();
        Envelope2D envelope2D = gg.getEnvelope2D();
        GridEnvelope gridRange = gg.getGridRange();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnvelope);

        System.out.println("result envelope   : " + envelope2D);

        // RenderedImage image = coverage.getRenderedImage();
        // writeToDisk(coverage, "testRead_" + tableName);
    }

    private void writeToDisk(GridCoverage2D coverage, String fileName) throws Exception {

        OutputStream outStream;
        {
            String file = System.getProperty("user.home");
            file += File.separator + "arcsde_test" + File.separator + fileName + ".tiff";
            File path = new File(file);
            path.getParentFile().mkdirs();
            outStream = new FileOutputStream(path);
        }

        // good for all params
        final GeoTiffWriteParams wp = new GeoTiffWriteParams();
        wp.setCompressionMode(GeoTiffWriteParams.MODE_EXPLICIT);
        wp.setCompressionType("LZW");
        wp.setCompressionQuality(0.75F);
        wp.setTilingMode(GeoToolsWriteParams.MODE_EXPLICIT);
        wp.setTiling(128, 128);
        GeoTiffFormat format = new GeoTiffFormat();
        final ParameterValueGroup writerParams = format.getWriteParameters();
        writerParams.parameter(AbstractGridFormat.GEOTOOLS_WRITE_PARAMS.getName().toString())
                .setValue(wp);

        // write down
        GeoTiffWriter writer = (GeoTiffWriter) format.getWriter(outStream);
        try {
            GeneralParameterValue[] params = (GeneralParameterValue[]) writerParams.values()
                    .toArray(new GeneralParameterValue[1]);
            writer.write(coverage, params);
        } finally {
            writer.dispose();
            outStream.close();
        }
       
    }

    private static AtomicInteger wc = new AtomicInteger();

    private void writeToDisk(final RenderedImage image, String fileName) throws Exception {
        if (!DEBUG) {
            LOGGER.fine("DEBUG == false, not writing image to disk");
            return;
        }
        String file = System.getProperty("user.home");
        file += File.separator + "arcsde_test" + File.separator + fileName + "_"
                + wc.incrementAndGet() + ".tiff";
        File path = new File(file);
        path.getParentFile().mkdirs();

        // System.out.println("\n --- Writing to " + file);
        try {
            long t = System.currentTimeMillis();

            if (doWriteToDisk) {
                ImageIO.write(image, "TIFF", path);
                // ImageWorker iw = new ImageWorker(image);
                // iw.write(path);
            } else {
                OutputStream destination = new OutputStream() {
                    @Override
                    public void write(byte[] b, int o, int l) throws IOException {
                    }

                    @Override
                    public void write(int b) throws IOException {
                    }
                };
                ImageIO.write(image, "TIFF", destination);
            }

            t = System.currentTimeMillis() - t;
            // System.out.println(" - wrote in " + t + "ms" + file);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    private GridCoverage2D readCoverage(final AbstractGridCoverage2DReader reader,
            final int reqWidth, final int reqHeight, final Envelope reqEnv) throws Exception {

        GeneralParameterValue[] requestParams = new Parameter[2];

        GridGeometry2D gg2d;
        gg2d = new GridGeometry2D(new GridEnvelope2D(new Rectangle(reqWidth, reqHeight)), reqEnv);

        requestParams[0] = new Parameter<GridGeometry2D>(AbstractGridFormat.READ_GRIDGEOMETRY2D,
                gg2d);
        requestParams[1] = new Parameter<OverviewPolicy>(AbstractGridFormat.OVERVIEW_POLICY,
                OverviewPolicy.NEAREST);

        final GridCoverage2D coverage;
        coverage = (GridCoverage2D) reader.read(requestParams);

        return coverage;
    }

    private AbstractGridCoverage2DReader getReader() throws IOException {
        final ArcSDEConnectionConfig config = rasterTestData.getConnectionPool().getConfig();

        final String rgbUrl = "sde://" + config.getUserName() + ":" + config.getPassword() + "@"
                + config.getServerName() + ":" + config.getPortNumber() + "/"
                + config.getDatabaseName() + "#" + tableName
                + ";pool.minConnections=2;pool.maxConnections=2";
        // + config.getMinConnections() + ";pool.maxConnections=" + config.getMaxConnections();

        final ArcSDERasterFormat format = new ArcSDERasterFormatFactory().createFormat();

        AbstractGridCoverage2DReader reader = format.getReader(rgbUrl);
        return reader;
    }

    @Test
    public void testReadRUGGED_RD() throws Exception {
        tableName = "SDE.RASTER.RUGGED_RD";

        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
        GridEnvelope originalGridRange = reader.getOriginalGridRange();

        final int reqWidth = originalGridRange.getSpan(0) / 8;
        final int reqHeight = originalGridRange.getSpan(1) / 8;

        Envelope reqEnvelope = originalEnvelope;

        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
        assertNotNull("read coverage returned null", coverage);

        GridGeometry2D gg = coverage.getGridGeometry();
        Envelope2D envelope2D = gg.getEnvelope2D();
        GridEnvelope gridRange = gg.getGridRange();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnvelope);

        System.out.println("result envelope   : " + envelope2D);

        // RenderedImage image = coverage.getRenderedImage();
        // writeToDisk(coverage, "testRead_" + tableName);

        RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
        writeToDisk(image, tableName);

        // writeBand(image, new int[] { 0 }, "band1");
    }

    @Test
    public void testDescribe() throws Exception {
        tableName = "SDE.IMG_USGSQUADM";

        final AbstractGridCoverage2DReader reader = getReader();
        assertNotNull("Couldn't obtain a reader for " + tableName, reader);

        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
        GridEnvelope originalGridRange = reader.getOriginalGridRange();
        LOGGER.info("original envelope  : " + originalEnvelope);
        LOGGER.info("original grid range: " + originalGridRange);

        int reqWidth = 294;
        int reqHeight = 184;
        GeneralEnvelope reqEnv = new GeneralEnvelope(
                originalEnvelope.getCoordinateReferenceSystem());
        // reqEnv.setEnvelope(236534.9499999986, 901973.4499999813, 236718.8499999986,
        // 902163.0499999814);
        //
        // reqEnv.setEnvelope(32680.0,774232.0,333736.0,962648.0);
        reqEnv.setEnvelope(33192.0, 774244.0, 333224.0, 962136.0);
        GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnv);

        GridGeometry2D gridGeometry = coverage.getGridGeometry();
        GridEnvelope gridRange = gridGeometry.getGridRange();
        Envelope2D envelope2d = gridGeometry.getEnvelope2D();

        System.out.println("requested size: " + reqWidth + "x" + reqHeight);
        System.out.println("result size   : " + gridRange.getSpan(0) + "x" + gridRange.getSpan(1));

        System.out.println("requested envelope: " + reqEnv);
        System.out.println("result envelope   : " + envelope2d);

        writeToDisk(coverage.getRenderedImage(), tableName);
    }

}
TOP

Related Classes of org.geotools.arcsde.raster.gce.ArcSDEGridCoverage2DReaderJAILegacyOnlineTest

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.