[gdal-dev] Upcoming Cloud Optimized Geotiff (COG) related enhancements

Vincent Sarago vincent.sarago at gmail.com
Fri May 3 05:40:37 PDT 2019


Hi Even,
This looks great and I’m really looking for point 4 and 5.

> Le 3 mai 2019 à 04:04, Even Rouault <even.rouault at spatialys.com> a écrit :
> 
> Hi,
> 
> I wanted to mention COG related enhancements (*) that I will work on in GDAL 
> in the coming weeks, so interested parties are aware of them and can 
> potentially react.
> 
> 1) Creation of a dedicated COG creation-only driver simplifying the creation 
> workflow. Currently, creating a COG involves a number of steps, using gdaladdo 
> and gdal_translate with the right arguments. For very large COG files, 
> invoking gdaladdo in an efficient way can be tricky (.ovr.ovr trick: https://
> github.com/OSGeo/gdal/issues/1442). The driver will take care of creating 
> needed temporary overviews.
> 
> 2) The driver will offer integrated reprojection capabilities, and in 
> particular a WebMercator/GoogleMapsCompatible tiling scheme profile (as 
> defined in WMTS), so that TIFF tiles exactly match GoogleMapsCompatible ones. 
> This will be similar to the corresponding option of GeoPackage. With a 
> subtelty that due to how GeoTIFF overviews work, it is not possible to have 
> this alignment on the tiling scheme for all zoom levels. So the user will 
> define how many zoom levels starting from the full resolution image must be 
> aligned (if N is the number of aligned levels, up to 2^N padding tiles in 
> horizontal and vertical dimensions are needed for the full resolution image, 
> so N should be kept reasonably small)
> 
> 3) gdalwarp will be enhanced to allow output to drivers that have only 
> CreateCopy() capabilities such as the COG driver. It will try to avoid 
> materializing the intermediate file when possible by using VRT capabilities, 
> otherwise it will have to create a temporary TIFF file before creating 
> CreateCopy()

About point 1, 2, 3 I have mixed feeling because to me it seems that we will introduce a new driver to replace the combination of gdal commands (disclaimer as one of the creator of rio-cogeo I may not be fully objective here). 


> 4) Optimizations specific to JPEG-compressed imagery (YCbCr color space) with 
> a 1-bit transparency channel, to minimize the number of HTTP range requests 
> needed to read them.
> As JPEG compression cannot include the transparency information, two TIFF IFD 
> have to be created: one for YCbCr, and another one for alpha. Currently the 
> COPY_SRC_OVERVIEWS=YES creation option of the GeoTIFF driver separates data 
> for all the tiles of the color channels from data for all the tiles of the 
> transparency channel. In practice, readers will generally want to access, for 
> a same location, to data of both color and transparency channels. I will 
> modify the writer to interleave blocks so that color and transparency 
> information are contiguous. If COLOR_X_Y designates the tile with color 
> information at coordinates X,Y (in tile coordinate space), the layout of data 
> in the file will be: COLOR_0_0, TRANSPARENCY_0_0, COLOR_1_0, TRANSPARENCY_1_0, 
> etc. The GeoTIFF driver will be improved to fetch together the color and 
> transparency channel when such a layout is detected.

Why this is specific to JPEG compression, what about other compressed format with internal mask ? 

