【问题标题】:How can I speed up extraction of the proportion of land cover types in a buffer from a raster?如何加快从栅格中提取缓冲区中土地覆盖类型的比例?
【发布时间】:2016-03-12 15:09:00
【问题描述】:

我想在大约 30 000 个 SpatialLines 类对象的 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 中是否有任何其他包可以为这种类型的提取提供更快的处理?

【问题讨论】:

  • 您的代码运行缓慢的原因是它正在检查土地覆盖网格的所有单元格,以防它们与缓冲区重叠。为了加快速度,您应该创建一个与您当时正在检查的缓冲区范围相匹配的网格子集。如果您提供一些示例数据,那么有人会更容易帮助您。 GRASS(特别是 grass.osgeo.org/grass64/manuals/r.stats.html>)可以很好地工作,您可以将其连接到 R。示例如下:scottishsnow.wordpress.com/2014/08/24/many-rastered-beast>。

标签: r performance spatial data-extraction r-raster


【解决方案1】:

这里有一个更简洁的表述

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()

【讨论】:

  • 这不是你的问题所暗示的。在这种情况下,你应该问一个更好的问题。
  • 我想测试函数beginCluster() 来并行化任务。就我而言,我认为该函数应该具有以下结构:beginCluster() extract(data_raster , y=buf_line) ha_1 &lt;-length(ha[[1]][ha[[1]]==1])/length(ha[[1]]) ... tab_prop &lt;- cbind(ha_1, ha_2, ha_3, ha_4, ha_5, ha_6, ha_7, ha_8, ha_9, ha_10) endCluster()。但我不知道如何将 30 000 行与beginCluster() ?平行化
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多