1 简介

gdal支持众多栅格驱动器,GeoTIFF就是其中最常用的,TIFF格式有很多创建选项(Create Option),在代码中和脚本中可以指定这些创建选项来自定义TIFF文件输出。在GDAL自带脚本中可以通过-co选项来添加创建选项。

2 脚本实例–镶嵌时应用

利用Google earth engine线上做地物分类,分类结果下载到本地是分幅存储的,需要镶嵌起来,保存结果想要尽可能压缩来提高存储效率。

版本1

不做压缩,直接输出,会占用空间很大。

python3 -m gdal_merge -ot Byte -of GTiff -o F:/曹县666.tif

版本2

输出结果做lzw压缩,可以有效节省空间。

许多人没有意识到,压缩方案在很大程度上取决于要处理的数据,在一个数据上运行良好的方案可能会在下一个很差。

但是由于我们不想给世界负担太多压缩方案,需要一种自适应方案,不求最好,但求在绝大多数图像上表现的不错,LZW具有这样的品质。

python3 -m gdal_merge -ot Byte -of GTiff -co COMPRESS=LZW -o F:/曹县666.tif

版本3

某些图像首先经过一个处理,其中每个像素值都用像素和前一个像素之间的差值代替,则可以使用LZW编码更好地压缩它们,在二维上执行这种差值计算可以帮助更多图像。

这就是LZW压缩中的PREDICTOR算法。

但是,使用这种额外的预处理后,许多图像的压缩效果并不理想,并且对于大量图像而言,压缩率实际上更差。因此,默认PREDICTOR值为1即不做这个预处理。

实验中尝试了PREDICTOR=2压缩效果提升不大。

python3 -m gdal_merge -ot Byte -of GTiff -co COMPRESS=LZW -co PREDICTOR=2 -o F:/曹县666.tif

版本4

Tiled Multi-Resolution (or Tiled Pyramidal) TIFF是简单的多页分幅 TIFF 图像, 每一种分辨率存储一个图层。

这是一种标准的TIFF扩展,很多软件都支持。libtiff函数库也支持这种tiff的读写,因此可以在gdal中使用。

Tiled Pyramidal TIFF 图像 也可以使用 LZW这样的无损压缩或者JPEG这样的无损压缩。

实验中添加了TILED标签后压缩比显著提升。

python3 -m gdal_merge -ot Byte -of GTiff -co COMPRESS=LZW -co PREDICTOR=2 -co TILED=YES -o F:/曹县666.tif

3 代码中使用–压缩输出

下面是一个封装的压缩输出的例子,直接调用gdal的包函数Warp(),还支持多线程处理

import gdal

def compressTifLZW(outraster, inraster):
    options=gdal.WarpOptions(
            creationOptions=["COMPRESS=LZW"], # creationOptions之压缩选项设置
            multithread=True # 多线程
            )
    gdal.Warp(outraster, inraster, options=options)

如果想在脚本中使用这个功能,在-co参数指定压缩即可

4 参考资料

https://gis.stackexchange.com/a/258215/88333

https://forum.xnview.com/viewtopic.php?p=104569&sid=839f082ea7e26ca900a7b5db75ae9ad4#p104569

https://www.fileformat.info/format/tiff/corion-lzw.htm

https://gdal.org/programs/gdal_merge.html

https://gdal.org/programs/gdalwarp.html

https://gdal.org/drivers/raster/gtiff.html