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

如何用tidyverse风格从Zip包读取Shapefile且不生成可见解压文件?

问题:无可见解压文件,用tidyverse风格读取多Zip包中的Shapefile

需要实现不生成Windows资源管理器可见的解压文件,同时采用tidyverse风格(管道操作、不保存中间对象)从多个Zip压缩包中读取Shapefile。现有代码无法运行,需排查原因并修正。可使用美国城市边界的Shapefile Zip包测试(取2个文件简化验证即可)。

用户尝试的代码:

library(tidyverse)
library(magrittr)
library(sf)

list.files() %>% 
  map(unzip, list = T) %>% 
  map(filter, grepl(".shp$", Name)) %>% 
  map(~ .x %$% Name) %>% 
  map2(.x = ., .y = list.files(), .f = ~st_read(unzip(zipfile = .y, files = .x)))

代码无法运行的核心原因

  1. 仅处理Shapefile的单个.shp文件
    Shapefile是由.shp、.shx、.dbf等多个关联文件组成的格式,你的代码只过滤并解压了.shp文件,st_read()读取时会因缺少配套的索引、属性文件而报错。

  2. 解压到当前工作目录
    默认unzip()会将文件解压到当前工作目录,这会生成Windows资源管理器可见的文件,不符合你“无可见解压文件”的需求。

  3. 未正确处理临时文件路径
    st_read()需要明确的文件路径,而你的代码中unzip()仅返回文件名,未指定临时存储位置,导致读取逻辑混乱。


修正后的tidyverse风格代码

library(tidyverse)
library(sf)
library(withr)

# 筛选当前目录下的zip文件
list.files(pattern = "\\.zip$", full.names = TRUE) %>%
  map(function(zip_path) {
    # 创建临时目录,函数结束后自动清理
    withr::local_tempdir() %>%
      {
        # 解压当前zip包中所有Shapefile必要配套文件到临时目录
        unzip(zipfile = zip_path,
              files = unzip(zip_path, list = TRUE) %>%
                filter(str_detect(Name, "\\.(shp|shx|dbf|prj)$")) %>%
                pull(Name),
              exdir = .)
        # 从临时目录读取Shapefile(默认每个zip对应一个shp文件)
        list.files(., pattern = "\\.shp$", full.names = TRUE) %>%
          first() %>%
          st_read()
      }
  }) %>%
  # 按需合并所有读取的空间对象
  bind_rows()

代码说明

  • 用withr::local_tempdir()创建自动清理的临时目录,解压文件仅存在于临时空间,Windows资源管理器无法直接看到。
  • 筛选并解压Shapefile全部必要配套文件,确保st_read()能正常解析空间数据。
  • 全程使用管道串联逻辑,无中间对象保存,完全符合tidyverse风格。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:05:52