Opened 16 years ago

Closed 6 years ago

#2083 closed defect (fixed)

gtiff driver not respecting separate nodata for each band

Reported by: maphew Owned by: warmerdam
Priority: normal Milestone:
Component: GDAL_Raster Version: unspecified
Severity: normal Keywords: gtiff
Cc: dron, Even Rouault, Mateusz Łoskot, Kyle Shannon

Description

The geotiff format driver assigns all bands the same nodata value, even if only a single band was specified with bandN.SetNoDataValue Also see http://www.nabble.com/python%3A-setting-nodata-affects-all-bands-td14303097.html

----- gdalsetnull.py -----
import gdal
import sys
import os.path

if len(sys.argv) < 2:
     print "Usage: gdalsetnull.py raster_file null_value"
     sys.exit(1)

input = sys.argv[1]
null_value = sys.argv[2]

dataset = gdal.Open( input, gdal.GA_Update )
if dataset is None:
    print 'Unable to open', input, 'for writing'
    sys.exit(1)

b1 = dataset.GetRasterBand(1)
b2 = dataset.GetRasterBand(2)
b3 = dataset.GetRasterBand(3)

print 'Initial nodata:\t', b1.GetNoDataValue(), b2.GetNoDataValue(), b3.GetNoDataValue()

b1.SetNoDataValue( float(null_value) )

print 'Output nodata:\t', b1.GetNoDataValue(), b2.GetNoDataValue(), b3.GetNoDataValue()
--------------------------- 

Results:

 python gdalsetnull.py nodata-test.tif 0
Initial nodata: 46.0 46.0 46.0
Output nodata:  0.0 0.0 0.0

Attachments (1)

nodata-test.tif (120.5 KB ) - added by maphew 16 years ago.

Download all attachments as: .zip

Change History (11)

by maphew, 16 years ago

Attachment: nodata-test.tif added

comment:1 by dron, 16 years ago

Cc: dron added

I think it is a good cause to change the way how NODATA handled in TIFFs. We should switch from ASCII representation of the NODATA value to binary one, because ASCII serialization of the floating point values is always error-prone (and actually not necessary).

The new tag definition could look like this:

{ TIFFTAG_GDAL_NODATA_NEW, -2,-2, TIFF_DOUBLE, FIELD_CUSTOM,
  TRUE, FALSE, "GDALNoDataValueNew" }

comment:2 by Even Rouault, 16 years ago

-2 means that there's a value for each band, right ? But how do you handle the case where a band has a nodata value, and another one none. Should we decide that a particular value of a double (a NaN for example) means that there's no nodata value for the band ?

comment:3 by Even Rouault, 16 years ago

Cc: Even Rouault added

comment:4 by warmerdam, 16 years ago

Keywords: gtiff added
Milestone: 1.6.0

I would prefer to not try and address this issue before the 1.5 release. It will require changes to the "GDAL nodata tag specification" and I'd rather not do that without due consideration of alternatives and whether the issue is critical enough to justify the disruption.

comment:5 by Mateusz Łoskot, 16 years ago

Cc: Mateusz Łoskot added

comment:6 by Even Rouault, 15 years ago

Milestone: 1.6.11.7.0

comment:7 by Kyle Shannon, 15 years ago

Cc: Kyle Shannon added

comment:8 by Jukka Rahkonen, 9 years ago

Heads-up: still a valid ticket in 2014 and GDAL 1.11

"GDAL stores band nodata value in the non standard TIFFTAG_GDAL_NODATA ASCII tag (code 42113) for files created with the default profile GDALGeoTIFF. Note that all bands must use the same nodata value. When BASELINE or GeoTIFF profile are used, the nodata value is stored into a PAM .aux.xml file."

comment:9 by Even Rouault, 9 years ago

Milestone: 1.8.1

Removing obsolete milestone

comment:10 by Even Rouault, 6 years ago

Resolution: fixed
Status: newclosed

In 40837:

GTiff: warn when SetNoDataValue() is called on different bands with different values (fixes #2083)

Note: See TracTickets for help on using tickets.