/*
* Geotools2 - OpenSource mapping toolkit
* http://geotools.org
* (C) 2002, Geotools Project Managment Committee (PMC)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
*/
package org.geotools.coverage.io.hdf4;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URL;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import javax.media.jai.PlanarImage;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.io.CoverageAccess;
import org.geotools.coverage.io.CoverageAccess.AccessType;
import org.geotools.coverage.io.CoverageSource;
import org.geotools.coverage.io.CoverageSource.HorizontalDomain;
import org.geotools.coverage.io.CoverageSource.TemporalDomain;
import org.geotools.coverage.io.CoverageSource.VerticalDomain;
import org.geotools.coverage.io.driver.DefaultFileDriver;
import org.geotools.coverage.io.driver.Driver.DriverOperation;
import org.geotools.coverage.io.impl.CoverageReadRequest;
import org.geotools.coverage.io.impl.CoverageResponse;
import org.geotools.coverage.io.impl.CoverageResponse.Status;
import org.geotools.coverage.io.impl.range.DefaultRangeType;
import org.geotools.coverage.io.range.FieldType;
import org.geotools.coverage.io.range.RangeType;
import org.geotools.test.TestData;
import org.geotools.util.NumberRange;
import org.opengis.coverage.Coverage;
import org.opengis.feature.type.Name;
import org.opengis.geometry.BoundingBox;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform2D;
import org.opengis.temporal.TemporalGeometricPrimitive;
public final class HDF4Test extends TestCase {
private final static Logger LOGGER = Logger.getLogger(HDF4Test.class.toString());
/**
* Creates a new instance of HDF4Test
*
* @param name
*/
public HDF4Test(String name) {
super(name);
}
public static void main(String[] args) {
TestRunner.run(suite());
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new HDF4Test("testReader"));
return suite;
}
public void testReader() throws IllegalArgumentException, IOException,
NoSuchAuthorityCodeException {
// boolean isInteractiveTest = TestData.isInteractiveTest();
boolean isInteractiveTest = false;
// create a base driver
final DefaultFileDriver driver = new HDF4Driver();
File testDir = TestData.file(this,".");
final String[] files = testDir.list(new FilenameFilter(){
public boolean accept(File dir, String name) {
return name.endsWith("hdf") || name.endsWith("hdf4") ;
}});
if (files==null||files.length==0){
LOGGER.warning("Test files not found:\n Tests are skipped");
return;
}
for(String filePath:files){
final File file= new File(testDir,filePath);
final URL source = file.toURI().toURL();
if (driver.canProcess(DriverOperation.CONNECT, source,null)) {
LOGGER.info("ACCEPTED: "+source.toString());
// getting access to the file
final CoverageAccess access = driver.process(DriverOperation.CONNECT,source, null, null,null);
if (access == null)
throw new IOException("Unable to connect");
// get the names
final List<Name> names = access.getNames(null);
for (Name name : names) {
// get a source
final CoverageSource gridSource = access.access(name, null,AccessType.READ_ONLY, null, null);
if (gridSource == null)
throw new IOException("Unable to access");
LOGGER.info("Connected to coverage: "+name.toString());
// TEMPORAL DOMAIN
final TemporalDomain temporalDomain = gridSource.getTemporalDomain();
if(temporalDomain==null)
LOGGER.info("Temporal domain is null");
else{
// temporal crs
LOGGER.info("TemporalCRS: "+temporalDomain.getCoordinateReferenceSystem());
// print the temporal domain elements
for(TemporalGeometricPrimitive tg:temporalDomain.getTemporalElements(null)){
LOGGER.info("TemporalGeometricPrimitive: "+tg.toString());
}
}
// VERTICAL DOMAIN
final VerticalDomain verticalDomain= gridSource.getVerticalDomain();
if(verticalDomain==null || verticalDomain.getVerticalElements(true, null).isEmpty())
LOGGER.info("Vertical domain is null");
else{
// vertical crs
LOGGER.info("VerticalCRS: "+verticalDomain.getCoordinateReferenceSystem());
// print the temporal domain elements
for(NumberRange<Double> vg:verticalDomain.getVerticalElements(true, null)){
LOGGER.info("Vertical domain element: "+vg.toString());
}
}
// HORIZONTAL DOMAIN
final HorizontalDomain horizontalDomain= gridSource.getHorizontalDomain();
if(horizontalDomain==null)
LOGGER.info("Horizontal domain is null");
else{
// print the horizontal domain elements
final CoordinateReferenceSystem crs2D=horizontalDomain.getCoordinateReferenceSystem2D();
assert crs2D!=null;
final MathTransform2D g2w=horizontalDomain.getGridToWorldTransform(null);
assert g2w !=null;
final Set<? extends BoundingBox> spatialElements = horizontalDomain.getSpatialElements(true,null);
assert spatialElements!=null&& !spatialElements.isEmpty();
final StringBuilder buf= new StringBuilder();
buf.append("Horizontal domain is as follows:\n");
buf.append("G2W:").append("\t").append(g2w).append("\n");
buf.append("CRS2D:").append("\t").append(crs2D).append("\n");
for(BoundingBox bbox:spatialElements)
buf.append("BBOX:").append("\t").append(bbox).append("\n");
LOGGER.info(buf.toString());
}
// RANGE TYPE
RangeType range = gridSource.getRangeType(null);
//
CoverageReadRequest readRequest = new CoverageReadRequest();
// //
//
// Setting up a limited range for the request.
//
// //
Iterator<FieldType> ftIterator = range.getFieldTypes().iterator();
HashSet<FieldType> fieldSet = new HashSet<FieldType>();
FieldType ft = null;
while (ftIterator.hasNext()) {
ft = ftIterator.next();
if (ft != null) {
fieldSet.add(ft);
}
break;
}
RangeType rangeSubset = new DefaultRangeType(range.getName(), range.getDescription(), fieldSet);
readRequest.setRangeSubset(rangeSubset);
// LinkedHashSet<Envelope> requestedVerticalSubset = new LinkedHashSet<Envelope>();
// final int numLevels = verticalDomain.size();
// final Iterator<Envelope> iterator = verticalDomain.iterator();
// if (!isExtensiveTest) {
// for (int i = 0; i < numLevels; i++) {
// Envelope level = iterator.next();
// if (i % (numLevels / 5) == 1)
// requestedVerticalSubset.add(level);
// }
// readRequest.setVerticalSubset(requestedVerticalSubset);
// }
CoverageResponse response = gridSource.read(readRequest, null);
if (response == null || response.getStatus() != Status.SUCCESS || !response.getExceptions().isEmpty())
throw new IOException("Unable to read");
final Collection<? extends Coverage> results = response.getResults(null);
for (Coverage c : results) {
GridCoverage2D coverage = (GridCoverage2D) c;
// Crs and envelope
if (isInteractiveTest) {
coverage.show();
}
else
PlanarImage.wrapRenderedImage(coverage.getRenderedImage()).getTiles();
final StringBuilder buffer= new StringBuilder();
buffer.append("GridCoverage CRS: ").append(coverage.getCoordinateReferenceSystem2D().toWKT()).append("\n");
buffer.append("GridCoverage GG: ").append(coverage.getGridGeometry().toString()).append( "\n");
LOGGER.info(buffer.toString());
}
}
} else
LOGGER.info("NOT ACCEPTED");
}
}
}