【问题标题】:R - Buffer SpatialPolygons by attribute in a loopR - 在循环中按属性缓冲 SpatialPolygons
【发布时间】:2018-12-20 13:11:02
【问题描述】:

如何在 SpatialPolygonsDataFrame 中缓冲 SpatialPolygons,每个 SpatialPolygon 的特定宽度取自其属性。

以下示例代码取自SpatialPolygons - Creating a set of polygons in R from coordinates并稍作修改:

square <- t(replicate(50, {
  o <- runif(2)
  c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o)
}))
ID <- paste0('sq', seq_len(nrow(square)))

# Create SP
polys <- SpatialPolygons(mapply(function(poly, id) {
  xy <- matrix(poly, ncol=2, byrow=TRUE)
  Polygons(list(Polygon(xy)), ID=id)
}, split(square, row(square)), ID))

# Create SPDF
polys.df <- (polys, data.frame(id=ID, row.names=ID))
polys.df$radius <- runif(50, 2.0, 8)

> head(polys.df)
      radius
sq1 7.397579
sq2 5.123130
sq3 4.607719
sq4 4.052619
sq5 6.571260
sq6 3.912436

每个 SpatialPolygon 都应使用其列“radius”的值进行缓冲。

尝试以下循环只会得到一个 SpatialPolygon 作为输出

for (i in length(polys.df)) {
  polys.df.buffer <- gBuffer(polys.df[i,], width=polys.df$radius[i])
}

以下循环返回以相同缓冲区宽度缓冲的所有多边形,但不是为“半径”列中指定的每个多边形定义的缓冲区宽度:

for (i in length(CrownsOut)) {
  polys.df.buffer <- gBuffer(polys.df[ ], width=polys.df$radius[i], byid=TRUE)
}

【问题讨论】:

  • 我认为您错过了对SpatialPolygonsDataFramepolys.df 的呼叫
  • 你能准确点还是给出示例代码?
  • 在你的代码中你有polys.df &lt;- (polys, data.frame(id=ID, row.names=ID)),但它必须是SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

标签: r for-loop spatial


【解决方案1】:

代码几乎是正确的。您需要在 for 循环之前初始化一个列表,并在每次迭代中分配缓冲的多边形。您还需要在循环条件中添加1:length(polys.df),否则它将只取最后一个多边形,您需要为每个多边形分配一个ID

library(rgeos)

spList = vector("list", length(polys.df))
for (i in 1:length(polys.df)) {
  a <- gBuffer(polys.df[i,], width = polys.df$radius[i])
  a$id = i
  spList[[i]] <- a
}

spListAll <- do.call("rbind", spList)

plot(spListAll)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多