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
  */

Reply via email to