【翻译】COG -- Cloud Optimized GeoTIFF generator

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的二次采样。
    • LZWDEFLATEZSTD压缩可以和PREDICTOR创建选项一起使用。
    • ZSTD:当使用内部libtiff时,如果GDAL基于libzstd >=1.0构建,或者如果基于支持zstd的外部libtiff构建,则可以使用ZSTD。
    • LERC:当使用内部 libtiff 时可用
    • LERC_ZSTD:当LERCZSTD可用时可用
    • 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)用于浮点数据类型(在某些情况下,标准预测器在浮点数据上的性能可能比浮点预测器好)。STANDARDFLOATING_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_LEVELZOOM_LLEVEL_STRATEGY选项控制)。

除非用户已经使用BLOCKSIZE选项指定了一个值,否则将使用切片方案中定义的切片大小(通常为256像素),在这种情况下,将考虑用户指定的值(即:如果设置的值高于256,则修改原始切片方案以考虑 HiDPi 切片的大小)。

在非自定义模式下,TARGET_SRSRESEXTENT选项将被忽略。从 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开始表示最粗略的缩放级别)。仅用于不同于CUSTOMTILING_SCHEME。如果指定了此选项,则忽略ZOOM_LEVEL_STRATIONY
  • ZOOM_LEVEL_STRATION=[AUTO/LOWER/UPPER]:(GDAL>=3.2)默认为 AUTO。确定缩放级别的策略。仅用于不同于CUSTOMTILING_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_SCHEMECUSTOM不同时才考虑。此选项的效果仅在将其设置为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]-4size=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]-4SIZE=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
相关推荐
葱明撅腚3 天前
利用Python挖掘城市数据
python·算法·gis·聚类
ct9785 天前
Cesium高级特效与着色器开发全指南
前端·gis·cesium·着色器
葱明撅腚7 天前
shapely空间数据分析
python·pandas·gis·shapely
极海拾贝8 天前
秒加在线底图!天地图、高德地图、星图地球、吉林一号底图一次配齐,收藏这篇就够了!
arcgis·gis·geoscene
ct9788 天前
Cesium 矩阵系统详解
前端·线性代数·矩阵·gis·webgl
两点王爷8 天前
KML文件格式和支持添加的内容
gis
水静川流9 天前
GIS工具、POI数据、DEM数据、NDVI数据等地学大数据
arcgis·gis·poi·dem·地学大数据
GIS遥遥11 天前
2026年地信测绘遥感(3S)专业升学、就业、考证、竞赛专属日历
gis·gis开发·测绘·地图可视化
酬勤-人间道11 天前
XPlote3DGenie 2.1.1.0:实用 3D 数据处理工具,百度网盘可直接安装
c++·3d·gis·编程·计算机软件·岩土