Raster raster: masquer un raster par polygone supprime également les cellules partiellement couvertes?

9

Je veux masquer un raster en fonction des valeurs d'un polygone: c'est-à-dire définir à NA toutes les valeurs du raster qui ne sont pas couvertes par les polygones. Cependant, il semble que raster::mask()les cellules soient masquées (c'est-à-dire qu'elles soient définies sur NA) même si elles sont partiellement couvertes?

Ceci est similaire à la question: Recadrer un raster par un polygone - les cellules manquantes qui sont partiellement en dehors du polygone , mais contrairement à crop(), mask()n'ont pas l' snap="out"option.

Vérifiez: ici le point droit du triangle touche une cellule, mais cette cellule est masquée.

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)

entrez la description de l'image ici

Matifou
la source

Réponses:

15

La documentation est en effet un peu déroutante. Il déclare que:

[...] toutes les cellules qui ne sont pas couvertes par l'objet Spatial sont définies sur updatevalue

Mais en réalité, ici couvert ne signifie que si le centroïde de la cellule est dans le polygone. En effet, les mask()appels rasterize(), qui stipulent:

Pour les polygones, les valeurs sont transférées si le polygone couvre le centre d'une cellule raster.

La solution que j'ai trouvée était d'utiliser rasterize()directement, avec l' getCover=TRUEoption, qui renvoie la couverture de chaque cellule. Ensuite, définissez les valeurs NA qui ont zéro et utilisez-le comme nouveau masque:

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

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

entrez la description de l'image ici

Matifou
la source