Rasterização: mascarar uma varredura por polígono também remove células parcialmente cobertas?

9

Quero mascarar uma varredura com base nos valores de um polígono: ou seja, defina como NA todos os valores da varredura que não são cobertos pelos polígonos. No entanto, parece que raster::mask()oculta as células (ou seja, define-as para NA), mesmo que estejam parcialmente cobertas?

Isso é semelhante à pergunta: Cortar uma varredura por um polígono - células ausentes que estão parcialmente fora do polígono , mas diferentemente crop(), mask()não têm a snap="out"opção.

Verificação: aqui o ponto direito do triângulo toca uma célula, mas essa célula está mascarada.

library(raster)
library(sp)

r <- raster(xmn=1, xmx=5, ymn=1, ymx=5, nrows=4, ncols=4)
r[] <- 1:length(r)

Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(4.1,4,2),c(2,3,2)))

SpP = SpatialPolygons(list(Polygons(list(Sr1), "s1"), Polygons(list(Sr2), "s2")), 1:2)

plot(mask(r, SpP))
plot(SpP,  add=TRUE)

insira a descrição da imagem aqui

Matifou
fonte

Respostas:

15

A documentação é realmente um pouco confusa. Diz que:

[...] todas as células que não são cobertas pelo objeto Espacial são definidas para atualizar valor

Mas, na verdade, aqui coberto significa apenas se o centróide da célula estiver no polígono. Na verdade, mask()chama rasterize(), que afirma:

Para polígonos, os valores são transferidos se o polígono cobrir o centro de uma célula de varredura.

A solução que encontrei foi usar rasterize()diretamente, com a getCover=TRUEopção, que retorna a cobertura de cada célula. Em seguida, defina os valores de NA que possuem zero e use isso como a nova máscara:

SpP_ras <- rasterize(SpP, r, getCover=TRUE)
SpP_ras[SpP_ras==0] <- NA

plot(mask(r, SpP_ras))
plot(SpP,  add=TRUE)

insira a descrição da imagem aqui

Matifou
fonte