R中使用grep定位Shapefile失败的问题及修复
解决R中直接下载读取Shapefile时grep定位失败的问题
问题出在你用grep筛选.shp文件的方式上——默认的grep匹配规则没考虑到压缩包解压后的目录结构,或者正则表达式写得不够精确,导致没定位到目标文件。这个问题完全可以修复,核心是换用更可靠的文件筛选逻辑,同时确保遍历所有可能的子目录。
以下是修复后的完整代码,以加拿大统计局的Shapefile为例:
# 加载依赖包 library(sf) library(utils) # 加拿大统计局省级边界Shapefile的压缩包链接 zip_url <- "https://www12.statcan.gc.ca/census-recensement/2021/geo/sip-pis/boundary-limites/files-fichiers/lpr_000b21a_e.zip" # 创建临时目录用于存放下载和解压的文件 temp_dir <- tempdir() zip_file <- file.path(temp_dir, "canada_provinces.zip") # 下载压缩包(mode="wb"确保二进制文件下载完整) download.file(zip_url, destfile = zip_file, mode = "wb") # 解压压缩包到临时目录 unzip(zip_file, exdir = temp_dir) # 精准定位.shp文件:递归遍历目录,匹配后缀名 shp_path <- list.files( path = temp_dir, pattern = "\\.shp$", # 转义点号,确保只匹配后缀为.shp的文件 full.names = TRUE, # 返回完整文件路径 recursive = TRUE # 遍历所有子目录 ) # 读取Shapefile province_shape <- st_read(shp_path, quiet = TRUE) # 验证结果 print(province_shape)
关键修复点说明:
- 替换grep为list.files:
list.files支持递归遍历子目录(recursive=TRUE),这很重要——很多官方Shapefile压缩包解压后会把文件放在子文件夹里,原grep如果只扫根目录会找不到目标。 - 精确正则匹配:用
\\.shp$代替简单的.shp,避免匹配到.shp.xml这类附带文件;$确保匹配的是文件名末尾的后缀。 - 获取完整路径:
full.names=TRUE直接返回可用于st_read的完整文件路径,不用额外拼接目录。
内容的提问来源于stack exchange,提问作者heartofdarkness
相关产品推荐
相关产品推荐

