Sample data
x <- raster(x=matrix(data=1:36, nrow=6), xmn=-1000, xmx=1000, ymn=-100, ymx=900)
x[c(8, 15, 16, 17, 22, 25, 26, 30, 31)] <- NA
plot(x)
The problem
How do I distinguish (algorithmically) the holes in the raster i.e., the area bounded by cells c(15:17, 22) from the other gaps that are not holes (i.e., the rest of the empty cells)?
This would make it possible to do operations only on the hole / island regions of the raster, fill holes with a custom value etc etc.
The actual rasters have around 30000 holes and therefore speed is important. I am interested in both R and Grass GIS solutions. Many thanks for your help, much appreciated !
What about polygonizing? For speed I don't know what it will worth, but you could:
Now you have to make your singlepart polygons to multipart:
Now you find the "real" holes, which are the ones not touching the border
That gives you the cells number by hole. It found the cell "8" which you're not saying it's a hole so I'm not sure if it's correct, but it must be very close!
If it's slow in R, do the same algorithm in GRASS (mostly the
rasterToPolygons
call)