Растворить отверстия в полигоне в 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)
То, что я действительно хочу, это внешняя граница многоугольника, внутри которой нет ничего. Любые идеи?
Ответы
Ответ 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]()