R中fasterize栅格化sfc_POLYGON对象报错问题求解
问题根因
所有报错的核心原因是raster()、fasterize()的栅格化输入要求为带属性表的sf类对象,你当前生成的polyCombin属于纯几何列(sfc_POLYGON/sfc类),缺失sf类必须绑定的data.frame属性结构,两类函数均无对应sfc类的处理方法,因此会出现找不到对应继承方法、参数类型不匹配的报错。
解决方案
无需反复读写shapefile,也无需将sfc对象转为普通data.frame,直接在内存中将纯sfc几何对象转为标准sf对象即可,操作流程如下:
- 类型转换
运行以下代码生成符合输入要求的sf对象:# 为sfc几何列绑定属性结构,转为标准sf对象 polyCombin_sf <- st_sf( rast_val = 1, # 栅格化赋值字段,所有海洋像素统一赋值为1 geometry = polyCombin, crs = st_crs(polyCombin) # 自动继承原数据坐标系 ) - 栅格化操作
两种实现方式二选一即可:- fasterize高速栅格化(推荐,处理大区域数据效率更高)
library(fasterize) library(raster) # 生成匹配研究区范围、分辨率的空栅格模板 r_base <- raster(polyCombin_sf, res = 1) # 执行栅格化 ocean_raster <- fasterize(polyCombin_sf, r_base, field = "rast_val") - raster原生栅格化
library(raster) r_base <- raster(polyCombin_sf, res = 1) ocean_raster <- rasterize(polyCombin_sf, r_base, field = "rast_val")
- fasterize高速栅格化(推荐,处理大区域数据效率更高)
- 后续距离计算前置校验
栅格化完成后确认:陆地区域栅格值为NA,海洋区域栅格值为非NA值,即可直接调用栅格距离计算函数,完成两点间不穿越陆地的最短路径计算。
踩坑提示
- 直接用
as.data.frame()转换sfc对象得到的是普通数据框,不具备sf类的空间属性标识,raster函数无法识别其中的几何信息,会触发「存在未使用的res=1参数」报错。 - 写出为shapefile再读取仍失败时,优先检查写出环节是否正确保留了几何列,写出过程中若几何列丢失,读入后依然不符合输入要求,直接在内存中完成sfc到sf的转换是稳定性最高的方案。
内容的提问来源于stack exchange,提问作者CharlotteS.
相关产品推荐
相关产品推荐

