r - 如何加快从栅格中提取缓冲区中土地覆盖类型的比例?

标签 r performance spatial data-extraction r-raster

我想在大约 30 000 个 SpatialLines 类对象的 10 公里缓冲区中提取空间数据,并计算缓冲线周围每种土地覆盖类型的比例。我第一次使用函数crop裁剪我的栅格。然后,我使用了函数 extract (包栅格)来计算 10 种土地覆盖类型的比例。这是我的代码:

lapply(1:nrow(tab_lines), FUN=function(k){

第一步:围绕线路 build 10公里缓冲区
buf_line <- gBuffer(seg_line[k], width=10000) ## seg_line =  Lines objects

第二步:从栅格中提取缓冲区中的土地覆盖类型
ha <-extract(x=data_raster,y=buf_line)

第三步:计算10种土地覆盖类型的比例

每种土地覆盖类型的比例必须在列中(一列=一种土地覆盖类型)
    ha_1 <-length(ha[[1]][ha[[1]]==1])/length(ha[[1]])
    ha_2 <-length(ha[[1]][ha[[1]]==2])/length(ha[[1]])
    ha_3 <-length(ha[[1]][ha[[1]]==3])/length(ha[[1]])
    ha_4 <-length(ha[[1]][ha[[1]]==4])/length(ha[[1]])
    ha_5 <-length(ha[[1]][ha[[1]]==5])/length(ha[[1]])
    ha_6 <-length(ha[[1]][ha[[1]]==6])/length(ha[[1]])
    ha_7 <-length(ha[[1]][ha[[1]]==7])/length(ha[[1]])
    ha_8 <-length(ha[[1]][ha[[1]]==8])/length(ha[[1]])
    ha_9 <-length(ha[[1]][ha[[1]]==9])/length(ha[[1]])
    ha_10 <-length(ha[[1]][ha[[1]]==10])/length(ha[[1]])

     return(cbind(ha_1, ha_2, ha_3, ha_4, ha_5, ha_6, ha_7, ha_8, ha_9, ha_10))  
    })

如何加快 30 000 条空间线的处理时间? R 中是否还有其他软件包可以为此类提取提供更快的处理?

最佳答案

这是一个更简洁的公式

library(raster)
library(rgeos)

buf_line <- gBuffer(seg_line, width=10000, byid=TRUE)
ha <- extract(x=data_raster, y=buf_line)
h <- sapply(ha, function(x) tabulate(x, 10))
h <- h / colSums(h)

但我不认为这会快得多。您可以尝试使用 sp::over 而不是提取物

根据您的计算机,首先运行可能会加快速度
beginCluster()

关于r - 如何加快从栅格中提取缓冲区中土地覆盖类型的比例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143320/

相关文章:

r - 我可以使用 mi 包汇集估算的随机效应模型估计值吗?

csv - 如何将 ".csv "数据文件导入 Redis 数据库

r - 当两个数据框具有不同的列集时,按行合并两个数据框(rbind)

sql - 更新具有多列的表中的行

java - 将实时数据记录到 NoSQL DB 的最佳实践

php - 表示大型元素的 CSS 和 JS 文件的最佳方式

r - 在 R 中创建空间数据

r - 通过具有任意函数的非整数因子聚合栅格

r - 启动时发生严重错误 R ... ."jvm.dll"丢失!无法再使用库

java - 无法通过我的 R 脚本将工作表添加到 excel 文件