Comment pixelliser SpatialPolygons dans R?


10

J'essaie d'extraire les valeurs bathymétriques de ma zone d'intérêt d'une couche raster bathymétrique mondiale en utilisant la fonction 'rasterize' dans le package {sp}.

* Modifications: j'ai trouvé la fonction «extraire» qui semble être plus ce que je recherche.

Voici ce que j'ai fait jusqu'à présent:

> class(subarea0) #This is my area of interest (Eastern Canadian Arctic Sea)
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

> extent(subarea0)
class       : Extent 
xmin        : -82.21997 
xmax        : -57.21667 
ymin        : 60.2 
ymax        : 78.16666

library(marelac)
data("Bathymetry")#World bathymetric data in library (marelac)
names(Bathymetry);class(Bathymetry);str(Bathymetry)
[1] "x" "y" "z"
[1] "list"
List of 3
 $ x: num [1:359] -180 -179 -178 -177 -176 ...
 $ y: num [1:180] -89.5 -88.5 -87.5 -86.5 -85.5 ...
 $ z: num [1:359, 1:180] 2853 2873 2873 2873 2873 ...

  raster_bath<-raster(Bathymetry)#Transformed into a raster layer
    extent(raster_bath) <- extent(subarea0)#Transform the extend of my raster to the extend of my SpatialPolygons

>ras_sub0<-rasterize(subarea0,raster_bath)#rasterize my SpatialPolygons (*Edits: not the function that I need here, but I am still interested to learn what results mean)
Found 2 region(s) and 10 polygon(s)
> plot(ras_sub0)
> plot(subarea0, add=TRUE)

entrez la description de l'image ici

> ras_sub0
class       : RasterLayer 
dimensions  : 180, 359, 64620  (nrow, ncol, ncell)
resolution  : 0.06964709, 0.0998148  (x, y)
extent      : -82.21997, -57.21667, 60.2, 78.16666  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 
values      : in memory
min value   : 1 
max value   : 2 
layer name  : layer 

Je ne comprends pas le résultat. Pourquoi est-ce que j'obtiens 2 couleurs pour chacun de mes polygones? Que signifient-ils?

Comment puis-je finalement obtenir le contour de profondeur bathymétrique? Est-ce lié à ma résolution ou à la modification des dimensions?

* Modifications: ok, j'ai maintenant fait ce qui suit:

v <- extract(raster_bath, subarea0)#Extract data from my Raster Layer for the locations of my SpatialPolygons

v est une liste et je ne sais pas trop comment / sous quelle forme pour relier cette information avec mon polygone spatial ...

Je vous remercie!


Lorsque vous dites «obtenir un contour de profondeur bathymétrique», voulez-vous dire que vous souhaitez également générer des contours?
Simbamangu

Réponses:


6

Votre ligne ras_sub0<-rasterize(subarea0,raster_bath)prend simplement le numéro d'index des polygones et l'affecte aux valeurs du raster.

Si vous voulez juste l'intersection de votre polygone et du raster:

subarea0_bathy <- intersect(raster_bath, subarea0)

Mise à jour : Comme le note @GodinA, il semble que intersect () ne renvoie parfois pas un raster qui a l'étendue complète du polygone! Pour contourner ce problème, vous pouvez croiser un raster légèrement plus grand que votre original:

r2 <- raster() # create a generic raster
extent(r2) <- extent(subarea0) + 1 # add 1 degree of extent (0.5 each side)
r3 <- intersect(raster_bath, r2) 

Merci @Simbamangu, j'ai essayé la commande "intersect", cependant quand je trace le subarea0_bathy et mon spatialpolygon (subarea0), ils ne se chevauchent pas complètement, pourquoi? Pour répondre à votre question précédente, oui j'aimerais éventuellement avoir également mon contour bathymétrique. Aucune suggestion?
GodinA

Oui, j'ai regardé la sortie des données bathymétriques et d'un polygone de Tanzanie et je vois le même effet. Voir ma mise à jour ci-dessus. Pour les contours, c'est aussi simple cont <- contour(r3)qu'alors lines(cont)N'est pas génial?
Simbamangu

Super, oui R peut être fantastique! Merci @Simbamangu, cela fonctionne! Cependant, je voudrais seulement tracer mes polygones spatiaux avec mon contour de profondeur. Peut-être créer un SpatialPolygonsDataframe? En utilisant intersect, j'obtiens les informations pour le carré entier englobant mes polygones spatiaux. Je dois en quelque sorte combiner mes polygones spatiaux avec mon contour de profondeur, mais je ne sais pas comment faire. C'est pourquoi j'ai pensé que la fonction «extraire» était un bon début, mais je me retrouve avec une liste de profondeur que je ne sais pas comment je peux relier avec mes polygones spatiaux ... Des idées? Merci encore!
GodinA

Avec quoi voulez-vous vous retrouver? Contours (SpatialLines) qui se chevauchent avec votre sous-zone0? Vous voudrez peut-être commencer une nouvelle question car cela va maintenant au-delà de l'original.
Simbamangu

Oui, je souhaite obtenir uniquement ma sous-zone0 avec le contour de profondeur pour cette zone définie: gis.stackexchange.com/questions/25112/…
GodinA

1

Voici une autre solution, en utilisant une fonction de sous-ensemble de base dans raster.

# create a raster with the dimensions that you are interested in.
r <- raster(extent(subarea0)+1) # +1 to increase the area
res(r) <- 0.1 # you can change the resolution here. 0.1 can be about 10x10 km if you are close to the equator.
crs(r) <- projection(subarea0) # transfer the coordinate system to the raster

# Now you can add data to the cells in your raster to mark the ones that fall within your polygon.
r[subarea0,] <- 1 # this an easy way to subset a raster using a SpatialPolygons object

# check your raster
plot(r)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.