Вот решение без полигонизации: (это не элегантно, но работает). Однако вы должны переклассифицировать свои лунки/островки по значениям (например, 999), а все остальные, не относящиеся к островам, — к NA. Как это:
x <- raster(x=matrix(rep(NA,36), nrow=6), xmn=-1000, xmx=1000, ymn=-100, ymx=900)
x[c(8, 15, 16, 17, 22, 25, 26, 30, 31)] <- 999
plot(x)
![Исходный фиктивный растр](https://i.stack.imgur.com/bF5Ec.png)
Теперь я использую функцию clump()
, чтобы проверить, есть ли остров, и самое интересное в этой функции то, что она также возвращает идентификаторы этих островов:
#Get Islands with IDs
cl <- clump(x,directions=8)
plot(cl)
![clumps/остров с идентификаторами](https://i.stack.imgur.com/DcSev.png)
Затем я создаю кадр данных из частот островов (это просто для получения идентификатора каждого острова).
freqCl <- as.data.frame(freq(cl))
#remove the (row) which corresponds to the NA values (this is important for the last step)
freqCl <- freqCl[-which(is.na(freqCl$value)),]
Проверьте, не касается ли какой-либо остров границы:
#Check if the island touches any border and therefore isn't a "real island" (first and last column or row)
noIslandID <- c()
#First row
if(any(rownames(freqCl) %in% cl[1,])){
eliminate <- rownames(freqCl)[rownames(freqCl) %in% cl[1,]]
noIslandID <- append(noIslandID, eliminate)
}
#Last row
if(any(rownames(freqCl) %in% cl[nrow(cl),])){
eliminate <- rownames(freqCl)[rownames(freqCl) %in% cl[nrow(cl),]]
noIslandID <- append(noIslandID, eliminate)
}
#First col
if(any(rownames(freqCl) %in% cl[,1])){
eliminate <- rownames(freqCl)[rownames(freqCl) %in% cl[,1]]
noIslandID <- append(noIslandID, eliminate)
}
#Last col
if(any(rownames(freqCl) %in% cl[,ncol(cl)])){
eliminate <- rownames(freqCl)[rownames(freqCl) %in% cl[,ncol(cl)]]
noIslandID <- append(noIslandID, eliminate)
}
Устраните те острова, которые касаются границы:
noIslandID <- unique(noIslandID)
IslandID <- setdiff(rownames(freqCl), noIslandID)
На последнем шаге назначьте 1 каждому «реальному острову» из исходного растра:
for(i in 1:length(IslandID)) {
x[cl[]==as.numeric(IslandID[i])] <- 1
}
plot(x)
![введите здесь описание изображения](https://i.stack.imgur.com/Brv4l.png)
person
maRtin
schedule
23.12.2016
x[c(15, 16, 17, 22)] <- Value
Однако я также заинтересован в более быстрых решениях. - person maRtin   schedule 17.12.2016