如何解决使用 rasterio 对多个大型栅格求和
我在尝试对具有这些尺寸 Col = 53241 行 = 45598 像元大小 = 30 米,数据类型 = float32 的 15 个栅格求和时遇到一些问题。我使用 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
解决方法
在读取、写入和处理大型栅格时,有几种方法(Stackoverflow 中有一些关于它的线程)可以提高性能和/或内存消耗。这是一个使用名为 dask-raster 的库来使用块或窗口块进行读取/处理/写入的示例,我喜欢它,因为它易于使用,但您也可以在纯 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。