[gdal-dev] Issues with SetColorTable() and multi-sample TIFF

Even Rouault even.rouault at spatialys.com
Tue Feb 14 09:07:14 PST 2023


Hi,

The TIFF format only supports only single color table per TIFF image, 
and it only makes sense for a single-sample TIFF. An alternative would 
be for you to create multiple TIFF image file directories in the same 
file (mapped as GDAL subdatasets), with one band per subdataset, by 
using the APPEND_SUBDATASET=YES creation option.

Another option is to use the KEA format (specialization of HDF5) which 
supports all the possibilities of the GDAL abstract data model.

Even

Le 14/02/2023 à 17:25, afernandez a écrit :
> Hello,
> I'm using the GDAL Tools plugin within QGIS to plot some raster 
> layers. The snippet reads:
> /        driver_name = 'GTIFF'/
> /        driver = gdal.GetDriverByName(driver_name) /
> /        .../
> /        gdal_ds = driver.Create("my_arguments") /
> /gdal_ds.SetProjection("my_projection")/
> /gdal_ds.SetGeoTransform("my_geo_transform")/
> /        for band_idx in range(1, times + 1):/
> /            band = gdal_ds.GetRasterBand(band_idx) /
> /            band.SetNoDataValue(no_data)/
> /band.SetDescription(time_step)/
> /            data = var[band_idx - 1]/
> /            data = ma.getdata(data)/
> /band.WriteArray(data.astype(np_dtype, copy=False))/
> /       gdal_ds.FlushCache()/
> This works without any problem and plots the raster in greys. However, 
> I need the plot to be colored so I modified the code based on some 
> posts, which now reads:
> /        gdal_ds = driver.Create(out_path, cols, rows, times, 
> gdal.GDT_UInt16) /
> /gdal_ds.SetProjection("my_projection")/
> /gdal_ds.SetGeoTransform("my_geo_transform")/
> /        for band_idx in range(1, times + 1):/
> /            band = gdal_ds.GetRasterBand(band_idx) /
> /            band.SetNoDataValue(no_data)/
> /band.SetDescription(time_step)/
> /            data = var[band_idx - 1]/
> /            data = ma.getdata(data)/
> /            data_scaled = np.interp(data, (data.min(), data.max()), 
> (0, 255))/
> /            data_scaled2 = data_scaled.astype(int)/
> /            colors = gdal.ColorTable()/
> /            colors.CreateColorRamp(0, (229, 245, 249), 127, (153, 
> 216, 201))/
> /            colors.CreateColorRamp(127, (153, 216, 201), 254, (44, 
> 162, 95))/
> /band.SetRasterColorTable(colors)/
> /band.SetRasterColorInterpretation(gdal.GCI_PaletteIndex)/
> /            band.WriteArray(data_scaled2)/
> /       gdal_ds.FlushCache()/
> The problem is that this produces a RunTimeError: SetColorTable() not 
> supported for multi-sample TIFF. I simplified this for a single band 
> and QGIS did plot the colored raster. However, this is not a solution 
> because production runs will generate dozens (or even hundreds) of 
> time step bands. I'm pretty new to GDAL so I'm unsure if this is a 
> feature under current development or if there are other alternatives 
> so any suggestion on how to proceed would be appreciated.
> Thank you in advance.
>
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/gdal-dev

-- 
http://www.spatialys.com
My software is free, but my time generally not.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20230214/d1aaae3e/attachment.htm>


More information about the gdal-dev mailing list