使用 GDAL 将数据写入 GeoTiff 而不创建数据数组?

rya*_*lon 2 python numpy gdal

是否可以使用 gdal 的 WriteArray 逐行写入数据,而不是创建并向其提供整个数组?

MemoryError我在创建大小为 (50539,98357) 的 numpy 数组时遇到了问题。我想我可以通过使用 PyTables 来解决这个问题,但我不想让事情复杂化

>>> import numpy
>>> cols = 50539
>>> rows = 98357
>>> a1 = np.zeros((cols,rows))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'np' is not defined
>>> import numpy as np
>>> a1 = np.zeros((cols,rows))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
Run Code Online (Sandbox Code Playgroud)

更新: 我最终使用 Abudis 的解决方案与稀疏矩阵相结合,在其中保存了点,将每一行拉出为“密集”或标准矩阵。欢迎评论。

dataset = driver.Create(filename, cols, rows, number_of_bands, band_type)
band = dataset.GetRasterBand(1)
offset = 1 # i.e. the number of rows to write with each iteration

# values, pixel_x, and pixel_y defined earlier in my script
data = scipy.sparse.csr_matrix((values,(pixel_y,pixel_x)),dtype=float)

# iterate data writing for each row in data sparse array
for i in range(data.shape[0]):
    data_row = data[i,:].todense() # output row of sparse array as standard array
    band.WriteArray(data_row,0,offset*i)
band.SetNoDataValue(NULL_VALUE)
band.FlushCache()
Run Code Online (Sandbox Code Playgroud)

abu*_*dis 5

并不是真正的gdal专家,但看起来这很有效。因此,技巧是使用WriteArrayyoff方法的参数。这样就可以将数据分块写入文件。我们基本上只是在写入下一个数据块时设置偏移量。

import numpy as np
import gdal

cols = 50539
rows = 10000
offset = 1000

dst_filename = 'test.tif'
format = 'GTiff'
driver = gdal.GetDriverByName(format)

dst_ds = driver.Create(dst_filename, cols, rows, 1, gdal.GDT_Byte)

for i in range(10):
    # generate random integers from 1 to 10
    a = np.random.random_integers(1, 10, size=(offset, cols))
    # write data to band 1
    dst_ds.GetRasterBand(1).WriteArray(a, 0, offset * i)

dst_ds = None
Run Code Online (Sandbox Code Playgroud)

这会生成 50539 x 10000 像素的 tiff 文件。如果您确实需要 98357 行,我想您可以将offset值设置为 1 和rows98357。理论上它应该可以工作,因为它可以在较小的数组(10 x 20 像素)上工作。

编辑:不要忘记更改range(10)为类似range(98357)xrange(98357)