如何在R的qgisprocess包中用R对象指代临时图层执行栅格计算?
解决qgisprocess中native:rastercalc引用R对象的问题
问题核心是QGIS栅格计算器的表达式用的是栅格文件的内部基础名称(比如elev.tif对应elev),不是R中的对象名。临时文件的随机文件名没法提前硬编码,所以得用动态方式处理,有两种可行方案:
方案1:动态提取栅格的基础名称
不管输入是本地文件还是临时生成的文件,都可以提取其文件名的基础部分(去掉后缀),然后拼接到表达式里:
require(terra) require(qgisprocess) require(tools) # 示例:本地文件 raster1 <- system.file("ex/elev.tif", package="terra") # 获取栅格基础名(elev) raster_name <- file_path_sans_ext(basename(raster1)) # 动态生成表达式 expr <- paste0('"', raster_name, '@1"+1') # 运行算法 output <- qgis_run_algorithm( algorithm = "native:rastercalc", LAYERS = raster1, EXPRESSION = expr ) # 临时文件场景同理:比如前一步qgis_run_algorithm输出的临时栅格 temp_raster <- qgis_output(output, "OUTPUT") temp_name <- file_path_sans_ext(basename(temp_raster)) expr_temp <- paste0('"', temp_name, '@1"+1') output_temp <- qgis_run_algorithm( algorithm = "native:rastercalc", LAYERS = temp_raster, EXPRESSION = expr_temp )
方案2:给输入图层指定别名(更灵活)
qgisprocess支持给输入图层设置自定义别名,这样表达式里直接用别名即可,不用管原文件名:
方法A:使用命名列表传递LAYERS
require(terra) require(qgisprocess) raster1 <- system.file("ex/elev.tif", package="terra") output <- qgis_run_algorithm( algorithm = "native:rastercalc", # 用命名列表指定别名:键是别名,值是文件路径 LAYERS = list(my_raster = raster1), # 表达式直接用别名 EXPRESSION = '"my_raster@1"+1' )
方法B:用qgis_layer()函数显式设置别名
output <- qgis_run_algorithm( algorithm = "native:rastercalc", LAYERS = qgis_layer(raster1, name = "my_raster"), EXPRESSION = '"my_raster@1"+1' )
这种方法尤其适合函数中处理临时文件的场景,不管临时文件名怎么变,只要固定别名就能稳定引用。
内容的提问来源于stack exchange,提问作者ucfaard
相关产品推荐
相关产品推荐

