是否应将GDAL设置为通过压缩生成GeoTIFF文件?应该使用哪种算法?


50

我有一个主要由GeoTIFF文件组成的GIS数据文件夹。整套大约重约1.2 GB。我注意到,如果将内容包装到tarball中,它将粉碎到大约82 MB。我想将其检入修订控制系统中,以便其他人可以使用它,并且似乎可以挤出一些空间。

GDAL GeoTIFF 驱动程序页面列出了许多可用于创建压缩的GeoTIFF文件的选项。还有很多选项会影响每种算法的工作方式。

帮助页面在描述选项方面做得很好,但是没有详细说明如何选择与变化的压缩级别相关的算法或权衡取舍。这导致以下问题:

  • 使用压缩的优点是可以节省大量空间。缺点是什么?压缩图像时信息会丢失吗?

  • 如何选择一种算法和压缩级别。某些类型的图像是否适合某种算法?

Answers:


84

要选择压缩方法,您需要使用以下命令:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

使用压缩时,最大的折衷是解压缩图像所需的额外处理时间,解压缩后图像仍将消耗相同的内存量。关于信息丢失,压缩有两种基本类型:

  • 无损-保留原始数据值
  • 有损-降低数据质量以节省更多空间

当必须保留原始数据值(例如DEM或栅格要素)时,您将采用无损算法。像PACKBITSDEFLATELZW之类的算法是无损的,可以根据压缩率进行排序:

  1. LZW-最高压缩比,最高处理能力
  2. 放气
  3. PACKBITS-最低压缩率,最低处理能力

压缩率仍取决于数据,如果数据具有很多相似的值,PACKBITS将产生良好的结果。

与无损相反,您将使用诸如JPEG之类的有损算法来压缩不必返回精确值的栅格。例如,可以使用有损算法来压缩正射照片或卫星图像。


5
+1是个不错的答案。PACKBITS是游程长度编码(en.wikipedia.org/wiki/Run-length_encoding)的一种形式,它对于具有大量相邻相同值的数据(例如,如果您有很多NULL或分类栅格)非常有用。 LZW是一种更健壮的算法,可对多种数据有效。如上所述,一般的权衡是在空间和速度之间,因此适当的选择取决于您的使用和数据。另外,某些软件不支持某些类型的GeoTiff压缩。
SCW

3
这是一篇很好的相关文章linfiniti.com/2011/05/…– oeon 2011
6

1
好的答案,它很好地总结了您的选择。还要记住,每种压缩方法都有您可以设置的参数,这将大大影响结果。@ j03lar50n,很高兴您发现我的博客文章有用...
R

漂亮的答案!如此简单而正确。
sys49152 '18

@scw您能详细说明哪些软件不支持某些类型的压缩-具体来说,是否有不支持lzw或packbits的软件?还是您主要指的是不太常见的算法?
David LeBauer

28

使用lzwdeflate压缩使用-co predictor=2可以帮助平滑地变化图像,因为它压缩了像素之间的差异而不是绝对值,并且这些差异会变小并且具有更多的图案(ref)。Predictor仅对lzwdeflate压缩有用,该选项对其他方法无效。

gdal_translate -co compress=lzw -co predictor=2 ...

预测变量的节省可能是巨大的。我只是将使用默认LZW设置的高达17GB的16位Geotiff高程模型的目录重新压缩为只有预报器= 2的5GB。

关于预测变量2和3之间的差异以及何时最佳使用预测变量(ref1ref2)的信息存在冲突。也许为另一个问题助燃。

节省的另一个简单选择是-co tiled=yes。有一些软件无法读取平铺图像,但是这些软件变得越来越稀少,而且大多在GIS之外(我不知道现在没有读取它们的主流GIS软件)。

以@alfonx 使用压缩概览的答案为基础:这样可以无损地存储基本图像,以确保数据完整性,而金字塔则可以有损存储,从而提高速度并节省空间。这几乎是两全其美。对于gdaladdoRGB图像上的最小概图:使用jpeg压缩,平均或高斯重采样而不是默认的最近邻(使概图更平滑)和YCBCR光度概图。有关这些选项的更多信息,请参见gdaladdo参考页(尽管并没有太多关于光度学的内容)。

这是Windows批处理文件的一部分,我用于将外部jpeg概述应用于目录中的所有tiff:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

笔记

GDAL 1.6.0引入了gauss重采样功能,average在边缘锐利,对比度高或图案嘈杂的情况下,可以提供更好的结果。应该使用2的幂(2 4 8 ...),以便选择3x3重采样的高斯内核。

JPEG_QUALITY_OVERVIEW 85 -如果未指定,则使用默认值75%,这会产生较小的文件,但是我发现85%的尺寸与质量之间的权衡会更好。

2015年更新: GDAL 1.8和2.0引入了许多新的选项,这里没有介绍,我没有时间去消化。阅读官方的gtiff格式页面,我确定还有详细的有用设置。


10

对于大型栅格,GeoTiff提供了将缩小的总览作为额外的图像存储到GeoTiff文件中的可能性。可以使用gdaladdo(= GDAL ADD概述)来完成。创建这些概述时,您也可以手动告诉gdal对其进行压缩:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

