R-Raster: Durch Maskieren eines Rasters durch ein Polygon werden auch teilweise abgedeckte Zellen entfernt?


9

Ich möchte ein Raster basierend auf den Werten eines Polygons ausblenden: dh alle Werte des Rasters, die nicht von den Polygonen abgedeckt werden, auf NA setzen. Es scheint jedoch, dass raster::mask()Zellen maskiert werden (dh auf NA gesetzt werden), auch wenn sie teilweise bedeckt sind?

Dies ist vergleichbar mit der Frage: Zuschneiden eines Raster durch ein Polygon - Zellen fehlen , die teilweise außerhalb des Polygons sind , aber im Gegensatz zu crop(), mask()nicht über die snap="out"Option.

Überprüfen Sie: Hier berührt der rechte Punkt des Dreiecks eine Zelle, diese Zellen werden jedoch ausgeblendet.

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)

Geben Sie hier die Bildbeschreibung ein

Antworten:


15

Die Dokumentation ist in der Tat etwas verwirrend. Es sagt, dass:

[...] Alle Zellen, die nicht vom Spatial-Objekt abgedeckt werden, werden auf den Aktualisierungswert gesetzt

Aber eigentlich hier bedeckt Mittel nur dann , wenn die Zelle des Schwerpunkt im Polygon ist. In der Tat mask()ruft rasterize(), die besagt:

Bei Polygonen werden Werte übertragen, wenn das Polygon die Mitte einer Rasterzelle bedeckt.

Die Lösung, die ich gefunden habe, bestand darin, sie rasterize()direkt mit der getCover=TRUEOption zu verwenden, die die Abdeckung jeder Zelle zurückgibt. Stellen Sie dann NA-Werte mit Null ein und verwenden Sie diese als neue Maske:

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

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

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.