如何在R中重投影SpatialLinesDataFrame格式的shp文件列表?
问题分析与解决方案
你的报错核心都是传递给spTransform的对象类型不符合要求,具体问题和修正方法如下:
错误原因拆解
1. 第一种尝试的问题
你用lapply(files, ...)遍历的是文件名字符串列表,而非已经读取完成的SpatialLinesDataFrame空间对象列表。spTransform只能处理空间矢量对象,无法直接解析文件名字符串,因此触发了"character"类型不匹配的错误。
2. 第二种尝试的问题
- 循环范围错误:
for (i in length(roads))只会执行一次(length(roads)返回单个数值,比如3个文件就返回3,循环仅执行i=3),无法遍历所有元素。 - 对象提取错误:
roads[i]返回的是单元素子列表,不是单个SpatialLinesDataFrame对象,spTransform无法处理列表类型,因此触发"list"类型不匹配的错误。
正确代码实现
方法一:使用lapply处理已读取的空间对象列表
直接遍历已读入的roads列表(存储的是SpatialLinesDataFrame对象),同时用CRS()构造规范的坐标参考系对象:
EPSG_102033 <- " +proj=aea +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs" crs_target <- CRS(EPSG_102033) # 构造标准CRS对象 # 遍历空间对象列表,执行投影转换 roads_reprojected <- lapply(roads, function(sp_obj) { spTransform(sp_obj, CRSobj = crs_target) }) # 保留原文件名称(可选操作) roads_reprojected <- setNames(roads_reprojected, names(roads))
方法二:修正循环逻辑
调整循环范围覆盖所有元素索引,并用[[提取单个空间对象:
EPSG_102033 <- " +proj=aea +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs" crs_target <- CRS(EPSG_102033) # 遍历所有元素的索引 for (i in seq_along(roads)) { # 用[[i]]提取单个空间对象,转换后重新赋值 roads[[i]] <- spTransform(roads[[i]], CRSobj = crs_target) }
额外提示
- 确保所有原始
SpatialLinesDataFrame都有正确的原始坐标参考系(可通过proj4string(roads[[1]])查看),若缺失需先通过proj4string(roads[[i]]) <- 原始CRS字符串手动设置,否则spTransform会报错。 - 若使用较新的空间数据处理工具
sf包,可通过st_read读取文件、st_transform执行投影,语法更简洁统一。
内容的提问来源于stack exchange,提问作者Diego Brizuela
相关产品推荐
相关产品推荐

