Создание буфера от центроида до 20 м от краев многоугольника R

У меня есть шейп-файл, состоящий из морских и речных многоугольников в пределах государственной границы (обрезанный и замаскированный из карты земного покрова (растр) и границ штатов (шейп-файл многоугольника)). В пределах государственной границы у меня есть несколько многоугольников (в моем случае более 1500 различных многоугольников), и я хотел бы выделить область по краям и на 20 м внутрь (как внутренний буфер). Но в моем случае все мои полигоны не идеальной формы, некоторые из них - реки, некоторые - просто квадраты (10 * 10 м от растрового файла), а некоторые - большие озера. Моя проблема в том, как создать этот «внутренний буфер» для многоугольников, поскольку все многоугольники или даже не все части многоугольника должны иметь буфер (поскольку они меньше 40 м, буфер 20 м с каждой стороны)).

Позвольте мне показать вам мой код и то, как далеко я продвинулся.

poly <- jvk_18[53,]
cropped <- crop(mark_data, poly, snap = "near")
masked <- mask(cropped, poly)
sjo <- (masked == 61)
sjo <- clump(sjo, directions = 8, gaps = T)

Итак, вот только добыча, cropping, masking и clumping море и реки в пределах государственной границы.

Далее я преобразовал свои данные в МУЛЬТИПОЛИГОН

test <- st_as_stars(sjo)
test <- st_as_sf(test, merge = TRUE)
test <- st_cast(test, "MULTIPOLYGON")

После этого я нашел функцию st_centroid для определения средней точки многоугольника. Вот мой следующий вопрос: можно ли создать buffer от центроида до 20 м от краев? Возможно ли это и как в таком случае?

pol <- test[904, ]
cent <- st_centroid(pol)

Наконец, как упоминалось в начале, я хотел бы удалить эту «внутреннюю часть», чтобы в итоге получить только 20 м от краев и внутрь.


person paula456    schedule 12.05.2020    source источник


Ответы (1)


Вместо того, чтобы работать от центра к краям, не могли бы вы работать от краев внутрь, используя, как вы сказали, внутренний буфер?

Было бы легче помочь вам с воспроизводимым примером, но, учитывая объект sf poly, содержащий ваши многоугольники, я бы сделал что-то вроде:

core <- st_buffer(poly, -20) %>% st_union()    # this will shrink your edges by your desired amount, 20m (and union to tidy up)

diff <- st_difference(poly, core)  # difference will leave you with the 20 m ring, removing the core

Конечно, это приведет к исчезновению небольших полигонов ... вы, вероятно, могли бы установить условный размер буфера, но, пожалуйста, опубликуйте пример, если вам нужна помощь с этим!

person Sandy AB    schedule 12.05.2020
comment
Вау, ОГРОМНОЕ СПАСИБО! Это действительно сработало. Я немного волновался, что он не будет работать с полигонами, размер которых меньше, чем сам буфер, но компьютер только выдает мне предупреждение и по-прежнему дает мне площадь полигона с включенным буфером. - person paula456; 13.05.2020
comment
Здорово! Не могли бы вы проголосовать или принять ответ? Я тоже здесь новенькая :) - person Sandy AB; 13.05.2020