You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2024/09/30 16:21:05 UTC
(sis) 04/04: Fix a spurious "no data" which was not supposed to be there after conversion to NaN. This spurious "no data" blocked the viewing of GeoTIFF with floating point numbers.
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 c0ea93a7411b9bd2f9f6d88c930f68914cad863b
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Mon Sep 30 18:18:35 2024 +0200
Fix a spurious "no data" which was not supposed to be there after conversion to NaN.
This spurious "no data" blocked the viewing of GeoTIFF with floating point numbers.
---
.../main/org/apache/sis/coverage/privy/ColorModelBuilder.java | 8 +++++---
.../org/apache/sis/storage/geotiff/ImageFileDirectory.java | 10 +++++++---
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
index cc67e17afa..bede3afd18 100644
--- a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
+++ b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
@@ -545,8 +545,8 @@ reuse: if (source != null) {
int deferred = 0; // Number of entries deferred to next loop.
int count = entries.length; // Total number of valid entries.
NumberRange<?> themes = null; // The range of values in a thematic map.
- final Map<NumberRange<Integer>,ColorsForRange> mapper = new HashMap<>();
- final SampleDimension.Builder builder = new SampleDimension.Builder();
+ final var mapper = new HashMap<NumberRange<Integer>, ColorsForRange>();
+ final var builder = new SampleDimension.Builder();
/*
* We will use the byte values range [0 … 255] with 0 reserved in priority for the most transparent pixels.
* The first loop below processes NaN values, which are usually the ones associated to transparent pixels.
@@ -573,7 +573,9 @@ reuse: if (source != null) {
builder.mapQualitative(entry.name(), targetRange, (float) value);
} else {
if (value == entry.sampleRange.getMaxDouble()) {
- sourceRange = NumberRange.create(value - 0.5, true, value + 0.5, false);
+ sourceRange = NumberRange.create(
+ Math.min(value - 0.5, Math.nextDown(value)), true,
+ Math.max(value + 0.5, Math.nextUp(value)), false);
}
builder.addQuantitative(entry.name(), targetRange, sourceRange);
themes = (themes != null) ? themes.unionAny(sourceRange) : sourceRange;
diff --git a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
index e115ebe374..887ce92d68 100644
--- a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
+++ b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
@@ -1548,10 +1548,14 @@ final class ImageFileDirectory extends DataCube {
public List<SampleDimension> getSampleDimensions() throws DataStoreContentException {
synchronized (getSynchronizationLock()) {
if (sampleDimensions == null) {
- final Number fill = getFillValue(true);
+ /*
+ * For floating point type, `DataSubset.createWritableRaster(…)` has already replaced
+ * fill value by NaN. Therefore, it shall not appear anymore in the `SampleDimension`.
+ */
+ final Number fill = (sampleFormat != FLOAT) ? getFillValue(true) : null;
final DataType dataType = getDataType();
- final SampleDimension[] dimensions = new SampleDimension[samplesPerPixel];
- final SampleDimension.Builder builder = new SampleDimension.Builder();
+ final var dimensions = new SampleDimension[samplesPerPixel];
+ final var builder = new SampleDimension.Builder();
final boolean isIndexValid = !isReducedResolution();
for (int band = 0; band < dimensions.length; band++) {
short nameKey = 0;