如何加快从栅格中提取缓冲区中土地覆盖类型的比例?
How can I speed up extraction of the proportion of land cover types in a buffer from a raster?
我想在 class SpatialLines 的 30 000 个对象周围的 10 公里缓冲区中提取空间数据,并计算缓冲线周围每种土地覆盖类型的比例。第一次,我使用函数 crop
来裁剪我的栅格。然后,我使用函数extract
(封装栅格)来计算10种土地覆盖类型的比例。这是我的代码:
lapply(1:nrow(tab_lines), FUN=function(k){
第一步:在线路周边建设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()
我想在 class SpatialLines 的 30 000 个对象周围的 10 公里缓冲区中提取空间数据,并计算缓冲线周围每种土地覆盖类型的比例。第一次,我使用函数 crop
来裁剪我的栅格。然后,我使用函数extract
(封装栅格)来计算10种土地覆盖类型的比例。这是我的代码:
lapply(1:nrow(tab_lines), FUN=function(k){
第一步:在线路周边建设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()