Начиная с шейп файла, содержащего довольно большое число (около 20000) потенциально частично перекрывающихся полигонов, мне нужно будет извлечь все субполигоны, возникшие путем пересечения их разных "границ".
На практике, начиная с некоторых макетов данных:
library(tibble)
library(dplyr)
library(sf)
ncircles <- 9
rmax <- 120
x_limits <- c(-70,70)
y_limits <- c(-30,30)
set.seed(100)
xy <- data.frame(
id = paste0("id_", 1:ncircles),
x = runif(ncircles, min(x_limits), max(x_limits)),
y = runif(ncircles, min(y_limits), max(y_limits))) %>%
as_tibble()
polys <- st_as_sf(xy, coords = c(2,3)) %>%
st_buffer(runif(ncircles, min = 1, max = 20))
plot(polys[1])
Мне нужно получить мультиполигон sf
или sp
, содержащий ВСЕ и ТОЛЬКО полигоны, сгенерированные пересечениями, что-то вроде:
(обратите внимание, что цвета только для иллюстрации ожидаемого результата, в котором каждая "окрашенная по-разному" область представляет собой отдельный многоугольник, который не накладывается на какой-либо другой многоугольник)
Я знаю, что смогу выработать свой путь, анализируя один полигон за раз, идентифицируя и сохраняя все его пересечения, а затем "стираем" эти области, образуя полный мультиполигон, и продолжаем цикл, но это довольно медленно.
Я считаю, что для этого должно быть более эффективное решение, но я не могу это понять, поэтому любая помощь будет оценена!
(Оба решения на основе sf
и sp
приветствуются)
ОБНОВЛЕНИЕ:
В конце концов, я узнал, что даже "один полигон за раз" задача далеко не простая! Я действительно борюсь за эту, по-видимому, "легкую" проблему! Любые намеки? Даже медленное решение или подсказки для начала на правильном пути были бы оценены!
ОБНОВЛЕНИЕ 2:
Возможно, это прояснит ситуацию: желаемая функциональность будет похожа на описанную здесь:
ОБНОВЛЕНИЕ 3:
Я наградил щедрость @shuiping-chen (спасибо!), чей ответ правильно решил проблему на примере предоставленного набора данных. Однако "метод" должен быть обобщен на ситуации: возможны "четверные" или "n-uple" пересечения. Я постараюсь работать над этим в ближайшие дни и опубликую более общее решение, если мне удастся!