diff --git a/src/ol/source/GeoTIFF.js b/src/ol/source/GeoTIFF.js index 4f7fb30611..b14b703750 100644 --- a/src/ol/source/GeoTIFF.js +++ b/src/ol/source/GeoTIFF.js @@ -476,8 +476,7 @@ class GeoTIFFSource extends DataTile { const image = images[imageIndex]; const nodataValue = image.getGDALNoData(); metadata[sourceIndex][imageIndex] = image.getGDALMetadata(0); - nodataValues[sourceIndex][imageIndex] = - nodataValue === null ? NaN : nodataValue; + nodataValues[sourceIndex][imageIndex] = nodataValue; const wantedSamples = this.sourceInfo_[sourceIndex].bands; samplesPerPixel[sourceIndex] = wantedSamples @@ -607,7 +606,7 @@ class GeoTIFFSource extends DataTile { const bands = this.sourceInfo_[sourceIndex].bands; if (bands) { for (let i = 0; i < bands.length; ++i) { - if (!isNaN(values[bands[i] - 1])) { + if (values[bands[i] - 1] !== null) { this.addAlpha_ = true; break outer; } @@ -617,7 +616,7 @@ class GeoTIFFSource extends DataTile { // option 3: check image metadata for all bands for (let imageIndex = 0; imageIndex < values.length; ++imageIndex) { - if (!isNaN(values[imageIndex])) { + if (values[imageIndex] !== null) { this.addAlpha_ = true; break outer; } @@ -681,7 +680,7 @@ class GeoTIFFSource extends DataTile { /** @type {number|Array} */ let fillValue; - if (!isNaN(source.nodata)) { + if ('nodata' in source && source.nodata !== null) { fillValue = source.nodata; } else { if (!samples) { @@ -778,7 +777,11 @@ class GeoTIFFSource extends DataTile { nodata = nodataValues[sourceIndex][bandIndex]; } - if (sourceValue !== nodata) { + const nodataIsNaN = isNaN(nodata); + if ( + (!nodataIsNaN && sourceValue !== nodata) || + (nodataIsNaN && !isNaN(sourceValue)) + ) { transparent = false; data[dataIndex] = value; } diff --git a/test/rendering/cases/cog-f32-nodata-explicit-nan/expected.png b/test/rendering/cases/cog-f32-nodata-explicit-nan/expected.png new file mode 100644 index 0000000000..5da98cb39e Binary files /dev/null and b/test/rendering/cases/cog-f32-nodata-explicit-nan/expected.png differ diff --git a/test/rendering/cases/cog-f32-nodata-explicit-nan/main.js b/test/rendering/cases/cog-f32-nodata-explicit-nan/main.js new file mode 100644 index 0000000000..d5836a5226 --- /dev/null +++ b/test/rendering/cases/cog-f32-nodata-explicit-nan/main.js @@ -0,0 +1,21 @@ +import GeoTIFF from '../../../../src/ol/source/GeoTIFF.js'; +import Map from '../../../../src/ol/Map.js'; +import TileLayer from '../../../../src/ol/layer/WebGLTile.js'; + +const source = new GeoTIFF({ + sources: [{url: '/data/raster/elevation-f32.tif', nodata: NaN}], +}); + +new Map({ + layers: [ + new TileLayer({ + source: source, + }), + ], + target: 'map', + view: source.getView(), +}); + +render({ + message: 'normalize i16 data with nan nodata based on GDAL stats', +}); diff --git a/test/rendering/cases/cog-f32-nodata/expected.png b/test/rendering/cases/cog-f32-nodata/expected.png new file mode 100644 index 0000000000..064d844abd Binary files /dev/null and b/test/rendering/cases/cog-f32-nodata/expected.png differ diff --git a/test/rendering/cases/cog-f32-nodata/main.js b/test/rendering/cases/cog-f32-nodata/main.js new file mode 100644 index 0000000000..6b01ea419e --- /dev/null +++ b/test/rendering/cases/cog-f32-nodata/main.js @@ -0,0 +1,21 @@ +import GeoTIFF from '../../../../src/ol/source/GeoTIFF.js'; +import Map from '../../../../src/ol/Map.js'; +import TileLayer from '../../../../src/ol/layer/WebGLTile.js'; + +const source = new GeoTIFF({ + sources: [{url: '/data/raster/elevation-f32.tif'}], +}); + +new Map({ + layers: [ + new TileLayer({ + source: source, + }), + ], + target: 'map', + view: source.getView(), +}); + +render({ + message: 'normalize i16 data with nan nodata based on GDAL stats', +}); diff --git a/test/rendering/cases/cog-i16-nodata/expected.png b/test/rendering/cases/cog-i16-nodata/expected.png new file mode 100644 index 0000000000..064d844abd Binary files /dev/null and b/test/rendering/cases/cog-i16-nodata/expected.png differ diff --git a/test/rendering/cases/cog-i16-nodata/main.js b/test/rendering/cases/cog-i16-nodata/main.js new file mode 100644 index 0000000000..433a851f77 --- /dev/null +++ b/test/rendering/cases/cog-i16-nodata/main.js @@ -0,0 +1,21 @@ +import GeoTIFF from '../../../../src/ol/source/GeoTIFF.js'; +import Map from '../../../../src/ol/Map.js'; +import TileLayer from '../../../../src/ol/layer/WebGLTile.js'; + +const source = new GeoTIFF({ + sources: [{url: '/data/raster/elevation-i16.tif'}], +}); + +new Map({ + layers: [ + new TileLayer({ + source: source, + }), + ], + target: 'map', + view: source.getView(), +}); + +render({ + message: 'normalize i16 data with -9999 nodata based on GDAL stats', +}); diff --git a/test/rendering/data/raster/elevation-f32.tif b/test/rendering/data/raster/elevation-f32.tif new file mode 100644 index 0000000000..0099adc9e5 Binary files /dev/null and b/test/rendering/data/raster/elevation-f32.tif differ diff --git a/test/rendering/data/raster/elevation-i16.tif b/test/rendering/data/raster/elevation-i16.tif new file mode 100644 index 0000000000..b2ed2944ab Binary files /dev/null and b/test/rendering/data/raster/elevation-i16.tif differ