我正在尝试在 Python 上将 GeoTIFF 文件从代表 30m² 的像素重新采样到代表 1000m² 的像素。
我有一个 geotiff,它有根据这些坐标的数据。空间分辨率为 30 平方米。我想将其更改为 1000 平方米。
我最初能够在 QGIS 上执行此操作,同时将 CRS 从 W84 投影(变形)到 EPSG 7390。但是,我想在不更改 CRS 的情况下进行重采样。当我在 QGIS 上尝试时,出现错误(“正在创建 0x0 数据集”)。
我尝试使用 GDAL 在 Python 上执行此操作,但遇到了同样的错误。这是我使用的代码(来自this Stack Exchange 帖子:
from osgeo import gdal
infn = '/path/to/source.tif'
outfn = '/path/to/target.tif'
xres=1000
yres=1000
resample_alg = 'near'
ds = gdal.Warp(outfn, infn, xRes=xres, yRes=yres, resampleAlg=resample_alg)
ds = None
这是 GDAL 错误:
错误 1:尝试创建 0x0 数据集是非法的,大小必须大于零。
此外,只是为了检查问题不在于打开文件,我还运行了:
referenceFile = infn
reference = gdal.Open(referenceFile, 0) # this opens the file in only reading mode
referenceTrans = reference.GetGeoTransform()
输出为:
(-58.168519761062974, 0.0002694945852358564, 0.0, -17.16626609035358, 0.0, -0.0002694945852358564)
我不完全确定我在这里做错了什么。我对地理数据非常陌生,非常感谢您的帮助。我怎么
注意:我不确定是在这里发布还是在 StackExchange 上发布,所以如果它不属于这里,请告诉我。
您需要以输出投影的单位提供分辨率。所以如果你不改变它,投影是
EPSG:4326 (WGS84)
,单位是度。因此,您要求 GDAL 扭曲到 1000 度的分辨率,如错误所示,这会导致 0x0 像素的无效输出维度。
1000 米的分辨率或多或少约为 0.009 度(1 公里/110 公里(每度纬度)。在以米为单位的分辨率和以度为单位的分辨率之间没有一对一的映射,因为它取决于位置本身。你可以查看下面链接中的表格以获取一些示例:
https://en.wikipedia.org/wiki/Longitude#Length_of_a_degree_of_longitude
所以使用 0.009° 作为分辨率应该更接近您的预期,但您需要的确切分辨率可能取决于实际应用。