This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 6dbc0b9dadfe6d8d056f9470554af75b5fcf7fd0 Author: Martin Desruisseaux <[email protected]> AuthorDate: Thu Oct 14 01:34:35 2021 +0200 GeoTIFF reader should declare "GDAL_NODATA" tag as the "fill value" of `SampleDimension`. --- .../java/org/apache/sis/storage/landsat/Band.java | 4 +-- .../sis/internal/geotiff/SchemaModifier.java | 30 +++++++++++++++++++--- .../apache/sis/internal/geotiff/package-info.java | 2 +- .../sis/storage/geotiff/ImageFileDirectory.java | 5 ++-- .../apache/sis/storage/geotiff/package-info.java | 2 +- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/Band.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/Band.java index 850992e..dd9b4dd 100644 --- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/Band.java +++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/landsat/Band.java @@ -48,7 +48,7 @@ import static org.apache.sis.internal.util.CollectionsExt.first; * A band in a Landsat data set. Each band is represented by a separated GeoTIFF file. * * @author Martin Desruisseaux (Geomatys) - * @version 1.1 + * @version 1.2 * @since 1.1 * @module */ @@ -193,7 +193,7 @@ final class Band extends GridResourceWrapper implements SchemaModifier { */ @Override public SampleDimension customize(final int image, final int band, final NumberRange<?> sampleRange, - final SampleDimension.Builder dimension) + final Number fillValue, final SampleDimension.Builder dimension) { if ((image | band) == 0) { dimension.setName(identifier); diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/SchemaModifier.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/SchemaModifier.java index 6ca2d94..ed21c4b 100644 --- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/SchemaModifier.java +++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/SchemaModifier.java @@ -16,6 +16,7 @@ */ package org.apache.sis.internal.geotiff; +import org.apache.sis.util.resources.Vocabulary; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.measure.NumberRange; import org.apache.sis.metadata.iso.DefaultMetadata; @@ -31,7 +32,7 @@ import org.opengis.util.GenericName; * @todo May move to public API (in revised form) in a future version. * * @author Martin Desruisseaux (Geomatys) - * @version 1.1 + * @version 1.2 * @since 1.1 * @module */ @@ -73,18 +74,39 @@ public interface SchemaModifier { * Implementations can override this method for setting a better name or for declaring the * meaning of sample values (by adding "categories"). * - * <p>The default implementation returns {@code builder.build()} without making any change.</p> + * <div class="note"><b>API note:</b> + * the zero fill value is excluded because tiles are already initialized to zero by default, + * and because conversions between "real world" values and "packaged values" already use 0 + * as the background value if no category is specified. We avoid specifying categories when + * not necessary because GeoTIFF does not really has this information. + * </div> + * + * The default implementation creates categories only if {@code fillValue} is non-null. + * In such case, the fill value is also defined as the background value. * * @param image index of the image for which to create sample dimension. * @param band index of the band for which to create sample dimension. * @param sampleRange minimum and maximum values declared in the TIFF tags, or {@code null} if unknown. + * @param fillValue the "no data" value, or {@code null} if none or zero. May intersect {@code sampleRange}. * @param dimension a sample dimension builder initialized with band number as the dimension name. * This builder can be modified in-place. * @return the sample dimension to use. */ - default SampleDimension customize(final int image, final int band, final NumberRange<?> sampleRange, - final SampleDimension.Builder dimension) + default SampleDimension customize(final int image, final int band, NumberRange<?> sampleRange, + final Number fillValue, final SampleDimension.Builder dimension) { + if (fillValue != null) { + dimension.setBackground(null, fillValue); + if (sampleRange != null && sampleRange.containsAny(fillValue)) { + final double fill = fillValue.doubleValue(); + if (sampleRange.getMaxDouble() - fill < fill - sampleRange.getMinDouble()) { + sampleRange = NumberRange.createBestFit(sampleRange.getMinValue(), sampleRange.isMinIncluded(), fill, false); + } else { + sampleRange = NumberRange.createBestFit(fill, false, sampleRange.getMaxValue(), sampleRange.isMaxIncluded()); + } + dimension.addQuantitative(Vocabulary.formatInternational(Vocabulary.Keys.Values), sampleRange, sampleRange); + } + } return dimension.build(); } diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/package-info.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/package-info.java index 6a442dc..3c0a725 100644 --- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/package-info.java +++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/geotiff/package-info.java @@ -24,7 +24,7 @@ * may change in incompatible ways in any future version without notice. * * @author Martin Desruisseaux (Geomatys) - * @version 1.1 + * @version 1.2 * @since 0.8 * @module */ diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java index f881ef4..0cc2f23 100644 --- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java +++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java @@ -1455,8 +1455,8 @@ final class ImageFileDirectory extends DataCube { minValues.get(Math.min(band, minValues.size()-1)), true, maxValues.get(Math.min(band, maxValues.size()-1)), true); } - dimensions[band] = reader.store.customizer.customize( - index, band, sampleRange, builder.setName(++band)); + dimensions[band] = reader.store.customizer.customize(index, band, + sampleRange, getFillValue(), builder.setName(++band)); builder.clear(); } sampleDimensions = UnmodifiableArrayList.wrap(dimensions); @@ -1632,6 +1632,7 @@ final class ImageFileDirectory extends DataCube { /** * Returns the value to use for filling empty spaces in the raster, or {@code null} if none, * not different than zero or not valid for the target data type. + * The zero value is excluded because tiles are already initialized to zero by default. */ @Override protected Number getFillValue() { diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/package-info.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/package-info.java index 32e589e..caff3c6 100644 --- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/package-info.java +++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/package-info.java @@ -32,7 +32,7 @@ * @author Thi Phuong Hao Nguyen (VNSC) * @author Minh Chinh Vu (VNSC) * @author Martin Desruisseaux (Geomatys) - * @version 1.0 + * @version 1.2 * @since 0.8 * @module */
