从R中的多个县提取细胞数量

时间:2015-12-04 17:55:31

标签: r extract raster extraction

我是R的新手所以请原谅任何术语错误...我正在尝试提取俄克拉荷马州每个县的单元格编号并将它们粘贴在彼此之上以便我可以使用它们看看整个俄克拉荷马州的不同温度。我在美国有一个县的shapefile,所以我为OK状态制作了所有县ID号的矢量。然后我尝试在循环中提取每个县的单元格编号和最大临时值。我写的那个提取行在我一次做一个县的时候起作用,我认为这是okcounty = rbind行是问题,但我不知道最好的方法是什么。

感谢您的帮助!我真的很感激。

__init__

1 个答案:

答案 0 :(得分:1)

我发现你的代码有点令人困惑,可以看到一些地方出错了。你有点过分思考。我不确定你为什么要提取单元格而不仅仅是利用提取和堆栈对象。

“okcounties”对象可以是counties对象的sp类子集,您可以直接传递以提取例如。okcounties <- counties[counties$STATE_NAME=="Oklahoma",]

如果你放弃对范围的调用,即为每个县而不是县界返回一个边界框,事情会变得简单得多。要利用堆栈,您可以让extract提供栅格值的data.frame。这是合成数据的一个有效例子。我近似了这个例子的对象命名约定。我认为最终对象“ok.county”与您尝试创建的“县”对象相同。

首先,让我们创建一些示例数据并绘制

library(raster)
library(sp) 

# create polygons
p <- raster(nrow=10, ncol=10)
  p[] <- runif(ncell(p)) * 10
  counties <- rasterToPolygons(p, fun=function(x){x > 9})
  counties$county <- paste0("county",1:nrow(counties))
  counties$STATE_NAME <- c(rep("CA",3),
                          rep("OK",nrow(counties)-3))

# Create raster stack  
r <- raster(nrow=100, ncol=100)
  r[] <- runif(ncell(r), 40,70)
  r <- stack(r, r+5, r+10) # stack 
  names(r) <- c("June", "July", "Aug") 

plot(r[[1]])
  plot(p, add=TRUE, lwd=4) 

我们可以使用索引来子集我们感兴趣的状态。

ok <- counties[counties@data$STATE_NAME == "OK",]

现在我们可以在整个栅格堆栈上使用提取。生成的对象将是一个列表,其中每个多边形在包含data.frame的列表中都有自己的元素。 data.frame的每一列代表栅格堆栈对象中的一个层。

ok.county <- extract(r, ok)
  class(ok.county)
  head(ok.county[[1]])  

但是,如果要将列表折叠为单个data.frame,则缺少唯一的多边形标识符。这里我们将使用SpatialPolygonsDataFrame对象中的ID列。由于列表的排序方式与多边形对象相同,因此您可以从多边形对象中指定唯一值。在你的情况下,它可能是县名,方法将与示例相同。

cnames <- unique( counties@data$county )   
  for(i in 1:length(ok.county)) {
    ok.county[[i]] <- data.frame(county = cnames[i], ok.county[[i]])   
  }
head(ok.county[[1]])

现在我们已经为列表中的每个data.frame分配了一个唯一标识符,我们可以使用do.call将其折叠起来。

ok.county <- as.data.frame(do.call("rbind", ok.county))
  str(ok.county)

使用apply函数,我们可以为每个唯一ID提取给定列的最大值(时间段)。

tapply(ok.county[,"June"],  ok.county$county, max)

至于你的原始代码,这样的东西可以工作(显然,没有经过测试),但是没有唯一的多边形ID将结果绑回县,它仍然是县的边界框而不是多边形边界。

okcounties <- counties[counties$STATE_NAME=="Oklahoma",]
 county = NULL
 for (i in 1:nrow(okcounties)){
   county <- rbind(county, extract(OK.tmax[[1]], 
        extent(okcounties[i,]), cellnumbers=T))
 }