R raster: ¿enmascarar un ráster con un polígono también elimina las celdas parcialmente cubiertas?

9

Quiero enmascarar un ráster basado en los valores de un polígono: es decir, establecer en NA todos los valores del ráster que no estén cubiertos por los polígonos. Sin embargo, parece que raster::mask()enmascara las células (es decir, las establece en NA) incluso si están parcialmente cubiertas.

Esto es similar a la pregunta: Recortar un ráster por un polígono: faltan celdas que están parcialmente fuera del polígono , pero a diferencia crop(), mask()no tiene la snap="out"opción.

Verifique: aquí el punto correcto del triángulo toca una celda, pero esas celdas están enmascaradas.

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)

ingrese la descripción de la imagen aquí

Matifou
fuente

Respuestas:

15

La documentación es de hecho un poco confusa. Se afirma que:

[...] todas las celdas que no están cubiertas por el objeto espacial están configuradas para actualizar el valor

Pero en realidad, aquí cubierto significa solo si el centroide de la celda está en el polígono. De hecho, mask()llamadas rasterize(), que dice:

Para los polígonos, los valores se transfieren si el polígono cubre el centro de una celda ráster.

La solución que encontré fue usar rasterize()directamente, con la getCover=TRUEopción, que devuelve la cobertura de cada celda. Luego establezca los valores de NA que tienen cero y úselos como la nueva máscara:

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

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

ingrese la descripción de la imagen aquí

Matifou
fuente