使用R处理向量以更快地栅格化


9

我正在将向量转换为R中的栅格。但是,过程太长了。是否可以将脚本放入多线程或GPU处理中以使其更快地执行?

我的脚本栅格化矢量。

r.raster = raster()
extent(r.raster) = extent(setor) #definindo o extent do raster
res(r.raster) = 10 #definindo o tamanho do pixel
setor.r = rasterize(setor, r.raster, 'dens_imov')

光栅

类:RasterLayer尺寸:9636、11476、110582736(nrow,ncol,ncell)分辨率:10、10(x,y)范围:505755、620515、8555542、8651792(xmin,xmax,ymin,ymax)坐标。参考 :+ proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

设定者

类:SpatialPolygonsDataFrame功能:5419范围:505755,620515.4,8555429,8651792(xmin,xmax,ymin,ymax)坐标。参考 :+ proj = utm + zone = 24 + south + ellps = GRS80 + units = m + no_defs变量:6个名称:ID,CD_GEOCODI,TIPO,dens_imov,area_m,domicilios1个最小值:35464,290110605000001,RURAL,0.00000003,100004, 1.0000最大值:58468,293320820000042,URBANO,0.54581673,99996,99.0000

设定者的印刷 在此处输入图片说明


您可以发布setor和r.raster的摘要吗?我想对setor中的对象数量和r.raster的尺寸有所了解。只需打印它们就可以了
mdsumner '16

我在问题正文中加上了摘要。
DiogoCaribé16年

不摘要,仅打印-我要求我们提供的信息,而不是tgere
mdsumner,2016年

对不起,我把照片打印了。
DiogoCaribé16年

啊,很失望,直到我看到打印输出,我才想到这一点-确保栅格的投影与多边形匹配,但现在不匹配-尝试r <-raster(setor); res(r)<-10; setor.r = rasterize(setor,r,'dens_imov')-但也可以尝试先将res(r)设置为<-250,以便您了解高分辨率版本将花费多长时间
mdsumner,2016年

Answers:


17

我尝试通过这种方式使用程序包“并行化”功能:rasterizeRparallel

  1. SpatialPolygonsDataFrame对象分成n部分
  2. rasterize 每个部分分别
  3. 将所有零件合并为一个栅格

在我的计算机中,并行化rasterize功能比无并行化功能少2.75rasterize

注意:以下代码从网上下载了一个多边形shapefile(〜26.2 MB)。您可以使用任何SpatialPolygonDataFrame对象。这仅仅是一个例子。

加载库和示例数据:

# Load libraries
library('raster')
library('rgdal')

# Load a SpatialPolygonsDataFrame example
# Load Brazil administrative level 2 shapefile
BRA_adm2 <- raster::getData(country = "BRA", level = 2)

# Convert NAMES level 2 to factor 
BRA_adm2$NAME_2 <- as.factor(BRA_adm2$NAME_2)

# Plot BRA_adm2
plot(BRA_adm2)
box()

# Define RasterLayer object
r.raster <- raster()

# Define raster extent
extent(r.raster) <- extent(BRA_adm2)

# Define pixel size
res(r.raster) <- 0.1

巴西SPDF

图1:巴西SpatialPolygonsDataFrame图

简单线程示例

# Simple thread -----------------------------------------------------------

# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))

我的笔记本电脑上的时间:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

多线程线程示例

# Multithread -------------------------------------------------------------

# Load 'parallel' package for support Parallel computation in R
library('parallel')

# Calculate the number of cores
no_cores <- detectCores() - 1

# Number of polygons features in SPDF
features <- 1:nrow(BRA_adm2[,])

# Split features in n parts
n <- 50
parts <- split(features, cut(features, n))

# Initiate cluster (after loading all the necessary object to R environment: BRA_adm2, parts, r.raster, n)
cl <- makeCluster(no_cores, type = "FORK")
print(cl)

# Parallelize rasterize function
system.time(rParts <- parLapply(cl = cl, X = 1:n, fun = function(x) rasterize(BRA_adm2[parts[[x]],], r.raster, 'NAME_2')))

# Finish
stopCluster(cl)

# Merge all raster parts
rMerge <- do.call(merge, rParts)

# Plot raster
plot(rMerge)

巴西栅格

图2:巴西栅格图

我的笔记本电脑上的时间:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

有关R中并行化的更多信息


很好的答案!
DiogoCaribé16年

您是否仅将n设置为机器的内核数?
山姆

@Sam我认为它应该可以正常工作,但是我不知道它是否更好!我认为,如果我分裂的功能,ñ部分等于核心数量也许这部分人可以更容易处理,并且处理这将是不使用的核心!但是,如果一个核心完成一个零件的处理后,您的零件多于核心,那么它将占用另一部分。但是可以肯定,我不确定!在这个问题上的任何帮助,将不胜感激。
古兹曼

今晚我要进行一些测试。在一个较小的shapefile(大约25km x 25km)上,光栅化为50m,使用n = 2,4或8而不是n = 20、30或最多50时,有微小的改进。今晚我将使用一个很大的shapefile栅格化到25m。单核处理需要10个小时,因此我们将看到n的不同值!!(n = 50不到1小时)
山姆

@Guzmán我再次运行代码。但是,它改变了一些错误,并且不知道为什么。你能帮助我吗?checkForRemoteErrors(val)中的错误:7个节点产生了错误;第一误差:对象“BRA_adm2”未找到
迪奥戈CARIBE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.