/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.transform;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.SampleModel;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.media.jai.ImageLayout;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.importer.ImportContext;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.ImporterTestSupport;
import org.geoserver.importer.SpatialFile;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.referencing.CRS;
import org.junit.Assume;
import org.junit.Test;
public class GdalTransformTest extends ImporterTestSupport {
@Test
public void testGdalTranslateTrasform() throws Exception {
Assume.assumeTrue(GdalTranslateTransform.isAvailable());
File dir = unpack("geotiff/EmissiveCampania.tif.bz2");
File tif = new File(dir, "EmissiveCampania.tif");
ImportContext context = importer.createContext(new SpatialFile(tif));
assertEquals(1, context.getTasks().size());
ImportTask task = context.getTasks().get(0);
assertEquals(ImportTask.State.READY, task.getState());
// setup the transformation
GdalTranslateTransform gtx = buildGdalTranslate();
task.getTransform().add(gtx);
assertEquals("EmissiveCampania", task.getLayer().getResource().getName());
importer.run(context);
Catalog cat = getCatalog();
assertNotNull(cat.getLayerByName("EmissiveCampania"));
assertEquals(ImportTask.State.COMPLETE, task.getState());
runChecks("EmissiveCampania");
// check we did the gdal_transform on the file
GeoTiffReader reader = null;
try {
reader = new GeoTiffReader(tif);
ImageLayout layout = reader.getImageLayout();
ColorModel cm = layout.getColorModel(null);
assertEquals(3, cm.getNumComponents());
SampleModel sm = layout.getSampleModel(null);
assertEquals(3, sm.getNumBands());
assertEquals(DataBuffer.TYPE_BYTE, sm.getDataType());
assertEquals(0, reader.getNumOverviews());
} finally {
if (reader != null) {
reader.dispose();
}
}
}
@Test
public void testGdalAddo() throws Exception {
Assume.assumeTrue(GdalAddoTransform.isAvailable());
File dir = unpack("geotiff/EmissiveCampania.tif.bz2");
File tif = new File(dir, "EmissiveCampania.tif");
ImportContext context = importer.createContext(new SpatialFile(tif));
assertEquals(1, context.getTasks().size());
ImportTask task = context.getTasks().get(0);
assertEquals(ImportTask.State.READY, task.getState());
// setup the transformation
GdalAddoTransform gad = buildGdalAddo();
task.getTransform().add(gad);
assertEquals("EmissiveCampania", task.getLayer().getResource().getName());
importer.run(context);
Catalog cat = getCatalog();
assertNotNull(cat.getLayerByName("EmissiveCampania"));
assertEquals(ImportTask.State.COMPLETE, task.getState());
runChecks("EmissiveCampania");
// check we did the gdaladdo on the file
GeoTiffReader reader = null;
try {
reader = new GeoTiffReader(tif);
ImageLayout layout = reader.getImageLayout();
ColorModel cm = layout.getColorModel(null);
assertEquals(16, cm.getNumComponents());
SampleModel sm = layout.getSampleModel(null);
assertEquals(16, sm.getNumBands());
assertEquals(DataBuffer.TYPE_USHORT, sm.getDataType());
assertEquals(3, reader.getNumOverviews());
} finally {
if (reader != null) {
reader.dispose();
}
}
}
@Test
public void testTranslateAddo() throws Exception {
Assume.assumeTrue(GdalTranslateTransform.isAvailable());
Assume.assumeTrue(GdalAddoTransform.isAvailable());
File dir = unpack("geotiff/EmissiveCampania.tif.bz2");
File tif = new File(dir, "EmissiveCampania.tif");
ImportContext context = importer.createContext(new SpatialFile(tif));
assertEquals(1, context.getTasks().size());
ImportTask task = context.getTasks().get(0);
assertEquals(ImportTask.State.READY, task.getState());
GdalTranslateTransform gtx = buildGdalTranslate();
task.getTransform().add(gtx);
GdalAddoTransform gad = buildGdalAddo();
task.getTransform().add(gad);
assertEquals("EmissiveCampania", task.getLayer().getResource().getName());
importer.run(context);
Catalog cat = getCatalog();
assertNotNull(cat.getLayerByName("EmissiveCampania"));
assertEquals(ImportTask.State.COMPLETE, task.getState());
runChecks("EmissiveCampania");
// check we did the gdal_transform and gdaladdo on the file
GeoTiffReader reader = null;
try {
reader = new GeoTiffReader(tif);
ImageLayout layout = reader.getImageLayout();
ColorModel cm = layout.getColorModel(null);
assertEquals(3, cm.getNumComponents());
SampleModel sm = layout.getSampleModel(null);
assertEquals(3, sm.getNumBands());
assertEquals(DataBuffer.TYPE_BYTE, sm.getDataType());
assertEquals(3, reader.getNumOverviews());
} finally {
if (reader != null) {
reader.dispose();
}
}
}
@Test
public void testWarpFromGroundControlPoint() throws Exception {
Assume.assumeTrue(GdalWarpTransform.isAvailable());
File dir = unpack("geotiff/box_gcp_fixed.tif.bz2");
File tif = new File(dir, "box_gcp_fixed.tif");
ImportContext context = importer.createContext(new SpatialFile(tif));
assertEquals(1, context.getTasks().size());
ImportTask task = context.getTasks().get(0);
assertEquals(ImportTask.State.READY, task.getState());
// setup the transformation
GdalWarpTransform warp = buildGdalWarp();
task.getTransform().add(warp);
assertEquals("box_gcp_fixed", task.getLayer().getResource().getName());
CoverageStoreInfo store = (CoverageStoreInfo) task.getStore();
assertEquals("GeoTIFF", store.getFormat().getName());
importer.run(context);
Catalog cat = getCatalog();
assertNotNull(cat.getLayerByName("box_gcp_fixed"));
assertEquals(ImportTask.State.COMPLETE, task.getState());
runChecks("box_gcp_fixed");
// check we did the gdaladdo on the file
GeoTiffReader reader = null;
try {
reader = new GeoTiffReader(tif);
ImageLayout layout = reader.getImageLayout();
ColorModel cm = layout.getColorModel(null);
assertEquals(3, cm.getNumComponents());
SampleModel sm = layout.getSampleModel(null);
assertEquals(1, sm.getNumBands());
assertEquals(DataBuffer.TYPE_BYTE, sm.getDataType());
assertEquals(0, reader.getNumOverviews());
assertEquals(Integer.valueOf(4326),
CRS.lookupEpsgCode(reader.getCoordinateReferenceSystem(), false));
} finally {
if (reader != null) {
reader.dispose();
}
}
}
private GdalTranslateTransform buildGdalTranslate() {
List<String> options = new ArrayList<>();
options.add("-b");
options.add("1");
options.add("-b");
options.add("2");
options.add("-b");
options.add("3");
options.add("-ot");
options.add("Byte");
GdalTranslateTransform gtx = new GdalTranslateTransform(options);
return gtx;
}
private GdalAddoTransform buildGdalAddo() {
List<String> options = new ArrayList<>();
options.add("-r");
options.add("average");
List<Integer> levels = new ArrayList<>();
levels.add(2);
levels.add(4);
levels.add(8);
GdalAddoTransform gad = new GdalAddoTransform(options, levels);
return gad;
}
private GdalWarpTransform buildGdalWarp() {
List<String> options = new ArrayList<>();
options.add("-t_srs");
options.add("EPSG:4326");
GdalWarpTransform warp = new GdalWarpTransform(options);
return warp;
}
}