Créer des polygones de l'étendue et de la frontière d'un raster donné dans R

13

Je veux créer deux polygones.

  1. L'une est l'étendue rectangulaire de mon raster. Je sais que je peux obtenir l'étendue du raster en utilisant r <- raster("band5.tif") e <- extent(r) plot(e)me donne ceci: entrez la description de l'image ici

  2. Comment puis-je créer UN polygone de la limite du raster comme indiqué ci-dessous?

Voici à quoi ressemble mon raster:raster ("band5.tif")

csheth
la source

Réponses:

22

Voici un exemple.

library(raster)
# example data
x <- raster(system.file("external/test.grd", package="raster"))

Pour obtenir l'étendue rectangulaire

e <- extent(x)
# coerce to a SpatialPolygons object
p <- as(e, 'SpatialPolygons')  

Pour obtenir un polygone qui entoure des cellules qui ne sont pas NA

# make all values the same. Either do
r <- x > -Inf
# or alternatively
# r <- reclassify(x, cbind(-Inf, Inf, 1))

# convert to polygons (you need to have package 'rgeos' installed for this to work)
pp <- rasterToPolygons(r, dissolve=TRUE)

# look at the results
plot(x)
plot(p, lwd=5, border='red', add=TRUE)
plot(pp, lwd=3, border='blue', add=TRUE)
Robert Hijmans
la source
Je n'arrive pas à trouver de documentation sur la r <- r > -Infpièce. Que fait-il exactement? Et à quel point est-ce différent values(r)[!is.na(values(r))] <- 1(qui définit tous les emplacements qui ne sont pas NA dans r à 1).
csheth
3
r > -Infest basique R. Faites c(1,NA,3,NA) > -Infpour voir comment cela fonctionne. J'ai ajouté une alternative ( reclassify). Votre alternative fonctionne mais elle n'est pas bonne pour les gros objets.
Robert Hijmans
J'attends juste que mon ordinateur traite la rasterToPolygons()pièce, et ensuite j'évaluerai votre réponse. Merci pour le -Infpeu que ça va être très utile!
csheth
Pour un raster très volumineux, cela peut prendre un certain temps, voire échouer. Dans ce cas, vous pourriez envisager d'utiliser d'abord aggregatecar vous ne verriez pas la différence de toute façon.
Robert Hijmans du
Même avec seulement 100 cellules après avoir exécuté le aggregate()on r, il n'a pas été traité (ordinateur équipé de 16 Go de RAM). Le problème est que je dois garder la frontière aussi native que possible, car un DEM doit être extrait du polygone résultant. Si je sous-échantillonne davantage mon raster, je perdrai cette limite. Des travaux?
csheth