使用 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)
我在尝试对具有这些维度的 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)