简化R中的二进制光栅化
我有一些非常小的国家级多边形和点形状文件,我想在R中进行栅格化。最终产品应该是一个全局二进制栅格(指示网格单元中心是否被多边形/点覆盖在单元内)。我的方法是在shapefile上循环,并对每个shapefile执行以下操作:简化R中的二进制光栅化,r,gis,raster,shapefile,sf,R,Gis,Raster,Shapefile,Sf,我有一些非常小的国家级多边形和点形状文件,我想在R中进行栅格化。最终产品应该是一个全局二进制栅格(指示网格单元中心是否被多边形/点覆盖在单元内)。我的方法是在shapefile上循环,并对每个shapefile执行以下操作: # load shapefile shp = sf::read_sf(shapefile_path) # create a global raster template with resolution 0.0083 ext
# load shapefile
shp = sf::read_sf(shapefile_path)
# create a global raster template with resolution 0.0083
ext = extent(-180.0042, 180.0042, -65.00417, 75.00417)
gridsize = 0.008333333
r = raster(ext, res = gridsize)
# rasterize polygon or point shapefile to raster
rr = rasterize(shp, r, background = 0) #all grid cells that are not covered get 0
# convert to binary raster
values(rr)[values(rr)>0] = 1
此处,rr
是光栅文件,shp
中的多边形/点编码为1,所有其他网格单元编码为0。然后,我对所有rr
进行求和,得到一个包含所有多边形/点的全局二进制光栅文件
最后两个步骤非常慢。此外,当我尝试用1
替换rr
中的所有正值时,我会遇到RAM问题,因为由于分辨率很高,单元格计数非常大。我想知道是否有可能为我想要实现的目标想出一个更聪明的解决方案
我已经找到了
fasterize
包,它可以快速实现rasterize
,效果很好。我认为如果有人有一个解决方案,rasterize
直接返回一个二进制光栅,这将是非常有帮助的。在计算上似乎有效并显著提高计算时间的方法是
shp
,而不是使用单个光栅化的shapefile
fasterize
包对合并的shapefile进行光栅化
raster::calc
避免内存问题
ext=范围(-180.0042,180.0042,-65.00417,75.00417)
gridsize=0.008333333
r=光栅(ext,res=网格大小)
rr=fasterize(shp,r,背景=0)#所有未覆盖的单元格均为0,其他单元格均为和
#转换为二进制光栅
fun=function(x){x[x>0]这就是使用graster
可以更好地实现这一点的方法。请注意value=1
参数,以及我更改了您的数据块规格,因为您所做的可能不正确
library(raster)
v <- shapefile(shapefile_path)
ext <- extent(-180, 180, -65, 75)
r <- raster(ext, res = 1/120)
rr <- rasterize(v, r, value=1, background = 0)
为了加快速度,您可以使用terra
(光栅的替代品)
库(光栅)
F
library(raster)
v <- shapefile(shapefile_path)
ext <- extent(-180, 180, -65, 75)
r <- raster(ext, res = 1/120)
rr <- rasterize(v, r, value=1, background = 0)
rr <- clamp(rr, 0, 1)
# or
rr <- rr > 0
# or
rr <- reclassify(rr, cbind(1, Inf, 1))
library(raster)
cds1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60))
cds2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55))
cds3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45))
v <- spLines(cds1, cds2, cds3)
r <- raster(ncols=90, nrows=45)
r <- rasterize(v, r, field=1)
library(raster)
f <- system.file("ex/lux.shp", package="terra")
v <- as.lines(vect(f))
r <- rast(v, ncol=75, nrow=100)
x <- rasterize(v, r, field=1)