如何在R中使用streamstats包批量划定流域并提取指定特征?
完全可以通过for循环实现批量处理,你可以参考以下实现代码,同时加入了错误处理逻辑避免单点位请求失败导致整个流程中断:
# 加载包 devtools::install_github("markwh/streamstats") library(streamstats) setTimeout(120) # 构造示例点位数据 dat1 <- data.frame(matrix(ncol = 3, nrow = 3)) x <- c("state","lat","long") colnames(dat1) <- x dat1$state <- c("NJ","NY","VA") dat1$lat <- c(40.99194,42.02458,38.04235) dat1$long <- c(-74.28000,-75.11928,-79.88144) # 初始化结果数据框,提前定义需要提取的特征列 result <- dat1 result$DRNAREA <- NA_real_ result$FOREST <- NA_real_ result$LC11DEV <- NA_real_ result$LC11IMP <- NA_real_ # 循环遍历每个点位处理 for (i in seq_len(nrow(dat1))) { current_point <- dat1[i, ] # 流域划定,加入错误捕获 ws <- tryCatch( delineateWatershed( xlocation = current_point$long, ylocation = current_point$lat, crs = 4326, includeparameters = "true", includeflowtypes = "true" ), error = function(e) { message(paste("第", i, "个点位流域划定失败:", e$message)) return(NULL) } ) if (is.null(ws)) next # 计算流域特征,rcode使用当前点位对应的州缩写 chars <- tryCatch( computeChars(workspaceID = ws$workspaceID, rcode = current_point$state), error = function(e) { message(paste("第", i, "个点位特征计算失败:", e$message)) return(NULL) } ) if (is.null(chars)) next # 提取目标参数写入结果 params <- chars$parameters result[i, "DRNAREA"] <- params[params$code == "DRNAREA", "value"] result[i, "FOREST"] <- params[params$code == "FOREST", "value"] result[i, "LC11DEV"] <- params[params$code == "LC11DEV", "value"] result[i, "LC11IMP"] <- params[params$code == "LC11IMP", "value"] # 可选:设置延时避免请求过于频繁被接口限制 Sys.sleep(2) } # 查看最终结果 print(result)
如果你习惯使用tidyverse生态的工具,也可以通过purrr包的迭代函数实现更简洁的写法:
library(purrr) library(dplyr) # 定义单点位处理函数 get_watershed_chars <- function(state, lat, long) { ws <- tryCatch( delineateWatershed(xlocation = long, ylocation = lat, crs = 4326, includeparameters = "true", includeflowtypes = "true"), error = function(e) return(NULL) ) if (is.null(ws)) return(tibble(DRNAREA = NA_real_, FOREST = NA_real_, LC11DEV = NA_real_, LC11IMP = NA_real_)) chars <- tryCatch( computeChars(workspaceID = ws$workspaceID, rcode = state), error = function(e) return(NULL) ) if (is.null(chars)) return(tibble(DRNAREA = NA_real_, FOREST = NA_real_, LC11DEV = NA_real_, LC11IMP = NA_real_)) params <- chars$parameters tibble( DRNAREA = params[params$code == "DRNAREA", "value"], FOREST = params[params$code == "FOREST", "value"], LC11DEV = params[params$code == "LC11DEV", "value"], LC11IMP = params[params$code == "LC11IMP", "value"] ) } # 批量执行并合并结果 result <- dat1 %>% mutate(pmap_dfr(list(state, lat, long), get_watershed_chars))
两种方法最终输出的result数据框就是你要求的格式。
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

