使用 rasterio 对多个大栅格求和

Sum multiple large rasters using rasterio

我在尝试对具有这些维度的 15 个栅格求和时遇到一些问题 Col = 53241 行 = 45598 像元大小 =30 米,数据类型 = float32。我使用 rasterio 执行此操作,但内存有问题。有什么建议吗?

提前致谢

这是代码

input=r'data folder path'
output=r'output path'

dir_list = os.listdir(input) 
merge_dir=[]
for filename in fnmatch.filter(dir_list,'*.tif'): 
  merge_dir.append((os.path.join(input, filename)))

map2array=[]
for raster in merge_dir:
    with rasterio.open(raster) as src:
        map2array.append(src.read().astype(np.float32))
        
profile=src.profile
profile.update(compress='lzw')

mosaic=np.nansum(map2array,0)

with rasterio.open(output, 'w', **profile) as dst:
   # Write to disk
   dst.write(mosaic)

无法为形状为 (1, 45598, 53241) 且数据类型为 float32 的数组分配 100.04 GiB

有几种方法(在 Whosebug 中有一些关于它的线程)可以提高性能 and/or 读取、写入和处理大型栅格时的内存消耗。这是一个使用名为 dask-raster 的库的示例,用于 read/process/write 使用块或 window 块,我喜欢它,因为它易于使用,但您也可以在纯 dask 中实现它:

import rasterio
import dask.array as da
from dask_rasterio import read_raster, write_raster
import os
import fnmatch

input_tif='data folder path'

merge_dir=[]
for filename in fnmatch.filter(os.listdir(input_tif),'*.tif'): 
    merge_dir.append((os.path.join(input_tif, filename)))

map2array=[]
for raster in merge_dir:
    map2array.append(read_raster(raster, band=1, block_size=10))
    
ds_stack = da.stack(map2array)

with rasterio.open(merge_dir[0]) as src:
    profile=src.profile
    profile.update(compress='lzw')
    
write_raster("output.tif", da.nansum(ds_stack,0), **profile)