У меня есть большой SpatVector со множеством отдельных полигонов, некоторые из этих полигонов перекрываются друг с другом, и я хочу удалить все полигоны в любом месте, где есть перекрытие, оставив неперекрывающиеся части предпочтительнее, но не обязательно. В идеале для решения этой проблемы я смогу использовать только библиотеку terra
.
Вот небольшой пример двух перекрывающихся полигонов в одном SpatVector, который содержит ту же основную информацию, что и мой больший набор данных.
library(terra)
coords1 <- matrix(c(0, 0, 4, 0, 4, 4, 0, 4, 0, 0), ncol = 2, byrow = TRUE)
coords2 <- matrix(c(2, 2, 6, 2, 6, 6, 2, 6, 2, 2), ncol = 2, byrow = TRUE)
poly1 <- vect(coords1, type = "polygons")
poly2 <- vect(coords2, type = "polygons")
spatvect <- rbind(poly1, poly2)
spatvect$ID <- c(1, 2)
spatvect$year <- c(2020, 2021)
Если я недостаточно хорошо объяснил свою проблему или цель, дайте мне знать, чтобы я мог уточнить.
Используя sf::st_difference()
, вы можете сравнить свой объект сам с собой и вернуть разницу. При этом удаляются все пересекающиеся области.
library(terra)
library(sf)
library(ggplot2)
library(tidyterra)
coords1 <- matrix(c(0, 0, 4, 0, 4, 4, 0, 4, 0, 0), ncol = 2, byrow = TRUE)
coords2 <- matrix(c(2, 2, 6, 2, 6, 6, 2, 6, 2, 2), ncol = 2, byrow = TRUE)
poly1 <- vect(coords1, type = "polygons")
poly2 <- vect(coords2, type = "polygons")
spatvect <- rbind(poly1, poly2)
spatvect$ID <- c(1, 2)
spatvect$year <- c(2020, 2021)
# Convert SpatVector to sf, get st_difference() of itself, convert back to SpatVector
spatvect1 <- st_as_sf(spatvect) %>%
st_difference(., .) %>%
vect()
# Plot
ggplot() +
geom_spatvector(data = spatvect1, aes(fill = factor(ID)))