使用geodata包从WorldClim提取气候数据时SpatialPoints创建报错求助
问题
尝试用geodata包从WorldClim提取气候数据,创建SpatialPoints对象时遇到CRS相关错误。使用的代码如下:
library(sp) library(raster) library(geodata) r <- worldclim_global(var = "bio", res = 2.5, path= tempdir()) r <- r[[c(1,12)]] names(r) <- c("Temp","Prec") lats <- c(14.628434, 9.396111) lons <- c(-90.5227, -11.72975) coords <- data.frame(x=lons, y = lats) points <- SpatialPoints(coords, proj4string = r@crs)
执行最后一行时触发错误:
Error in initialize(value, ...) : no slot of name "crs" for this object of class "SpatRaster"
调整代码后又出现新错误:
Error in h(simpleError(msg, call)) : error in evaluating the argument 'obj' in selecting a method for function 'bbox': assignment of an object of class "Rcpp_SpatRaster" is not valid for slot ‘proj4string’ in an object of class "Spatial"; is(value, "CRS") is not TRUE
此前尝试用raster包的getData方法下载数据,但该方法已无法使用,求解决思路。
解决思路
- 问题根源:
geodata包返回的是**SpatRaster类型对象**(属于terra包的核心类),而非raster包的RasterLayer,因此不能用r@crs这种S4槽位访问方式获取坐标参考系,需要使用terra包的原生函数。 - 修正方案:
- 显式加载
terra包(geodata依赖该包,通常会自动加载,但显式加载可避免潜在问题)。 - 使用
terra::crs()函数提取SpatRaster的CRS信息,该函数返回的CRS对象完全符合SpatialPoints的参数要求。
- 显式加载
修正后的完整代码:
library(sp) library(raster) library(geodata) library(terra) # 显式加载terra包 r <- worldclim_global(var = "bio", res = 2.5, path= tempdir()) r <- r[[c(1,12)]] names(r) <- c("Temp","Prec") lats <- c(14.628434, 9.396111) lons <- c(-90.5227, -11.72975) coords <- data.frame(x=lons, y = lats) # 用terra::crs()获取合法的CRS对象 points <- SpatialPoints(coords, proj4string = crs(r))
- 备选方案:若习惯使用
raster包的对象体系,可将SpatRaster转换为RasterLayer后再操作:
# 将SpatRaster转换为RasterLayer r_raster <- raster(r) # 用raster包的方式访问CRS points <- SpatialPoints(coords, proj4string = r_raster@crs)
- 补充说明:
raster包的getData方法确实已被官方弃用,geodata是官方推荐的替代工具,因此你的数据获取流程是正确的,问题仅出在后续对象类型的适配环节。
内容的提问来源于stack exchange,提问作者Gerardo Manzanarez-Villasana
相关产品推荐
相关产品推荐

