Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简化R中的二进制光栅化_R_Gis_Raster_Shapefile_Sf - Fatal编程技术网

简化R中的二进制光栅化

简化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

我有一些非常小的国家级多边形和点形状文件,我想在R中进行栅格化。最终产品应该是一个全局二进制栅格(指示网格单元中心是否被多边形/点覆盖在单元内)。我的方法是在shapefile上循环,并对每个shapefile执行以下操作:

  # 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
直接返回一个二进制光栅,这将是非常有帮助的。

在计算上似乎有效并显著提高计算时间的方法是

  • 创建一个大的shapefile
    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)