如何通过循环加载多个点要素Shapefile并转换为CSV文件
批量将Shapefile转换为CSV文件(含投影转换)
我帮你梳理了原代码里的问题,并且给出两种可行的解决方案,帮你批量完成Shapefile转CSV的需求:
原代码的核心问题
out.files <- gsub("\\.shp$", ".csv")缺少输入对象,无法生成正确的CSV文件名- 最后一步用
shapefile()保存的仍然是Shapefile,没有输出CSV - 冗余构造
SpatialPointsDataFrame:readOGR读取的已经是空间对象,无需重复创建
方案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




