如何抑制RasterIO的TIFFReadDirectory警告?
如何抑制RasterIO打开标签错误TIFF时的GDAL警告?
我用RasterIO打开TIFF文件时遇到如下警告:
Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.
这个警告出现在打开标签错误的TIFF文件时,具体场景是:
- 文件标签为
PHOTOMETRIC_MINISBLACK = 1 - 无
ExtraSample标签
但实际该TIFF是带有一个额外样本(掩码)的RGB图像。由于实际场景中无法提前知晓波段信息,提前指定标签的方法无效。我尝试过以下方法抑制警告,但都失败了: - 使用Python Warnings模块抑制各类警告
- 配置RasterIO日志
触发警告的代码如下:
import rasterio tiff = rasterio.open(path) img = tiff.read()
我的RasterIO版本信息如下(执行pip show -v rasterio输出):
Name: rasterio Version: 1.2.10 Summary: Fast and direct raster I/O for use with Numpy and SciPy Home-page: https://github.com/mapbox/rasterio Author: Sean Gillies Author-email: sean@mapbox.com License: BSD Location: /home/david/miniconda3/lib/python3.9/site-packages Requires: click-plugins, numpy, snuggs, cligj, click, setuptools, affine, certifi, attrs Required-by: rioxarray Metadata-Version: 2.1 Installer: pip Classifiers: Development Status :: 5 - Production/Stable Intended Audience :: Developers Intended Audience :: Information Technology Intended Audience :: Science/Research License :: OSI Approved :: BSD License Programming Language :: C Programming Language :: Cython Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3 Topic :: Multimedia :: Graphics :: Graphics Conversion Topic :: Scientific/Engineering :: GIS Entry-points: [console_scripts] rio=rasterio.rio.main:main_group [rasterio.rio_commands] blocks=rasterio.rio.blocks:blocks bounds=rasterio.rio.bounds:bounds calc=rasterio.rio.calc:calc clip=rasterio.rio.clip:clip convert=rasterio.rio.convert:convert edit-info=rasterio.rio.edit_info:edit env=rasterio.rio.env:env gcps=rasterio.rio.gcps:gcps info=rasterio.rio.info:info insp=rasterio.rio.insp:insp mask=rasterio.rio.mask:mask merge=rasterio.rio.merge:merge overview=rasterio.rio.overview:overview rasterize=rasterio.rio.rasterize:rasterize rm=rasterio.rio.rm:rm sample=rasterio.rio.sample:sample shapes=rasterio.rio.shapes:shapes stack=rasterio.rio.stack:stack transform=rasterio.rio.transform:transform warp=rasterio.rio.warp:warp Note: you may need to restart the kernel to use updated packages.
请问有什么通用方法可以抑制该警告?
解决方案
这个警告来自GDAL底层库,而非Python的warnings系统或RasterIO自身日志,所以之前的方法无效。可以通过以下两种方式抑制:
方法1:使用RasterIO环境上下文设置GDAL警告级别
通过rasterio.Env设置GDAL的环境变量,将警告级别调至仅显示错误及以上信息,从而屏蔽这类警告:
import rasterio with rasterio.Env(CPL_LOG_ERRORS='2'): tiff = rasterio.open(path) img = tiff.read()
也可以全局设置GDAL的警告阈值:
import rasterio from osgeo import gdal # 0=无警告,1=警告,2=错误,3=致命错误 gdal.SetConfigOption('CPL_LOG_ERRORS', '2') tiff = rasterio.open(path) img = tiff.read()
方法2:精准过滤特定警告
如果需要保留其他GDAL警告,可通过重定向错误处理函数过滤目标警告:
import rasterio from osgeo import gdal import sys def filter_gdal_warnings(message, level): # 忽略指定内容的警告 if "TIFFReadDirectory:Sum of Photometric type-related color channels" in message: return 0 # 其他警告正常输出 print(message, file=sys.stderr) return 1 # 替换GDAL错误处理函数 gdal.PushErrorHandler(filter_gdal_warnings) try: tiff = rasterio.open(path) img = tiff.read() finally: # 恢复默认错误处理 gdal.PopErrorHandler()
说明
- 方法1简洁高效,适合无需GDAL警告的场景;
- 方法2更灵活,可精准屏蔽特定警告,但多线程环境需注意线程安全性;
- 你的RasterIO 1.2.10版本依赖的GDAL支持上述配置,无需升级即可生效。
内容的提问来源于stack exchange,提问作者BananaJoe
相关产品推荐
相关产品推荐

