R - 在循环中按属性缓冲 SpatialPolygons
R - Buffer SpatialPolygons by attribute in a loop
如何在 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])
}
以下循环 returns 所有多边形都使用相同的缓冲区宽度进行缓冲,但不使用 "radius" 列中指定的每个多边形的定义缓冲区宽度:
for (i in length(CrownsOut)) {
polys.df.buffer <- gBuffer(polys.df[ ], width=polys.df$radius[i], byid=TRUE)
}
代码几乎是正确的。您需要在 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)
如何在 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])
}
以下循环 returns 所有多边形都使用相同的缓冲区宽度进行缓冲,但不使用 "radius" 列中指定的每个多边形的定义缓冲区宽度:
for (i in length(CrownsOut)) {
polys.df.buffer <- gBuffer(polys.df[ ], width=polys.df$radius[i], byid=TRUE)
}
代码几乎是正确的。您需要在 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)