Ответ заключается в том, что в целом эти два метода выполняют разные функции, хотя в вашем конкретном случае (поиск пересечения набора точек и многоугольника) st_intersects
можно использовать для эффективного выполнения той же работы.
Мы можем показать разницу на простом примере, измененном по сравнению с вашим собственным. Начнем с квадрата:
library(sf)
library(dplyr)
# create square
s <- rbind(c(1, 1), c(10, 1), c(10, 10), c(1, 10), c(1, 1)) %>%
list %>%
st_polygon %>%
st_sfc
plot(s)
![enter image description here](https://i.stack.imgur.com/3KS4p.png)
Теперь создадим прямоугольник и нарисуем его на том же участке пунктирным контуром:
# create rectangle
r <- rbind(c(-1, 2), c(11, 2), c(11, 4), c(-1, 4), c(-1, 2)) %>%
list %>%
st_polygon %>%
st_sfc
plot(r, add= TRUE, lty = 2)
![enter image description here](https://i.stack.imgur.com/fr9vA.png)
Теперь мы находим пересечение двух полигонов и наносим его красным цветом:
# intersect points and square with st_intersection
i <- st_intersection(s, r)
plot(i, add = TRUE, lty = 2, col = "red")
![enter image description here](https://i.stack.imgur.com/WrfkJ.png)
Когда мы исследуем объект i
, мы увидим, что это новый многоугольник:
i
#> Geometry set for 1 feature
#> geometry type: POLYGON
#> dimension: XY
#> bbox: xmin: 1 ymin: 2 xmax: 10 ymax: 4
#> epsg (SRID): NA
#> proj4string: NA
#> POLYGON ((10 4, 10 2, 1 2, 1 4, 10 4))
Тогда как, если мы используем st_intersects
, мы получим только логический результат, говорящий нам, действительно ли существует пересечение между r
и s
. Если мы попытаемся использовать это для подмножества r
, чтобы найти пересечение, мы не получим пересеченную форму, мы просто вернем наш исходный прямоугольник:
r[which(unlist(st_intersects(s, r)) == 1)]
#> Geometry set for 1 feature
#> geometry type: POLYGON
#> dimension: XY
#> bbox: xmin: -1 ymin: 2 xmax: 11 ymax: 4
#> epsg (SRID): NA
#> proj4string: NA
#> POLYGON ((-1 2, 11 2, 11 4, -1 4, -1 2))
Ситуация, которая у вас есть, другая, потому что вы пытаетесь найти подмножество точек, пересекающих многоугольник. В этом случае пересечение группы точек с многоугольником совпадает с подмножеством, отвечающим критерию st_intersects
.
Так что здорово, что вы нашли действительный способ более быстрого пересечения . Просто имейте в виду, что это будет работать только с наборами точек, пересекающих многоугольник.