[R-sig-Geo] problems to stack() rasters due to different pixel resolution and raster extent
Lionel Hertzog
s6lihert at uni-bonn.de
Thu Sep 12 13:27:22 CEST 2013
Dear Gabriele,
You should not use the 'res' function to set the raster resolution once
it has values in it, to achieve this you need to use whether the
'aggregate' or 'disaggregate' function to change the resolution since
the cell values need to be re-computed.
In your case it appears that the difference in extent and resolution
comes from one row (9813 vs 9812). I would recreate a new raster
removing this extra row, below are some sample code:
#create two raster with one row difference leading to small variation in
resolution and extent
e1<-extent(c(0,10,0,10))
r1<-raster(nrows=10,ncols=10,ext=e1)
values(r1)<-rnorm(100,0,1)
e2<-extent(c(0,10,0,11))
r2<-raster(nrows=11,ncols=10,ext=e2)
values(r2)<-rnorm(110,0,1)
#create a third raster having the dimension of r1 and taking the data
from the first 10 rows of r2
r3<-r1
values(r3)<-r2[1:100]
stack(r1,r3)
There might be other more elegant ways to achieve this but this is how I
would do it.
Yours,
Lionel
On 12/09/2013 12:59, Gabriele Cozzi wrote:
> Dear list,
>
> I was given three raster files with 'slope', 'aspect' and 'altitude' of my
> study site. I realised that one of the three rasters (namely 'altitude')
> has a slightly different raster cell resolution, which results in a
> slightly different raster extent and does not allow me to raster::stack()
> the three layers to create a single stack object.
> I tried to change the raster resolution using raster::res() for the raster
> 'altitude' but, when I subsequently cropped the three rasters with an
> object of class extent, I still got different extents between "slope and
> aspect" vs. "altitude".
>
> Any advice on how to solve this cell resolution incongruence is very
> welcome.
> Here below I report the output to make things more understandable.
>
> Thanks in advance,
> Gabriele
>
>
>
> #----------------
> #----------------
>
> aspect <- raster("~/Envir/aspect/prj.adf")
> slope <- raster("~/Envir/slope/prj.adf")
> altitude <- raster("~/Envir/20130508094222_992463356.tif")
>
> aspect ( N.B. 'slope' returns exactly the same attributes!)
> #class : RasterLayer
> #dimensions : 9813, 8428, 82703964 (nrow, ncol, ncell)
> #resolution : 27.28532, 27.28532 (x, y)
> #extent : 135446.9, 365407.6, 4345919, 4613669 (xmin, xmax, ymin,
> ymax)
> #coord. ref. : +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0
> +units=m +no_defs
>
> altitude
> #class : RasterLayer
> #dimensions : 9812, 8428, 82695536 (nrow, ncol, ncell)
> #resolution : 27.28532, 27.28677 (x, y)
> #extent : 135446.9, 365407.6, 4345919, 4613656 (xmin, xmax, ymin,
> ymax)
> #coord. ref. : +proj=utm +zone=38 +datum=WGS84 +units=m +no_defs
> +ellps=WGS84 +towgs84=0,0,0
>
> ex <- extent(animal_locations)
> ex
> #class : Extent
> #xmin : 257473.1
> #xmax : 312499.1
> #ymin : 4452821
> #ymax : 4570717
>
> Before using the function raster.crop <- crop('raster_file', ex) to crop
> all rasters to the same extent, I tried to change the resolution of
> 'altitude' using
>
> res(altitude) <- 27.28532
>
> altitude
> #class : RasterLayer
> #dimensions : 9813, 8428, 82703964 (nrow, ncol, ncell)
> #resolution : 27.28532, 27.28532 (x, y)
> #extent : 135446.9, 365407.6, 4345905, 4613656 (xmin, xmax, ymin,
> ymax)
> #coord. ref. : +proj=utm +zone=38 +datum=WGS84 +units=m +no_defs
> +ellps=WGS84 +towgs84=0,0,0
>
> When I then run crop() for aspect and the new defined altitude I however
> become different extents (i.e. ymin and ymax) despite now the dimensions
> and resolutions are the same
>
> crop(aspect, ex)
> #class : RasterLayer
> #dimensions : 5054, 2749, 13893446 (nrow, ncol, ncell)
> #resolution : 27.28532, 27.28532 (x, y)
> #extent : 247480.5, 322487.8, 4442809, 4580709 (xmin, xmax, ymin,
> ymax)
> #coord. ref. : +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0
> +units=m +no_defs
> #names : prj
> #values : -1, 359.8158 (min, max)
>
> crop(altitude, ex)
> #class : RasterLayer
> #dimensions : 5054, 2749, 13893446 (nrow, ncol, ncell)
> #resolution : 27.28532, 27.28532 (x, y)
> #extent : 247480.5, 322487.8, 4442823, 4580723 (xmin, xmax, ymin,
> ymax)
> #coord. ref. : +proj=utm +zone=38 +datum=WGS84 +units=m +no_defs
> +ellps=WGS84 +towgs84=0,0,0
>
> It also appears to me that by redefining res(altitude) I loose the actual
> values assigned to each pixel. Is there an argument to assign to the new
> pixels the value of the centre of the pixel?
>
>
>
More information about the R-sig-Geo
mailing list