2017-07-11 3 views
0

J'ai 4 couches raster contenues dans une pile raster et je souhaite générer des polygones qui englobent toutes les cellules d'une valeur spécifiée.Création de polygones englobant des valeurs de trame spécifiques

Le package raster peut être utilisé pour générer un exemple de fichier.

library(raster) 
filename <- system.file("external/test.grd", package="raster") 
r <- raster(filename) 

Comme la trame ci-dessous, mes données réelles sont semblables à des cartes de l'habitat des animaux et ont une distribution inégale des zones « bons » et « mauvais ».

enter image description here

Pour plus étroitement mes données reflètent réelles, nous pouvons ajouter un peu de variation à trois autres rasters et faire une pile.

s <- stack(r, r+250, r-250, r+100) 

Travailler avec la pile s est-il possible de créer des polygones qui entourent toutes les cellules moins de 300 dans toutes les couches de la pile? En guise d'extension, mon objectif final est de calculer ensuite le chevauchement de surface (ou pourcentage) entre les polygones résultants.

Toute suggestion (spécifique ou générale) serait grandement appréciée.

Répondre

1

Puisque vous travaillez avec une pile raster, toutes vos cellules doivent avoir la même zone. Dans ce cas, je ne pense pas que vous ayez besoin d'utiliser des polygones. (Notez que j'ai ajusté vos données par exemple un peu.)

library(raster) 
filename <- system.file("external/test.grd", package="raster") 
r <- raster(filename) 
s <- stack(r, r + 50, r - 50, r + 100) 

# Create a new raster stack with results of a logical test 
s2 <- s < 300 

# Create a raster indicating which cells of the new stack 
# have values that are all TRUE 
r2 <- sum(s2) == length(unstack(s2)) 
# Multiply by the area of a single cell 
r3 <- r2 * area(r2)[1] 

# Sum the area for all raster values 
sum(values(r3), na.rm = TRUE) 
## 124800 

Si vous souhaitez utiliser des polygones et vos rasters ne sont pas trop gros, la conversion de la pile à un SpatialPolygonsDataFrame devrait être assez rapide. Voici une méthode analogue qui donne le même résultat:

# Create a new raster stack with results of a logical test 
s2 <- s < 300 

# Convert to sp object 
spdf <- as(s2, "SpatialPolygonsDataFrame") 

# Index to the rows/features where the values in s2 were all TRUE 
spdf2 <- spdf[which(rowSums([email protected]) == length(unstack(s))), ] 

rgeos::gArea(spdf2) 
## 124800