如何将R中terra创建模板栅格的代码转为rioxarray实现?
用rioxarray实现R terra的全球模板栅格创建
需求背景
需要创建一个全球范围、WGS84投影、1度分辨率的模板栅格,填充随机整数后保存为TIFF文件,用于后续其他栅格的重投影匹配。原R代码使用terra包实现,现在需要转成Python的rioxarray代码。
原R代码(terra包)
# 加载库 library("terra") # 创建空栅格:默认全球范围、WGS84投影,设置分辨率后自动计算行列数 a <- rast(res = 1) # 填充1-9的随机整数 vals(a) <- as.integer(runif(nrow(a) * ncol(a), 1, 10)) # 保存为无符号8位整数TIFF文件 writeRaster(a, "my_integer_rast.tif", wopt = list(datatype = "INT1U"))
待修正的Python代码(用户当前版本)
import xarray import rioxarray data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 示例数据 coords = {'x': [0, target_res, target_res*2], 'y': [0, target_res, target_res*2]} ds = xr.Dataset({'data': (['y', 'x'], data)}, coords=coords) ds.rio.set_spatial_dims(x_dim='x', y_dim='y', inplace=True) ds.rio.write_crs("EPSG:4326", inplace=True) ds.rio.write_transform(inplace=True) with rasterio.open( "test.tif, 'w', driver='GTiff', transform = ds.rio.transform(), crs=ds.rio.crs, dtype=rasterio.float32, #nodata=ds.rio.nodata, count=1, width=ref.rio.width, height=ref.rio.height) as dst: dst.write(ds.values)
修正后的rioxarray实现代码
核心步骤:
- 匹配R中
rast(res=1)的默认全球范围与分辨率 - 生成对应范围的随机整数数据
- 用rioxarray内置方法设置空间属性并保存文件
import rioxarray import numpy as np from xarray import DataArray # 1. 定义栅格核心参数(对应R默认设置) crs = "EPSG:4326" # WGS84投影 resolution = 1 # 1度分辨率 x_min, x_max = -180, 180 # 全球经度范围 y_min, y_max = -90, 90 # 全球纬度范围 # 计算行列数 width = int((x_max - x_min) / resolution) height = int((y_max - y_min) / resolution) # 2. 生成像素中心坐标(确保与R栅格对齐) x_coords = np.arange(x_min + resolution/2, x_max, resolution) y_coords = np.arange(y_max - resolution/2, y_min, -resolution) # 3. 生成1-9的随机无符号8位整数(对应R的INT1U类型) random_data = np.random.randint(low=1, high=10, size=(height, width), dtype=np.uint8) # 4. 创建带空间坐标的DataArray da = DataArray( random_data, dims=["y", "x"], coords={"x": x_coords, "y": y_coords} ) # 设置空间属性 da.rio.set_crs(crs, inplace=True) da.rio.set_spatial_dims(x_dim="x", y_dim="y", inplace=True) # 5. 保存为TIFF文件 da.rio.to_raster( "my_integer_rast.tif", driver="GTiff", dtype="uint8" )
原代码问题说明
- 手动创建的小范围数据块未匹配全球1度分辨率的需求
- 存在语法错误:
"test.tif引号未闭合 ref变量未定义,导致width=ref.rio.width无法执行- 无需直接调用rasterio底层方法,rioxarray的
to_raster已集成空间属性处理,更简洁
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

