[gdal-dev] Writing descriptions to GeoTiff bands

Even Rouault even.rouault at spatialys.com
Fri Sep 16 14:11:07 PDT 2016


Le vendredi 16 septembre 2016 22:57:13, Andrew Bell a écrit :
> Hi,
> 
> My code for creating a Tiff raster looks something like this:
> 
> int nBands = 5;
> dataset->Create(filename, width, height, nBands, ...);
> 
> for (int i = 1; i <= nBands; ++i)
> {
>     GDALRasterBand *band = dataset->GetRasterBand(i);
>     band->SetDescription(someString);
>     band->WriteBlock(someData);
> }
> 
> It appears that only the description to band 1 is written (it's the only
> one reported by gdalinfo).  A little debugging leads me to believe that
> what's happening is that WriteBlock() invokes Crystalize() ->
> WriteMetadata(), which takes care of setting the band description.  But
> once Crystalize() is called, it sets a flag so as to be a NOOP in future
> calls.  I'm not using streaming.
> 
> I'm trying to understand if this behavior is by design, a limitation that I
> can't find in the documentation or a bug.

It's a limitation due to how libtiff works mostly and/or how we use it (but 
mostly how libtiff works, and a bit how the TIFF format itself makes it hard). 
Basically for GTiff, you need to do all operations that affect metadata, in a 
broad meaning, ie georeferencing, description, offsets, color table, TIFF & 
GDAL metadata, etc... before writing any imagery.  If we allowed to change 
metadata after crzystalization, this would require rewriting the whole set of 
TIFF tags at the end of file each time their serialized form increase.

So rewrite your loop into 2: one to set all descriptions, and another one to 
write blocks.

Other formats may have similar limitations, so it is generally safe to proceed 
this way in general.

Even

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com


More information about the gdal-dev mailing list