我试图在 sf 包中的一组点周围生成一组环,并且遇到了一个问题,即由于某种原因 st_difference 返回整个第一个几何图形,尽管两个输入重叠。我想要一个由距中心点 19 到 20 个单位的所有点组成的环。
这是我的示例代码
library(sf)
library(sp) # SpatialPoints
x_coords <<- runif(n = 10, min = -100, max = 100)
y_coords <<- runif(n = 10, min = -100, max = 100)
PhenomPoints <<- SpatialPoints(coords = cbind(x_coords,y_coords))
PhenomPoints_SF <<- st_as_sf(PhenomPoints)
buffer_zones <<- st_buffer(PhenomPoints_SF, dist=20)
buffer_zones_2 <<- st_buffer(PhenomPoints_SF, dist=19)
ring <- st_difference(buffer_zones,buffer_zones_2)
plot(buffer_zones, col = "Grey")
plot(buffer_zones_2, col = "Blue", add=TRUE)
plot(ring, col = "Yellow", add=TRUE)
但是,环似乎与 buffer_zones 基本相同。我尝试使用 st_intersects,它生成了一个交集,但是当我将其与 st_differences 一起使用时,它也返回了原始值。为了查看问题是否是空白的 CRS,我使用随机 CRS 值进行了尝试,但仍然不起作用。
对于成对差异,您可能需要自己迭代几何对,一种选择是通过
st_difference()
调用 mapply()
。
library(sf)
#> Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
set.seed(42)
x_coords <- runif(n = 10, min = -100, max = 100)
y_coords <- runif(n = 10, min = -100, max = 100)
points_sfc <-
st_multipoint(cbind(x_coords, y_coords)) |>
st_sfc() |>
st_cast("POINT")
buffer_zones <- st_buffer(points_sfc, dist=20)
buffer_zones_2 <- st_buffer(points_sfc, dist=15)
ring <-
mapply(st_difference, buffer_zones, buffer_zones_2, SIMPLIFY = FALSE) |>
st_sfc()
plot(points_sfc, xlim = c(-120, 120), ylim = c(-120, 120))
plot(ring, col = "Yellow", add= TRUE)
确保您的参数是 sfc / geometrty 列。如果您的缓冲区是
sf
对象,请首先提取几何图形:
mapply(st_difference, st_geometry(buffer_zones), st_geometry(buffer_zones_2), SIMPLIFY = FALSE)