在R语言中基于Shapefile创建指定值栅格时出现S4类型对象复制错误的求助
问题分析与解决办法
首先,咱们来拆解你遇到的报错原因:你写的newraster <- raster(x, ext, reso, ori)这一行参数使用完全不符合raster()函数的要求。当你把Shapefile读取得到的SpatialPolygon对象(也就是x,属于S4类型)作为第一个参数传入时,函数会默认用这个矢量的范围来创建栅格,但你又额外塞了ext、reso、ori这些参数,参数顺序混乱且冲突,导致函数试图复制S4类型的对象来适配参数需求,这就抛出了那个错误。
接下来是正确的实现步骤,其实不用手动传原点、分辨率这些参数,直接基于你的参考栅格pad来创建空栅格,再栅格化矢量数据就好,能完全匹配空间属性:
library(raster) library(rgdal) # 读取研究区矢量文件 x <- readOGR(dsn="D:/Mestrado/Tese/AreaEstudo/final", layer="areaestudofinaluniforme") # 读取作为参考的环境栅格 pad <- raster("D:/Mestrado/Tese/Dados modelação/Mais recente/Variáveis maxent/bio_11.asc") # 1. 直接基于参考栅格创建空栅格,自动继承所有空间属性(原点、分辨率、范围、投影) newraster <- raster(pad) # 2. 栅格化矢量对象:将矢量覆盖的单元格赋值为1,未覆盖的保持NA newraster <- rasterize(x, newraster, field = 1)
关键说明:
raster(pad)这一步是核心:它会完整复制pad的所有空间参数,完全避免手动设置原点、分辨率时可能出现的误差或参数不匹配问题。rasterize()是专门做矢量转栅格的函数,field=1指定给被矢量覆盖的单元格统一赋值1,没有被覆盖的单元格会默认保留NA,完美符合你的需求。如果你的矢量有多个要素且需要不同赋值,只需要把field改成矢量属性表里对应的字段名就行,但你的场景里用固定值1就够了。
内容的提问来源于stack exchange,提问作者Spectron
相关产品推荐
相关产品推荐

