You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过循环加载多个点要素Shapefile并转换为CSV文件

批量将Shapefile转换为CSV文件(含投影转换)

我帮你梳理了原代码里的问题,并且给出两种可行的解决方案,帮你批量完成Shapefile转CSV的需求:

原代码的核心问题

  • out.files <- gsub("\\.shp$", ".csv")缺少输入对象,无法生成正确的CSV文件名
  • 最后一步用shapefile()保存的仍然是Shapefile,没有输出CSV
  • 冗余构造SpatialPointsDataFramereadOGR读取的已经是空间对象,无需重复创建

方案1:基于sp/raster包的修正版代码

这是在你原有代码基础上调整的版本,保留你熟悉的包:

library(raster)

# 设置工作目录
setwd("D:/share_1/PAPER_regimes/22_06_22/hp/firepoint_12_veg")

# 获取目录下所有Shapefile
all.files <- list.files(pattern="\\.shp$")
# 生成对应的CSV输出文件名(补全gsub的输入参数)
out.files <- gsub("\\.shp$", ".csv", all.files)

# 定义目标投影(UTM 16N,WGS84基准)
target_crs <- CRS("+proj=utm +zone=16 +datum=WGS84")

for(i in 1:length(all.files)) {
  # 读取Shapefile
  shp_data <- readOGR(all.files[i], stringsAsFactors = FALSE)
  
  # 将数据转换到目标UTM投影
  shp_utm <- spTransform(shp_data, target_crs)
  
  # 提取转换后的坐标,与属性表合并为普通数据框
  coords <- coordinates(shp_utm)
  shp_df <- cbind(coords, shp_utm@data)
  
  # 保存为CSV文件,不保留行名让输出更整洁
  write.csv(shp_df, out.files[i], row.names = FALSE)
}

方案2:更推荐的sf包方案(现代空间数据处理标准)

sp包目前仅处于维护状态,sf是当前R语言空间数据处理的主流工具,代码更简洁直观:

library(sf)

# 设置工作目录
setwd("D:/share_1/PAPER_regimes/22_06_22/hp/firepoint_12_veg")

# 获取所有Shapefile
all.files <- list.files(pattern="\\.shp$")
out.files <- gsub("\\.shp$", ".csv", all.files)

# 定义目标投影
target_crs <- st_crs("+proj=utm +zone=16 +datum=WGS84")

for(i in 1:length(all.files)) {
  # 读取Shapefile
  sf_data <- st_read(all.files[i], stringsAsFactors = FALSE)
  
  # 转换投影到UTM
  sf_utm <- st_transform(sf_data, target_crs)
  
  # 拆分几何对象为坐标列,转为普通数据框
  sf_df <- cbind(st_coordinates(sf_utm), st_drop_geometry(sf_utm))
  
  # 保存为CSV
  write.csv(sf_df, out.files[i], row.names = FALSE)
}

sf方案的优势

  • 函数语义更清晰(st_read读取、st_transform转投影)
  • 无需手动处理空间对象的内部结构(比如@data
  • 支持更多现代空间数据格式和高级操作

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

火山引擎 最新活动