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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:48:05