1. 驱动概述
原文名称是COG -- Cloud Optimized GeoTIFF generator
,属于栅格驱动的其中一个章节,原文地址点这里,译文如下:
驱动简略名称
COG
√默认内置驱动
该驱动是默认内置的。
该驱动支持创建 Cloud Optimized GeoTIFF(简称 COG)。
该驱动本质上依赖于带有COPY_SRC_OVERVIEWS=True
创建选项GTiff(GeoTIFF File Format)驱动,但如果尚未完成,则会自动执行所需的预处理阶段(如果要求重投影,以及在图像和/或掩膜上创建快视图),并且在使用某些压缩类型时还负责将输入数据集变形成期望的形式(例如:在选择 JPEG 压缩时,RGBA 数据集将透明地转为RGB+掩码数据集)。
2. 驱动的能力
!支持 CreateCopy()
该驱动支持GDALDriver::CreateCopy()
操作。
!支持地理参考
该驱动支持地理参考。
支持虚拟IO
该驱动支持虚拟IO操作(例如:/vsimem/
等)。
3. 创建选项
3.1 常规的创建选项
BLOCKSIZE=<integer>
:默认值为512。设置瓦片的宽度和高度(单位为像素),值必须可以被16整除。COMPRESS=[NONE/LZW/JPEG/DEFLATE/ZSTD/WEBP/LERC/LERC_DEFLATE/LERC_ZSTD/LZMA]
:默认值为 LZW。设置压缩方法,从 GDAL 3.4 开始默认值为 LZW,3.4版本之前默认值为 NONE。JPEG
:通常仅适用于字节数据(Byte Data,每个通道8位)。但是,如果 GDAL 是使用内部的 libtiff 和 libjpeg 构建的,则可以使用12为 JPEG 压缩的 TIFF 文件(视为NBITS=12)。有关更对信息,可以查看 "TIFF 中的8和12位 JPEG"Wiki 页面。对于 COG 驱动,3波段或者4波段图像的 JPEG 压缩会自动选择PHOTOMETRIC=YCBCR
颜色空间,并对Y、Cb、Cr 分量进行4:2:2的二次采样。LZW
、DEFLATE
和ZSTD
压缩可以和PREDICTOR
创建选项一起使用。ZSTD
:当使用内部libtiff时,如果GDAL基于libzstd >=1.0构建,或者如果基于支持zstd的外部libtiff构建,则可以使用ZSTD。LERC
:当使用内部 libtiff 时可用LERC_ZSTD
:当LERC
和ZSTD
可用时可用JXL
:用于 JPE-XL,并且仅在使用内部 libtiff 和使用 libjxl 构建 GDAL 时可用。JXL 压缩只能在4个或者更少波段的数据集上使用。GDAL 3.4 中添加的选项。
LEVEL=<integer>
:DEFLATE/ZSTD/LERC_DEFLATE/LERC_ZSTD/LZMA 压缩级别。值越小压缩速度就越快但压缩效率也越低。1是最快的。- 对于 DEFLATE/LZMA,9表示速度最慢但压缩率最高(使用支持 libdeflate 的 libtiff 时为12),默认值为6。
- 对于 ZSTD,22表示速度最慢但压缩率最高,默认值为9。
MAX_Z_ERROR=<threshold>
:默认值为0。设置 LERC/LERC_DEFLATE/LERC_ZSTD 压缩值的最大错误阈值。默认值为 0,表示无损压缩。MAX_Z_ERROR_OVERVIEW=<threshold>
:(GDAL >= 3.8)在概视图中设置 LERC/LERC_DEFLATE/LERC_ZSTD 压缩值的最大错误阈值。默认值为MZX_Z_ERROR
。QUALITY=<integer>
:默认值为75。JPEG/WEBP 质量设置。值为100时表示最佳质量(最小压缩),值为1时表示最差质量(最佳压缩)。对于 WEBP,值为100时会自动打开无损模式。JXL_LOSSLESS=[YES/NO]
:默认值为 YES。设置 JPEG-XL 压缩为无损(YES)还是有损(NO)。对于有损压缩,底层数据应该是灰色、灰色 + ALPHA、RGB 或 RGB + ALPHA。JXL_EFFORT=1-9
:默认值为5。JPEG-XL 压缩率。值越高,文件压缩越小,压缩时间越慢。JXL_DISTANCE=0.1-15
:默认值为1.0。有损 JPEG-XL 压缩的距离级别。它是以一个明显差异的倍数指定的(距离的定义参考cf butteraugli
)。也就是说,0在数据上表示无损的,1应该是视觉上无损的,更高的距离会产生越来越密集、保真度越来越低的文件。建议范围为[0.5, 3]
。JXL_ALPHA_DISTANCE=[-1/0/0.1-15]
:默认值为-1。(libjxl > 0.8.1)有损 JPEG-XL 压缩的 alpha 通道的距离级别。它是以一个明显差异的部署指定的(距离的定义参考cf butteraugli
)。也就是说,0在数学上是无损的,1应该是视觉上无损的,距离越大,文件越密集,保真度越低。对于有损压缩,建议范围为[0.5,3]。默认值为特殊值-1.0,这意味着使用与非 ALPHA 通道相同的距离值(即 JXL_DISTANCE)。NUM_THREADS=[<number_of_threads>/ALL_CPUS]
:通过指定工作线程数来启用多线程压缩。默认在主线程中进行压缩。这还确定了使用TILING_SCHEME
或者TARGET_SRS
创建选项进行重投影时使用的线程数。从 GDAL 3.2 版本以后,生成概述图也是多线程的。NBITS=<integer>
:(GDAL >= 3.7)通过传递1到7之间的值,创建每个样本少于8位的文件。外观像素类型为 Byte。也接受n=9...15
(Unit 16类型)和n=17...31
(Unit 32类型)的值。根据 GDAL 2.2,Float 32类型可接受n=16
,用来生成半精度浮点值。PREDICATOR=[YES/NO/STANDARD/FLOATING_POINT]
:默认值为NO
。设置 LZW、DEFLATE 和 ZSTD 压缩的预测器。如果值为 YES,则标准预测器(Predicator = 2)用于整数数据类型,浮点预测器(Predicator = 3)用于浮点数据类型(在某些情况下,标准预测器在浮点数据上的性能可能比浮点预测器好)。STANDARD
或FLOATING_POINT
也可用于选择所需的精确算法。BIGTIFF=[YES/NO/IF_NEEDED/IF_SAFER]
:控制创建的文件是 BigTIFF 还是经典的 TIFF。YES
表示强制为 BigTIFF。NO
表示强制为经典的 TIFF。IF_NEEDED
表示只会在明显需要的情况下创建 BigTIFF(在未压缩的情况下,图像大于 4GB。因此,使用压缩时没有效果)。IF_SAFER
表示如果生成的文件_可能_超过4GB,将创建 BigTIFF。注意,这只是一种启发式方法,可能并不是总是有效,具体取决于压缩比。
BigTIFF 是 TIFF 的变体,它可以包含超过 4GB 的数据(经典的 TIFF 的大小受该值的限制)。如果 GDAL 是使用 libtif 4.0 或者更高版本创建的,则此选项可用。默认值为IF_NEEDED
。
当创建无压缩的 GeoTIFF 时,GDAL 会提前计算生成文件的大小。如果计算出的文件大小超过 4GB,GDAL 将自动决定创建一个 BitTIFF 文件。但是,当使用压缩时,不可能提前知道文件的最终大小,因此将选择经典 TIFF。在这种情况下,如果预计最终文件对于经典 TIFF 格式来说太大,则用户必须明确要求创建BigTIFF=YES
的 BigTIFF 。如果没有明确询问或猜测 BigTIFF 的创建,并且生成的文件对于经典 TIFF 来说太大,则 libtiff 将失败,并显示错误消息,如"TIFFAppendToStrip:超过了TIFF文件的最大大小"。
RESAMPLING=[NEAREST/AVERAGE/BILINEAR/CUBIC/CUBICSPLINE/LANCZOS/MODE/RMS]
:用于生成概览或重新投影的重新采样方法。对于切片的图像,默认情况下使用 NEAREST,否则为 CUBIC。OVERVIEW_RESAMPLING=[NEAREST/AVERAGE/BILINEAR/CUBIC/CUBICSPLINE/LANCZOS/MODE/RMS]
:(GDAL >= 3.2)用于生成概览的重新采样方法。对于切片的图像,默认情况下使用 NEAREST,否则为 CUBIC。如果指定了 RESAMPLING 的值,则在生成概览时,将覆盖该值。WARP_RESAMPLING=[NEAREST/AVERAGE/BILINEAR/CUBIC/CUBICSPLINE/LANCZOS/MODE/RMS/MIN/MAX/MED/Q1/Q3]
:(GDAL >= 3.2)用于重投影的重采样方法。对于切片的图像,默认情况下使用 NEAREST,否则为 CUBIC。如果指定了 RESAMPLING 的值,则在重投影时,将覆盖该值。OVERVIEWS=[AUTO/IGNORE_EXISTING/FORCE_USE_EXISTING/NONE]
:默认值为 AUTO。描述概览生成和使用源概览的行为。AUTO
:如果存在源概览,则会使用源概览。如果不存在,将在输出文件中自动创建概览。IGNORE_EXISTING
:将忽略源数据集上的可能存在的概览,并自动生成新的概览。FORCE_USE_EXISTING
:将使用源数据集上的现有概览。如果没有概览,相当于指定了NONE
。NONE
:将忽略可能存在的概览,并且不会生成任何概览。
OVERVIEW_COUNT=<integer>
:(GDAL >= 3.6)要生成的概览级别的数量。这可能会增加或减小 COG 文件中的级别数量(当 GDAL 计算完成分辨率数据集的概览时,即没有源概览或用户指定OVERVIEWS=IGNORE_EXISTING
时),或介绍从源数据集复制概览级别的数量(当源数据集有概览并且OVERVIEWS=AUTO
或者OVERVIEWS=FORCE_USE_EXISTING
时)。如果未指定,则该驱动将在OVERVIEWS=AUTO
或者OVERVIEWS=FORCE_USE_EXISTING
时使用源栅格中所有的概览。在 GDAL 生成概览时,概览级别的默认数量是最小概览的维度小于或等于BLOCKSIZE
值。OVERVIEW_COMPRESS=[AUTO/NONE/LZW/JPEG/DEFLATE/ZSTD/WEBP/LERC/LERC_DEFLATE/LERC-ZSTD/LZMA]
:默认值为 AUTO。设置在 COG 中存储概览时要使用的压缩方法(请参考COMPRESS
的描述)。默认情况下,AUTO 将使用与 COG 相同的压缩方法创建概览。OVERVIEW_QUALITY=<integer>
:设置JPEG/WebP
的质量。值为100表示最佳质量(最低压缩),而1表示最差质量(最佳压缩)。默认情况下,概览将以与 COG 相同的质量创建,除非压缩类型不同,否则默认值为75。OVERVIEW_PREDICATOR=[YES/NO/STANDARD/FLOATING_POINT]
:设置 LZW、DEFLATE 和 ZSTD 概览压缩的预测因子。默认情况下,概览将以与 COG 相同的预测变量创建,除非概览的压缩类型不同,否则默认值为否。GEOTIFF_VERSION=[AUTO/1.0/1.1]
:默认为 AUTO。选择用于编码地理参考的 GeoTIFF 版本。1.0
对应于Ritter 和 Ruth 在1995年创建的 GeoTIFF 修订版 1.0。1.1
对应与 OGC 标准19-008,它是1.0的演变,主要在 CRS 的垂直部分的处理中清除歧义并修复不一致。AUTO 默认通常会选择 1.0,除非要编码的 CRS 具有垂直分量或是 3D CRS,在这种情况下会使用1.1版本。需要注意的是,libgeotiff 1.6.0 及以后版本才能支持1.1版本的 GeoTIFF 标准。SPARSE_OK=[TRUE/FALSE]
:(GDAL>=3.2)默认值为 FALSE。用于设置磁盘上是否应该省略空块。设置该选项后,像素值为0或者nodata
都不会被写入磁盘看(除非文件中已分配响应的块)。稀疏文件对于从未写入的块具有0个瓦片/条带偏移,并节省空间;然而,大多数非 GDAL 包无法读取此类文件。在读取方面,在非空瓦片之后出现省略的瓦片可能会导致优化的读取器不得不向TileByteCounts
数组发出额外的 GET 请求。STATISTICS=[AUTO/YES/NO]
:(GDAL >= 3.7)默认值为 AUTO。波段统计信息是否应该包含在输出文件中。在 AUTO 模式下,只有在源数据集中可用时,他们才会被包括在内。如果设置为 YES,它们将始终包含在内。如果设置为 FALSE,则他们讲永远不会包含在内。
3.2 与重投影相关的创建选项
TILING_SCHEME=[CUSTOM/GoogleMapsCompatible/...]
:默认为 CUTSTOM。如果设置为不同于 CUSTOM 的值,则指定切片方案的定义将用于将数据集重新投影到其 CRS,选择与最接近的缩放级别相对应的分辨率,并在此分辨率下在切片边界上对其(实际分辨率可通过ZOOM_LEVEL
或ZOOM_LLEVEL_STRATEGY
选项控制)。
除非用户已经使用BLOCKSIZE
选项指定了一个值,否则将使用切片方案中定义的切片大小(通常为256像素),在这种情况下,将考虑用户指定的值(即:如果设置的值高于256,则修改原始切片方案以考虑 HiDPi 切片的大小)。
在非自定义模式下,TARGET_SRS
、RES
和EXTENT
选项将被忽略。从 GDAL 3.2 开始,TILING_SCHEME
的值也可以是根据 OGC 二维切片矩阵集标准的 JSON 文件的文件名、指向该文件的 URL 地址、GDAL 数据目录中定义文件的根(例如:名为tms_FOO.json
的文件的名称 FOO)或内联 JSON 定义。可用的切片方案列表可以通过查看gdalinfo --format COG
提示的TILING_SCHEME
选项的值来缺东。
ZOOM_LEVEL=<integer>
:(GDAL >= 3.5)缩放级别的编号(从0开始表示最粗略的缩放级别)。仅用于不同于CUSTOM
的TILING_SCHEME
。如果指定了此选项,则忽略ZOOM_LEVEL_STRATIONY
。ZOOM_LEVEL_STRATION=[AUTO/LOWER/UPPER]
:(GDAL>=3.2)默认为 AUTO。确定缩放级别的策略。仅用于不同于CUSTOM
的TILING_SCHEME
。LOWER 将选择理论计算的非积分缩放级别正下方的缩放级别,从而进行二次采样。相反,UPPER 将选择缩放级别的正上方,从而导致过采样。默认为AUTO,选择最接近的缩放级别。TARGET_SRS=value
:强制将输入数据集重投影到另一个 SRS。值是一个字符串,可以是 WKT 字符串、EPSG:XXXX
代码或者 PROJ 字符串。RES=value
:设置目标栅格的分辨率,单位为TARGET_SRS
中定义的单位。仅当指定了TARGET_SRS
时才会考虑使用该选项。EXTENT=<minx, miny, maxx, maxy>
:设置目标栅格的范围,单位为TARGET_SRS
中定义的单位。仅当指定了TARGET_SRS
时才会考虑使用该选项。ALIGNED_LEVELS=<integer>
:GeoTIFF 的切片和切片方案中定义的切片匹配分辨率级别数。指定此选项时,将在需要时将填充切片添加到目标栅格的左侧和顶部,以便 GeoTIFF 切片与切片方案的切片相匹配。仅当TILING_SCHEME
与CUSTOM
不同时才考虑。此选项的效果仅在将其设置为2或更大时可见,因为默认情况下,全分辨率级别与切片方案对齐。对于连续缩放级别分辨率相差2倍的切片方案,必须小心将该值设置为大量级别,因为每个维度最多可以添加2^(ALIGNED_levels-1)个切片。该驱动强制执行10的硬性限制。ADD_ALPHA=[YES/NO]
:默认为 YES。在重投影的情况下是否添加 ALPHA 条带。
4. 更新模式
更新模式下打开一个 COG 文件通常会中断部分优化,但仍然会生成有效的 GeoTIFF 文件。从 GDAL 3.8 开始,为了避免 COG 特性的以外丢失,除非打开IGNORE_COG_LAYOUT_BREAK
选项并且明确设置为 YES,否则将拒绝在更新模式下打开此类文件。
请注意,在只读模式下打开 COG 文件时,可以执行一个子集操作,如元数据编辑(包括统计信息存储),该操作将存储在.aux.xml
的文件中。
5. 文件格式的详细信息
5.1 High Level
COG 文件具有以下特征:
- TIFF 或者 BigTIFF 文件
- 图像、掩膜或者概览的瓦片(通常为512大小)
- 概览,直到最小概览级别的最大纬度低于512像素
- 是否压缩
- 多波段数据的像素交错
- 优化 TIFF 部分的布局,以最大限度地减少进行随机读取访问的读取器所需的 GET 请求数量
5.2 Low Level
一个 COG 文件的组织结构如下(如果使用 libtiff >= 4.0.11 或者 GDAL 内部的 libtiff。对于其他版本,结构将有所不同,并且某些优化将不可用):
- TIFF/BigTIFF 标头/签名和指向第一个 IFD 的指针
- 具有 COG 优化的"重影区域"
- 全分辨图像的 IFD,后跟 TIFF 标记值,不包括 TiffOffsets 和 TileByteCounts 数组
- 全分辨率图像掩码的 IFD(如果存在),后跟 TIFF 标记值,不包括 TiffOffsets 和 TileByteCounts 数组
- 第一个(尺寸最大)概览级别的 IFD(如果存在)
- 最后一个(最小)概览级别的 IFD(如果存在)
- 掩码的第一个(尺寸最大)概览级别的IFD(如果存在)
- 掩码的最后一个(尺寸最大)概览级别的IFD(如果存在)
- 上述 IFD 的 TileOffsets 和 TileByteCounts 数组
- 最小概览的瓦片数据,如果存在(每个瓦片后面跟着掩码数据的相应瓦片,如果存在),具有前导字节和尾部字节
- 最大概览的瓦片数据,如果存在(与掩码数据交织,如果存在)
- 全分辨率图像的瓦片数据,如果存在(与掩码数据交织,如果存在)
5.3 Header ghost area
为了描述几何空间文件的特定布局,所用功能的描述位于文件的开头,以便优化的读取器(如GDAL)可以使用它们并采取快捷方式。这些功能被描述为 ASCII 字符串,"隐藏"在 ClassicTIFF 的前8个字节之后(或 BigTIFF 的前16个字节之后)。第一个 IFD 在这些字符串之后开始。在 TIFF 文件中有这样的重影区域是完全有效的,读者通常会跳过它们。因此,对于具有透明度遮罩的几何空间文件,这些字符串将为:
ini
GDAL_STRUCTURAL_METADATA_SIZE=000174 bytes
LAYOUT=IFDS_BEFORE_DATA
BLOCK_ORDER=ROW_MAJOR
BLOCK_LEADER=SIZE_AS_UINT4
BLOCK_TRAILER=LAST_4_BYTES_REPEATED
KNOWN_INCOMPATIBLE_EDITION=NO
MASK_INTERLEAVED_WITH_IMAGERY=YES
!笔记
- 换行符用于分隔这些字符串
- 在
KNOWN_INCOMPATIBLE_EDITION=NO
后面的换行符后面插入一个空格字符 - 对于没有掩膜的 COG,
MASK_INTERLEAVED_WITH_IMAGERY
不会出现
重影区域以GDAL_STRUCTURAL_METADATA_SIZE=XXXXXX字节\n
(固定大小为43字节)开始,其中,XXXXXX为一个6位数,表示本节剩余的大小(从该起始行的换行符之后开始)。
LAYOUT=IFDS_BEFORE_DATA
:IFD 位于数据前面。GDAL 还将确保瓦片索引数组是在 IFD 之后和图像之前写入的,因此 16KB 的第一个范围请求将始终获得所有的 IFD。BLOCK_ORDER=ROW_MAJOR
:瓦片的数据是按递增的瓦片 ID 顺序写入的。未来的增强可能会实现其他布局。BLOCK_LEADER=SIZE_AS_UINT4
:每个瓦片数据前面都有4个字节,也在重影区域中,指示实际瓦片大小(以小端序)。BLOCK_TRAILER=LAST_4_BYTES_REPEATED
:刚好在瓦片数据之后,瓦片数据的最后4个字节被重复。KNOWN_INCOMPATIBLE_EDITION=NO
:当生成一个 COG 文件是,始终写入这些内容。如果 GDAL 用于修改几何空间文件,因为对现有几何空间文件所做的大多数更改都会破坏优化的结构,GDAL 会将此元数据项更改为KNOWN_INCOMPATIBLE_EDITION=YES
,并在写入时和重新打开该文件时发出警告,以便用户知道他们破坏了几何空间文件。MASK_INTERLEAVED_WITH_IMAGERY=YES
:表示掩码数据紧跟在图像数据之后。因此,当在offset=TileOffset[i]-4
和size=TileOffset[i+1]-TileOffset[i]+4
处读取数据时,您将获得一个缓冲区,其中:- leader with imagery tile size (4 bytes)
- imagery data (starting at TileOffsets[i] and of size TileByteCounts[i])
- trailer of imagery (4 bytes)
- leader with mask tilesize (4 bytes)
- mask data (starting at mask.TileOffsets[i] and of size mask.TileByteCounts[i], but none of them actually need to be read)
- trailer of mask data (4 bytes)
5.4 瓦片数据的前导和尾部
每个瓦片数据的前面都一个前导,该前导由一个无符号的4字节整数组成,按小端序排列,给出其后面瓦片数据的有效负载字节数。这个前导重影,因为TileOffset[]
数组不指向它,而是指向实际有效负载。因此,前导的偏移量是TiffOffsets[i]-4
。
因此,看到BLOCK_LEADER=SIZE_AS_UINT4
元数据项的优化读取器将查找TileOffset[i]
和TileOffset[i+1]
,以推断它必须从offset=TileOffset[i]-4
和SIZE=TileOffset[i+1] - TileOffset[i] + 4
处开始获取数据。然后,它检查前4个字节,看看这个前导标记中的大小是否与TileOffset[i+1] - TileOffset[i]
一致。当没有掩码时,它们通常是相等的(取BLOCK_LEADER和BLOCK_TRAILER
的大小的模)。在存在掩码且MASK_INTERLEAVED_WITH_IMAGERY=YES
的情况下,则引导中指示的瓦片大小将为<TileOffset[i+1]-TileOffset[i]
,因为掩膜的数据将跟随图像数据(请参见MASK_INTERLEAVED_WITH-IMAGERY=YES
)。
每个瓦片数据后面紧跟着一个尾部,该尾部由瓦片数据的有效载荷的最后4个字节的重复组成。TileByteCounts[]
数组中不包括此尾部的大小。其目的是迫使读者能够检查 TIFF 编写器是否在没有意识到这些优化的情况下,以破坏优化的方式修改了 TIFF 文件。如果优化的读取器检测到不一致,则可以回退到使用TileOffsets[i]+TileByteCounts[i]
的常规/较慢方法。
6. 使用示例
csharp
gdalwarp src1.tif src2.tif out.tif -of COG
ini
gdal_translate world.tif world_webmerc_cog.tif -of COG -co TILING_SCHEME=GoogleMapsCompatible -co COMPRESS=JPEG