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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:15:37