创建新的GeoTIFF文件时,仿射变换系数存在一些问题。我正在做的是在科学数据集上进行ETL,该数据集将导致2D Ndarray以及一组包含Lat和Lon的网状Ndarray。网格和数据集数组的尺寸均相同,为645 x980。据我了解,当通过SetGeoTransform()方法从Python GDAL创建GeoTIFF时,需要一个仿射系数列表。该列表的形式为[xllcorner, xrotation, x_cellsize, yllcorner, yrotation, y_cellsize]。我的处理方法与此处概述的类似:http://adventuresindevelopment.blogspot.com/2008/12/python-gdal-adding-geotiff-meta-data.html

这是我遇到问题的地方。我分别使用lat和lon的两个网状网格数组使用min()方法计算xllcorner和yllcorner,并通过应用公式[max-min]/dimension size手动计算x和y单元格大小,其中x尺寸为x轴尺寸对于lons网格,y尺寸是lats网格的y轴尺寸。当我应用此方法并尝试通过GetRasterBand().WriteArray()写出阵列带时,出现以下错误消息:

Traceback (most recent call last):
    ...
    raise ValueError("array larger than output file, or offset off edge")
ValueError: array larger than output file, or offset off edge


因此,我假设仿射系数的计算不正确,但是鉴于数据,这对我来说毫无意义。在尝试创建仿射系数之前,我什至还确保将空间参考系统设置为WGS:84。所以我的问题是如何用经纬网格和共享公共维度的数据数组正确创建仿射系数?我认为我的像元大小计算不能简单地是经/纬度差异。但我不确定。

最佳答案

当预期的数组形状不匹配时,通常会显示此错误。例如,查看预期形状是什么形状:

band = src.GetRasterBand(1)
arr = band.ReadAsArray()
print(arr.shape)  # (656L, 515L)


这将是要写入的numpy数组的形状:

assert other_array.shape == arr.shape
band.WriteArray(other_array)


并提出相同的ValueError,请更改形状,使其在一维上更长,例如:

band.WriteArray(other_array.T)




对于仿射变换,这可能不会引起任何错误,因为它通常只是存储为数据。 GIS栅格通常在左上角注册世界坐标,并使用-dy值向下计数行。但是,大多数软件通常都可以使用带有+ dy的左下角。当将数组作为打印矩阵与映射栅格进行比较时,它会倒置。

关于python - 来自Lat/Lon Meshgrids的GDAL仿射系数在Python中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24537151/

10-08 23:03