/**
*
*/
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);
}
}