Coverage MultiDimensional

Module looking into coverage “ND” (for N-Dimensional).

The following Module contains two new plugins for reading the following raster formats:

  • NetCDF

  • Grib

Also the module contains a sub-module called gt-coverage-api containing a few classes than can be used for creating a new plugin for another multidimensional raster format.

It should be pointed out that the two modules internally use the Unidata JAVA Libraries for accessing the data.

NetCDF

The NetCDF plugin gives the ability to access to a NetCDF file. The Maven dependency associated is:

<dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-netcdf</artifactId>
        <version>${geotools.version}</version>
</dependency>

For reading a NetCDF file we must follow these simple steps:

  • Create a new instance of NetCDFReader;

  • Get the name of all the input coverages;

  • Select one of them and use it;

Here is described an example:

public static void test(){

        // Selection of the NetCDF file
        File file = new File("path/to/file.nc");

        // Creation of the NetCDF reader
        final NetCDFReader reader = new NetCDFReader(file, null);

        // It is better to surround this part of code with a try-finally construct
        // in order to avoid to leave the reader unclosed.
        try {
                // Getting the coverage names
                String[] names = reader.getGridCoverageNames();

                // Selection of the first coverage name
                String first = names[0];

                // Selection of the coverage associated to the name
                GridCoverage2D grid = reader.read(first, null);

                // Example: Get the value for the following position.
                float[] value = grid.evaluate((Position) new
                        Position2D(grid.getCoordinateReferenceSystem(), 5, 45 ), new float[1]);

        } finally {
                // Closure of the Reader
                if (reader != null) {
                        try {
                                reader.dispose();
                        } catch (Throwable t) {
                                // Log the exception
                        }
                }
        }
}

Multiple bands dimensions are supported, although some configuration needs to be provided through the ancillary file. Let’s consider that we have a dimension called data that contains three values quality, pressure and temperature. An ancillary file similar to this one needs to be provided:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Indexer>
    <coverages>
        <coverage>
            <schema name="station">
                <attributes>the_geom:Polygon,imageindex:Integer,time:java.util.Date</attributes>
            </schema>
            <origName>station</origName>
            <name>station</name>
        </coverage>
    </coverages>
    <multipleBandsDimensions>
                <multipleBandsDimension>
                        <name>data</name>
                        <bandsNames>quality,pressure,temperature</bandsNames>
                </multipleBandsDimension>
        </multipleBandsDimensions>
</Indexer>

The data dimension values will be mapped to three bands called quality, pressure and temperature.

Default Enhance Mode

The default Enhance mode used by GeoTools is Enhance.CoordSys, in order to change the enhance mode use the following system properties:

  • org.geotools.coverage.io.netcdf.enhance.CoordSystems

  • org.geotools.coverage.io.netcdf.enhance.ScaleMissing

  • org.geotools.coverage.io.netcdf.enhance.ConvertEnums

  • org.geotools.coverage.io.netcdf.enhance.ScaleMissingDefer

These can be set individually. According to the NetCDF-Java docs it is not safe to use ScaleMissing and ScaleMissingDefer simultaneously.

GRIB

The GRIB plugin does the same operations on the GRIB files. The Maven dependency associated is:

<dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-grib</artifactId>
        <version>${geotools.version}</version>
</dependency>

The GRIB module only loads the Unidata libraries associated with the GRIB format and it internally calls the NetCDF reader for accessing the data. For this reason the example above can also be used for GRIB data.