st_difference 的结果不正确

问题描述 投票:0回答:1

我试图在 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 值进行了尝试,但仍然不起作用。

r polygon distance shapefile geoplot
1个回答
0
投票

对于成对差异,您可能需要自己迭代几何对,一种选择是通过

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)
© www.soinside.com 2019 - 2024. All rights reserved.