> A further improvement is to be able to avoid completely to read the 
> TileByteCount array of the color channel, and the TileByteCount & TileOffset 
> arrays of the transparency channel. The trick is to reserve 4 bytes before the 
> start of each COLOR_X_Y tile to indicate its size (those bytes will be 
> 'ghost', that is not in the range of data pointed by TileByCount&TileOffset). 
> An optimized reader wanting to read tile i=Y*nb_tiles_in_width+X will start by 
> reading the offsets of tile i and i+1: TileOffset_color[i] and 
> TileOffset_color[i+1]. It will then seek to TileOffset_color[i] – 4 and read 4 
> + TileOffset_color[i+1] – TileOffset_color[i] bytes in a buffer. The first 4 
> bytes of this buffer will indicate the number of bytes of the color tile, and 
> thus it is possible to deduce the offset and size of the mask tile that is 
> located at the end of the buffer. A TIFF metadata item will be written to 
> indicate that such layout has been used (with an indication of the file size 
> so as to be able to detect if the file has been later be altered in a non-
> optimized way), so that optimized readers can adopt the above described 
> behavior. This will require to extend the libtiff interface so that the user 
> can directly provide the input buffer to decompress.
> As the file will remain fully TIFF/BIGTIFF compliant, non-optimized readers 
> (such as newer GDAL builds against an older external libtiff version, or 
> previous GDAL versions) will still be able read it, loading values from the 4 
> arrays instead of just one. 
> Note: for other compressions types, a simpler version of the above 
> optimization can still be done, by using TileOffset[i] and TileOffset[i+1], 
> and saving the read of TileByteCount[i]
> To sum up, with the improvements of this task, once the initial loading of 
> metadata has been done, a GDAL ReadBlock(x,y) request will cause only two 
> networks range requests: one to read TileOffset[i] and TileOffset[i+1] 
> (potentially already cached if neighboring tiles have been previously accessed 
> in the same process), and another one to read the imagery (+mask) data. 
> Whereas currently, 6 might be needed for JPEG YcbCr+mask.
> 
> 5) Optimizing the layout of the header of a COG file
> 
> The current layout of the header part of COG file is:
> - TIFF / BigTIFF signature, followed by the offset of the first IFD (Image 
> File Directory)
> - IFD of full resolution image, that is the list of the tags and their value 
> when it consists of a single numeric value, followed by the offset of the next 
> - IFD. Its size is 2 + number_of_tags * 12 + 4 (or 2 + number_of_tags * 20 + 
> 8) bytes, so typically 200 bytes maximum
> - Values of TIFF tags that don't fit inline in the IFD directory, such as 
> TileOffsets and TileByteCounts arrays and GeoTIFF keys 
> - IFD of first overview (typically subsampled by a factor of 2)
> - Values of its tags that don't fit inline 
> - ...
> -IFD of last overview
> - Values of its tags that don't fit inline 
> 
> When the COG file is not too large, the fact of having the TileOffsets and 
> TileByteCounts between IFD descriptors is not an issue since they are not too 
> large, and most TIFF readers will load their values when opening the IFD. But 
> for an optimized reader such as GDAL with internal libtiff support (or with 
> external libtiff after the optimization of task 4), loading the values of the 
> TileOffsets/TileByteCounts arrays is only needed when accessing imagery.
> 
> A more efficient layout for network access is :
> - TIFF / BigTIFF signature, followed by the offset of the first IFD
> - IFD of full resolution image, followed by the value of its non-inline tags, 
> except  TileOffsets/TileByteCounts
> - IFD of first overview followed by the value of its non-inline tags, except  
> - TileOffsets/TileByteCounts
> - IFD of last overview followed by the value of its non-inline tags, except  
> TileOffsets/TileByteCounts
> - Values of the TileOffsets/TileByteCounts arrays of IFD of full resolution 
> image
> - Values of the TileOffsets/TileByteCounts arrays of IFD of first overview
> - ...
> - Values of the TileOffsets/TileByteCounts arrays of IFD of last overview
> 
> With such a structure, the initial reading of 16 KB at the start of the file 
> will be able to load the IFD descriptors of all overviews (and masks, which 
> are actually interleaved in between when present). So, combined together with 
> task 4, a cold read of a tile at any zoom level (ie opening the file + tile 
> request) could result in just 3 network range requests: one to get the IFD 
> descriptors at the start of the file, one to read the location of the tile 
> from the TileOffsets array and one to read the tile data.
> The proposed structure itself is still fully TIFF compliant. The script that 
> validates the COG structure will be adapted to accept that new variant of the 
> header structure.
> 
> Even
> 
> (*) Funding by Land Information New Zealand / https://www.linz.govt.nz/
> 
> -- 
> Spatialys - Geospatial professional services
> http://www.spatialys.com
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/gdal-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20190503/6b9fadde/attachment-0001.html>


More information about the gdal-dev mailing list