Подтвердить что ты не робот

Растворить отверстия в полигоне в R

Я выполняю некоторые задачи геообработки в R, в которых я пытаюсь создать несколько полигонов для отсечения растров экологической информации. Я буферизую несколько сложных полигонов, и это оставляет небольшие подгеометрии, от которых я бы хотел избавиться. В ArcGIS я думаю, что это будет включать преобразование моего многоугольника из multipart в singlepart (или что-то вдоль этих строк), а затем растворение, но я не знаю, как это сделать в R.

Вот пример, иллюстрирующий проблему:

require(maptools)
require(rgeos)

data(wrld_simpl)
wrld_simpl[which([email protected]$NAME=='Greece'),]->greece
proj4string(greece)<-CRS('+proj=lonlat +datum=WGS84')
gBuffer(greece,width=0.5)->buf
plot(buf)

То, что я действительно хочу, это внешняя граница многоугольника, внутри которой нет ничего. Любые идеи?

4b9b3361

Ответ 1

Если вы просто хотите получить одно кольцо, которое образует границу вашего буфера, то это:

plot(SpatialPolygons(list(Polygons(list([email protected][[1]]@Polygons[[1]]),ID=1))),lwd=2)

- очень удобный способ сделать это (и зачеркнуть его) для вашего дела.

То, что вы действительно хотите, это получить все кольца с ringDir=1, так как остальные будут дырками. Вам нужны все кольца, потому что ваш буфер может быть еще двумя отсоединенными островами.

outerRings = Filter(function(f){[email protected]==1},[email protected][[1]]@Polygons)
outerBounds = SpatialPolygons(list(Polygons(outerRings,ID=1)))
plot(outerBounds)

может сделать трюк... Попробуйте с помощью width=0.1, и вы увидите, что он работает с несколькими островами, но все же удаляет отверстие.

Ответ 2

Если вы хотите, чтобы выпуклая оболочка соответствовала Греции, вы можете использовать функцию gConvexHull в пакете rgeos. Обратите внимание, что это не обязательно подход, если вы имеете дело с полигонами с дырками в них, как я думал, это было из названия вопроса. Однако, из вашего примера, похоже, что подход ниже поможет вам, где вы хотите.

myCH <- gConvexHull(greece)

plot(myCH)

который будет создавать что-то вроде

enter image description here

И чтобы проверить, что все подходит,

plot(myCH)
plot(greece,add=TRUE)

enter image description here