rgdal退役后:替换spTransform函数,调整GBIF数据过滤代码
用sf包替换rgdal/rgeos过滤GBIF物种分布记录的方案
原代码依赖的rgdal、rgeos包已停止维护,且sf包的函数不兼容旧的Spatial类对象,因此需要全程使用sf的空间对象体系来重构代码,以下是调整后的完整方案:
步骤1:加载所需包
library(sf) library(dplyr)
步骤2:将GBIF数据转换为sf空间点对象
直接从原数据框sp_gbif创建sf对象,无需先转成SpatialPointsDataFrame:
# 从sp_gbif创建sf点对象,指定经纬度列和WGS84坐标系(EPSG:4326) occ_sf <- st_as_sf(sp_gbif, coords = c("lon", "lat"), crs = 4326)
步骤3:将旧的Spatial多边形转换为sf对象
把原shape(SpatialPolygonsDataFrame)转成sf格式:
shape_sf <- st_as_sf(shape) # 若需要统一投影(原数据CRS已一致,此步可省略) # occ_sf <- st_transform(occ_sf, st_crs(shape_sf))
步骤4:筛选落在多边形内的GBIF记录
用st_filter替代原代码的gIntersects,直接筛选出在多边形范围内的点:
# 筛选与shape多边形相交的点 inside_sf <- st_filter(occ_sf, shape_sf, .predicate = st_intersects)
步骤5:关联回原完整数据集
移除sf对象的空间属性后,通过gbifID关联原数据,得到最终筛选结果:
final.gbif <- sp_gbif %>% semi_join(inside_sf %>% st_drop_geometry(), by = "gbifID") # 查看结果 head(final.gbif)
关键说明
- 全程使用sf空间对象,彻底避免了sp与sf对象混用的兼容性问题
st_as_sf支持直接从普通数据框或旧的Spatial对象转换为sf格式st_filter结合st_intersects的逻辑,完全等价于原代码中gIntersects的筛选效果st_drop_geometry用于剥离sf对象的空间信息,得到可用于关联的普通数据框
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

