¿Cómo rasterizar los polígonos espaciales en R?

10

Estoy tratando de extraer los valores de batimetría de mi área de interés de una capa ráster de batimetría mundial utilizando la función 'rasterizar' en el paquete {sp}.

* Ediciones: Encontré la función 'extraer' que parece ser más lo que estoy buscando.

Esto es lo que he hecho hasta ahora:

> 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)

ingrese la descripción de la imagen aquí

> 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 

No entiendo el resultado. ¿Por qué obtengo 2 colores para cada uno de mis polígonos? ¿Qué quieren decir?

¿Cómo puedo obtener finalmente el contorno de profundidad de batimetría? ¿Tiene esto algo que ver con mi resolución o con cambiar las dimensiones?

* Ediciones: ok, ahora he hecho lo siguiente:

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

v es una lista y no estoy seguro de cómo / bajo qué forma volver a vincular esta información con mi polígono espacial ...

¡Gracias!

GodinA
fuente
Cuando dice 'obtener contorno de profundidad de batimetría', ¿quiere decir que también desea generar contornos?
Simbamangu

Respuestas:

6

Su línea ras_sub0<-rasterize(subarea0,raster_bath)solo toma el número de índice de los polígonos y lo asigna a los valores del ráster.

Si desea solo la intersección de su polígono y el ráster:

subarea0_bathy <- intersect(raster_bath, subarea0)

Actualización : como señala @GodinA, parece que intersect () a veces no devuelve un ráster que tiene la extensión completa del polígono. Para evitar esto, puede cruzarse con un ráster un poco más grande que el 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) 
Simbamangu
fuente
Gracias @Simbamangu, probé el comando "intersectar", sin embargo, cuando trazo el subarea0_bathy y mi spaceialpolygon (subarea0), no se superponen por completo, ¿por qué? Para responder a su pregunta anterior, sí, me gustaría eventualmente también tener mi contorno de batimetría. ¿Alguna sugerencia?
GodinA
Sí, miré la salida de los datos de batimetría y un polígono de Tanzania y veo el mismo efecto. Vea mi actualización arriba. Para contornos, es tan fácil como cont <- contour(r3)entonces lines(cont)¿No es genial R?
Simbamangu
Genial, sí R puede ser fantástico! Gracias @Simbamangu, esto funciona! Sin embargo, me gustaría trazar solo mis polígonos espaciales con mi contorno de profundidad. ¿Quizás crear un SpatialPolygonsDataframe? Usando intersect, obtengo la información para todo el cuadrado que abarca mis polígonos espaciales. Necesito combinar de alguna manera mis polígonos espaciales con mi contorno de profundidad, pero no estoy seguro de cómo hacerlo. Es por eso que pensé que la función 'extraer' era un buen comienzo, pero termino con una lista de profundidad que no estoy seguro de cómo puedo volver a vincular con mis polígonos espaciales ... ¿Alguna idea? ¡Gracias de nuevo!
GodinA
¿Con qué quieres terminar? ¿Contornos (SpatialLines) que se superponen con su subárea0? Es posible que desee comenzar una nueva pregunta, ya que ahora va más allá del original.
Simbamangu
Sí, me gustaría obtener solo mi subárea0 con el contorno de profundidad para esta área definida
GodinA
1

Aquí hay otra solución, usando una función básica de subconjunto en 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)
ssanch
fuente