0

rasterToPolygons在包中使用时raster,满足公式标准的每个单元格都将成为其自己的多边形:

library(raster)
r <- raster(nrow=18, ncol=36)
r[] <- runif(ncell(r)) * 10
r[r>8] <- NA
pol <- rasterToPolygons(r, fun=function(x){x>6})
plot(pol)

但是,我希望每个具有相邻边或角的多边形成为一个较大多边形的一部分,从而减少总多边形的数量。有没有办法做到这一点?

4

2 回答 2

0

旧答案:

您可以使用参数dissolve=TRUE

library(raster)
r <- raster(nrow=18, ncol=36)
r[] <- sample(2, ncell(r), replace=TRUE)
pol <- rasterToPolygons(r, dissolve=TRUE)
plot(pol)

新答案

如果你不关心价值观,你可以做这样的事情

您的示例数据

library(raster)
r <- raster(nrow=18, ncol=36)
r[] <- runif(ncell(r)) * 10
r[r>8] <- NA

将您想要的所有值单元格设置为一个值,将所有其他值设置为NA

x <- reclassify(r, rbind(c(-Inf, 6, NA), c(6, Inf, 1)))

pol <- rasterToPolygons(x, dissolve=TRUE)

请注意, pol 现在只有 1 个(多)多边形。如果你想分离非连接部分,你可以做

pols <- disaggregate(pol)
pols
#class       : SpatialPolygonsDataFrame 
#features    : 80 

请注意,对角相邻的多边形彼此分开,因为它们不能用于有效的单个多边形(它将是自相交的)。

于 2018-04-11T03:23:06.830 回答
-1

这可以通过使用包中的poly2nb函数spdep来定义每个多边形的邻居,使用下面创建的函数来创建区域分配向量,使用spCbindfrommaptools包绑定regions到,然后最后使用函数 frompol溶解。创建函数的基本结构是多边形的至少一个邻居已分配给一个组,将多边形分配给该组,将多边形分配给该组,并将邻居分配给新组。regionsunionSpatialPolygonsmaptoolsifthenelse

library(raster)
library(spdep)
library(maptools)

r <- raster(nrow=18, ncol=36)
r[] <- runif(ncell(r)) * 10
r[r>8] <- NA
pol <- rasterToPolygons(r, fun=function(x){x>6}, dissolve = T)
plot(pol)

nb <- poly2nb(pol)

create_regions <- function(data) {
  group <- rep(NA, length(data))
  group_val <- 0
  while(NA %in% group) {
    index <- min(which(is.na(group)))
    nb <- unlist(data[index])
    nb_value <- group[nb]
    is_na <- is.na(nb_value)
    if(sum(!is_na) != 0){
      prev_group <- nb_value[!is_na][1]
      group[index] <- prev_group
      group[nb[is_na]] <- prev_group
    } else {
      group_val <- group_val + 1
      group[index] <- group_val
      group[nb] <- group_val
    }
  }
  group
}

region <- create_regions(nb)
pol_rgn <- spCbind(pol, region)
pol2 <- unionSpatialPolygons(pol_rgn, region)
plot(pol2)
于 2018-04-12T19:05:09.617 回答