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

如何读取多个文件夹下的同名shapefile并关联文件夹名作为ID

问题排查与修复方案

现有代码的核心错误点

  • list.dirs默认会返回根目录./locs自身,同时会递归遍历所有子文件夹,其中很可能包含没有对应shapefile的文件夹,导致读取失败
  • readOGR的layer参数不需要加.shp后缀,只需要传入文件的主名即可,你写的"SAMENAME.shp"会导致识别不到图层
  • try是R内置的函数名,用它作为变量名会覆盖原有函数,建议更换为其他变量名

修复后的基础版本代码

library(rgdal)
library(purrr)

# 读取文件夹列表,可根据需要调整recursive参数
folders <- list.dirs(path = "./locs", full.names = TRUE, recursive = TRUE)
# 过滤掉根目录(根目录下没有对应shp的情况下可保留该逻辑)
folders <- folders[folders != "./locs"]

# 修正读取函数,layer去掉.shp后缀,同时实现文件夹名关联ID的需求
read_shp <- function(folder) {
  shp <- readOGR(dsn = folder, layer = "SAMENAME", verbose = FALSE)
  # 把所属文件夹名作为ID写入属性表
  shp$folder_id <- basename(folder)
  return(shp)
}

# 映射读取,用safely避免单个文件读取失败导致整个流程中断
shp_list <- map(folders, safely(read_shp))

# 筛选读取成功的结果
success_idx <- map_lgl(shp_list, ~is.null(.x$error))
final_shps <- map(shp_list[success_idx], ~.x$result)

更推荐的优化方案

改用sf包读取矢量数据,语法更简洁,和tidyverse生态兼容性更好,可直接输出合并后的数据集:

library(sf)
library(purrr)
library(dplyr)

folders <- list.dirs("./locs", full.names = TRUE, recursive = TRUE)
folders <- folders[folders != "./locs"]

# 构造所有shp文件的完整路径
shp_paths <- file.path(folders, "SAMENAME.shp")

# 批量读取、添加文件夹ID、直接合并为单一sf对象
final_shps <- map_dfr(shp_paths, function(path) {
  st_read(path, quiet = TRUE) %>%
    mutate(folder_id = basename(dirname(path)))
})

内容的提问来源于stack exchange,提问作者Nazer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:54:02