You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:37