如何在Python中保持CRS不变重采样GeoTIFF(解决0x0数据集错误)
解决GDAL重采样时“创建0x0数据集”错误的方法
错误原因
你的源数据采用WGS84(EPSG:4326,地理坐标系,单位为度),但你设置的xres=1000和yres=1000直接使用了米作为单位,GDAL会将其识别为度——1000度的分辨率远大于你的数据范围(从地理变换参数看,数据的经纬度范围仅零点几度),因此计算出的输出行列数为0,触发报错。你之前在QGIS中转到EPSG:7390(投影坐标系,单位为米)时能成功重采样,正是因为此时分辨率单位匹配。
方案1:转换到投影坐标系后重采样(推荐)
由于你需要的1000米是长度单位,在地理坐标系下直接设置会导致单位不匹配,建议先转换到EPSG:7390(或其他适配区域的投影坐标系),再执行重采样:
from osgeo import gdal infn = '/path/to/source.tif' outfn = '/path/to/target.tif' # 转换到EPSG:7390并设置1000米分辨率 ds = gdal.Warp( outfn, infn, dstSRS='EPSG:7390', xRes=1000, yRes=1000, resampleAlg='near' ) ds = None
方案2:在原WGS84坐标系下计算对应1000米的度分辨率
若坚持不更改CRS,需将1000米转换为度单位(不同纬度的转换系数不同,以下基于数据中心纬度-17°计算):
from osgeo import gdal import math infn = '/path/to/source.tif' outfn = '/path/to/target.tif' # 计算1000米对应的度分辨率 lat_center = -17 xres_deg = 1000 / (111320 * math.cos(math.radians(lat_center))) yres_deg = 1000 / 110574 resample_alg = 'near' ds = gdal.Warp(outfn, infn, xRes=xres_deg, yRes=yres_deg, resampleAlg=resample_alg) ds = None
注意事项
- 地理坐标系(如WGS84)的分辨率单位是度,直接使用米数值会导致范围溢出,必须转换单位后再设置
- 投影坐标系(如EPSG:7390)的单位是米,设置1000米分辨率更为直观且精度稳定,推荐优先使用该方案
内容的提问来源于stack exchange,提问作者Giulia Adoglio
相关产品推荐
相关产品推荐