无需增加太多大小即可加快查看数据的速度。注意:Geotools应用程序(例如Geoserver,uDig,AtlasStyler,Geopublisher)都可以使用此功能并从概述中受益。



4

最终,您可能需要尝试不同的选项,并查看满足您需求的选项。

与基于小波的格式相比,我一直在更多地使用JPEG压缩的GeoTIFF。我的成绩很好。使用GDAL可以实现与基于小波格式相当的压缩率,而不会造成太多数据丢失。减压带来的性能下降是可以接受的。

我最喜欢这种方法的地方是,GeoTIFF支持几乎是通用的,而对基于小波格式的支持却始终无法得到保证,有时会遇到棘手的许可问题。


3

我将GeoTIFF与Earth Resource Mapping的ECW(增强压缩小波)压缩进行比较的经验是,压缩高分辨率的航空照片时,ECW的性能要好几个数量级。基于小波的压缩的另一个重要优点是,与较旧的格式(如GeoTIFF,JPEG)(而不是JPEG 2000)不同,仅图像的一部分可以被解压缩。1]。不能低估这一优势的重要性,尤其是在使用“大于大约一半的计算机内存大小”时。

看来-我从来没有测试它的机会-是的MrSID,另一propietary,基于小波的文件格式,也表现出比“老”的格式和选择性椎管减压更高的压缩比。

参考 1:http//www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf


1
dariapra,请记住,GeoTIFF-Packbits或GeoTIFF-LZW是无损压缩,而ECW和JPEG有损。必须根据将来的数据使用情况仔细选择无损或有损压缩。
markusN 2010年

1
我并不是说松散的压缩格式始终是有效的存储格式。我的意思是说,使用ECW之类的格式适合某些生产环境。例如,如果我们有一个MapServer实例通过WMS提供正射影像图层,则ECW比GeoTIFF更合适。没有什么禁止您也使用无损压缩来存储原图的。
dariapra

3

@dodobas@ matt-wilkie的答案涵盖了与使用GDAL压缩和模糊以减小图像大小有关的大多数内容。

我想补充两件事:

  • GDAL的文件格式文档:http ://www.gdal.org/frmt_gtiff.html ;
    • 请参阅创建选项(-co),特别是:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • 并且必须确认将使用GeoTIFF的软件:
    • 支持所需的压缩方法;
    • 建议使用压缩。

例如,的GeoServer并没有建议压缩GeoTIFFs

最后一点,Geotiff支持各种压缩,但是我们建议不要使用它。虽然它允许使用更小的文件,但解压缩过程非常昂贵,并且将在每次数据访问时执行,大大降低了渲染速度。根据我们的经验,解压缩时间要比纯磁盘数据读取时间长。

如果已经使用概述,切片和高性能存储介质(企业级磁盘或SSD),则尤其如此。


我还需要压缩我的jpeg图像,因为我无法使用gdalin Python将栅格转换为数组。它显示内存错误,有时还显示内存不足。任何人都无法知道如何在python中实现这一行(gdal_translate -co“ COMPRESS = method” src_dataset dst_dataset)。我是使用gdal的新手。因此,有时我很难理解其结构。
Shiuli Pervin

1
@ShiuliPervin,首先,JPEG已经是压缩(有损)格式。其次,听起来您遇到的是块问题,而不是压缩问题。读取文件时,请以块,带或块的形式读取文件,而不要一次读取所有文件。即使文件已压缩,使用时也必须解压缩(例如:如果4GB文件在压缩时在磁盘上使用2GB,则在全部加载以进行处理时仍会占用4GB RAM。节省空间的替代方案,您可能想看看稀疏格式的GeoTIFFs
凯文-

1
@ShiuliPervin,不过,我可能会误解你的问题。压缩本身通常会占用大量内存,但是除非库中存在错误或为您提供了无效的参数,否则压缩不会导致系统溢出。如果您在将JPEG作为GeoTIFF的压缩类型方面遇到问题,请尝试使用LZMA或DEFLATE。
凯文(Kevin)

0

对于使用较新GDAL版本的用户,还有无损ZStandardZSTD)压缩(GDAL> = 2.3)和有损有限错误光栅压缩LERC)压缩(GDAL> = 2.4)可供选择。

一般来说,虽然在写入文件时速度可能会稍慢(具体取决于您使用的设置),但与ZSTD两者相比LZWDEFLATE在相同的压缩率下,它们提供的数据读取速度更快。

如果您对数据精度不那么在意(例如仅进行可视化而不是分析),那么LERC可能是个不错的选择。有一个MAX_Z_ERROR设置可以让您调整您愿意牺牲的精度。例如1 MAX_Z_ERROR=0.001毫米或1毫米可在一个基准测试中节省50%的空间(请参阅参考资料)。

最好的部分是,你还可以结合LERCZSTD使用COMPRESS=LERC_ZSTD!或者,如果您喜欢使用DEFLATE,也可以这样做COMPRESS=LERC_DEFLATE。另请参阅GDAL GeoTIFF官方文档https://gdal.org/drivers/raster/gtiff.html#creation-options上的组合/设置的完整列表。

可以在以下有价值的参考资料中找到更多详细信息和完整的基准比较:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.