5 votos

Proyectar ráster a una nueva extensión

Tengo algunos datos en una pila raster (proyecciones climáticas CCSM4 de 2010 - 2300) que he procesado, pero ahora me gustaría cambiar la extensión. No estoy 100% seguro de cómo hacer esto en R. Hasta ahora he intentado Extent , Origin , projectExtent , projectRaster pero no he tenido suerte. A continuación hay dos imágenes que muestran el problema que estoy teniendo y los resultados de lo que he intentado, y un ejemplo reproducible

Aquí está mi conjunto de datos original, la extensión es

> extent(pr_ccsm4_2.5deg)
class       : Extent 
xmin        : -0.625 
xmax        : 359.375 
ymin        : -89.5288 
ymax        : 90.4712 

Original Dataset

Lo que me gustaría hacer es que los datos tuvieran una extensión de

> extent(ras25)
class       : Extent 
xmin        : -180 
xmax        : 180 
ymin        : -90 
ymax        : 90 

Pensé que podría simplemente cambiar la extensión usando extent(pr_ccsm4_2.5deg) <- extent(ras25) Sin embargo, mis datos tienen el siguiente aspecto altered extent

Así que ahora, aunque la extensión es correcta, los datos no se proyectan correctamente.

He aquí un ejemplo reproducible

library(rworldmap)
library(cleangeo)
library(raster)
library(rasterVis)

# continental shapefile
cont <- getMap()
cont <- clgeo_Clean(cont)
cont <- sapply(levels(cont$continent),
               FUN = function(i){
                 poly <- gUnionCascaded(subset(cont, continent == i))
                 poly <- spChFIDs(poly, i)
                 SpatialPolygonsDataFrame(poly, data.frame(continent = i, row.names = i))
               }, USE.NAMES = TRUE)
cont <- Reduce(spRbind, cont)

ras <- raster(xmn = 0, xmx = 360, ymn = -90, ymx = 90, res = 2.5)
values(ras) <- runif(n = ncell(ras), 0, 1)
ras
> ras
class       : RasterLayer 
dimensions  : 72, 144, 10368  (nrow, ncol, ncell)
resolution  : 2.5, 2.5  (x, y)
extent      : 0, 360, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : layer 
values      : 2.22486e-05, 0.9998961  (min, max)
# Wrong extent
rasterVis::levelplot(ras, margin = NA, par.settings = RdBuTheme) + layer(sp.polygons(cont))

wrong extent raster

ras2 <- raster(xmn = -180, xmx = 180, ymn = -90, ymx = 90, res = 2.5)
values(ras2) <- runif(n = ncell(ras2), 0, 1)
ras2
> ras2
class       : RasterLayer 
dimensions  : 72, 144, 10368  (nrow, ncol, ncell)
resolution  : 2.5, 2.5  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : layer 
values      : 0.0001686567, 0.9998712  (min, max)

# Correct extent
rasterVis::levelplot(ras2, margin = NA, par.settings = RdBuTheme) + layer(sp.polygons(cont))

correct extent raster

rasPrj <- projectRaster(ras, ras2, over = FALSE)
rasPrj
# Correct extent, but missing data
rasterVis::levelplot(rasPrj, margin = NA, par.settings = RdBuTheme) + layer(sp.polygons(cont))

correct extent, missing data

1 votos

Pruebe raster::rotate(pr_ccsm4_2.5deg) que es precisamente para esta tarea. Tenga en cuenta que el después de cambiar el hemisferio es probablemente extent(-180, 180, -90, 90) por lo que puedes establecerlo después, pero debes comprobarlo con cuidado - a menudo hay una ambigüedad sobre el borde de la celda frente al centro de la celda, pero no siempre es tan sencillo.

0 votos

Muchas gracias @mdsumner, no tengo ni idea de cómo se me pasó cuando la lectura a través de la raster documentación.

0 votos

¡rotar es un nombre poco obvio cuando se piensa en una imagen!

6voto

sgwill Puntos 2444

Pruebe raster::rotate que es precisamente para esta tarea.

Es decir

raster::rotate(pr_ccsm4_2.5deg)

Tenga en cuenta que el después de cambiar el hemisferio es probablemente extent(-180, 180, -90, 90) así que puedes configurarlo después, pero deberías comprobarlo con cuidado. A menudo existe una ambigüedad entre borde de celda y centro de celda, pero no siempre es tan sencillo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X