使用terra处理栅格转sf对象时SpatVector类无st_as_sf方法如何解决
问题原因
- 报错核心是
sf包自带的st_as_sf()方法不支持terra包生成的SpatVector类对象,你通过as.points()输出的矢量是SpatVector类型,直接调用st_as_sf()无法识别。 - 你的代码存在变量名笔误:前文读取shapefile后赋值为
adm_ner_sf,后续裁剪掩膜时调用的是未定义的adm_afg_sf,也会引发报错。
解决方案
方式1:调用terra包内置的适配方法
直接指定调用terra包提供的st_as_sf()方法,它原生支持SpatVector类转换,修复后的完整代码如下:
packs <- list("sf", "tidyverse", "terra") lapply(packs, require, character.only=TRUE) pop_count <- rast(raster.path) # 修正变量名,和后续调用保持一致 adm_afg_sf <- st_read(shp.path) pop_afg_sf <- pop_count %>% crop(vect(adm_afg_sf)) %>% mask(vect(adm_afg_sf)) %>% as.points() %>% # 指定调用terra的st_as_sf方法 terra::st_as_sf() %>% rename(pop_count = gpw_v4_population_count_rev11_2010_2pt5_min)
方式2:低版本兼容转换
如果你的terra版本较旧没有内置上述方法,可以先将SpatVector转为带WKT几何列的数据框,再用sf转换:
pop_afg_sf <- pop_count %>% crop(vect(adm_afg_sf)) %>% mask(vect(adm_afg_sf)) %>% as.points() %>% # 导出为带WKT几何的数据框 as.data.frame(geom = "WKT") %>% # 用sf的方法从WKT列生成sf对象 st_as_sf(wkt = "geometry", crs = st_crs(adm_afg_sf)) %>% rename(pop_count = gpw_v4_population_count_rev11_2010_2pt5_min)
内容的提问来源于stack exchange,提问作者Penny
相关产品推荐
相关产品推荐

