[R-sig-Geo] Converting array into raster brick

Robert J. Hijmans r.hijmans at gmail.com
Wed Dec 22 18:44:54 CET 2010


Christian,

You should also be able to do this:

out <- setValues(x, xx)

(where x is a RasterBrick and xx a matching 3 dimensional array)

Robert

On Wed, Dec 22, 2010 at 3:06 AM, Christian Kamenik
<christian.kamenik at giub.unibe.ch> wrote:
> Dear all,
>
> I replaced my layer-by-layer approach
>
> for (l in 1:nlayers(x)) x
> <-setValues(x,values=as.vector(t(xx[,,l])),layer=l)
>
> with the new functionality of brick
>
> out <-
> brick(xx,xmn=slot(extent(x),'xmin'),xmx=slot(extent(x),'xmax'),ymn=slot(extent(x),'ymin'),ymx=slot(extent(x),'ymax'),crs=projection(x))
>
> where x is the original RasterBrick, xx is a three-dimensional array and out
> is the new RasterBrick.
>
> It worked perfectly fine!
>
> Many thanks, Christian
>
>> updated function, without redundant  sapply. R
>>
>> library(raster)
>> # new method, included in raster 1.7-17
>> setMethod('brick', signature(x='array'),
>>        function(x, xmn=0, xmx=1, ymn=0, ymx=1, crs=NA) {
>>                dm<- dim(x)
>>                if (length(dm) != 3) {
>>                        stop('array has wrong dimensions')
>>                }
>>                b<- brick(xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx, crs=crs)
>>                dim(b)<- dm
>>                setValues(b, matrix(as.vector(x), ncol=dm[3]))
>>        }
>> )
>>
>> On Sun, Dec 19, 2010 at 8:06 AM, Robert J. Hijmans<r.hijmans at gmail.com>
>>  wrote:
>>>
>>> Agus,
>>>
>>> I have added an new method for 'brick', included below
>>>
>>> library(raster)
>>> # new method, included in raster 1.7-17
>>> setMethod('brick', signature(x='array'),
>>>        function(x, xmn=0, xmx=1, ymn=0, ymx=1, crs=NA) {
>>>                dm<- dim(x)
>>>                if (length(dm) != 3) {
>>>                        stop('array has wrong dimensions')
>>>                }
>>>                b<- brick(xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx, crs=crs)
>>>                dim(b)<- dm
>>>                setValues(b, matrix(sapply(x, as.vector), ncol=dm[3]))
>>>        }
>>> )
>>>
>>> r = raster(nrow=5, ncol=5)
>>> r[] = 1:25
>>> s = stack(r,r*2,r*3)
>>>
>>> a = as.array(s)
>>> b = brick(a)
>>> # values of b are the same as those of a
>>> sum(getValues(s) != getValues(b))
>>>
>>> Best, Robert
>>> On Sun, Dec 19, 2010 at 3:20 AM, Agustin Lobo<alobolistas at gmail.com>
>>>  wrote:
>>>>
>>>> Robert,
>>>>
>>>> Converting from a regular 3D array to brick is probably going to be
>>>> quite a  common operation,
>>>> perhaps you could consider a simpler syntax in the future, i,e:
>>>>
>>>> r = as.brick(x)
>>>>
>>>> where x would be a 3D array?
>>>>
>>>> Agus
>>>>
>>>> 2010/12/16 Robert J. Hijmans<r.hijmans at gmail.com>:
>>>>>
>>>>> Christian,
>>>>>
>>>>> Could be quicker if you make a matrix out of the array (or, if
>>>>> possible, avoid the array in the first place). See below
>>>>>
>>>>> library(raster)
>>>>>
>>>>> # create an array
>>>>> m<- matrix(1:100, ncol=10, byrow=TRUE)
>>>>> a<- array(list(m, m, m, m, m))
>>>>>
>>>>> # empty RasterBrick
>>>>> x<- brick(ncol=10, nrow=10)
>>>>>
>>>>> # make matrix from array
>>>>> v<- sapply(a, function(x) as.vector(t(x)))
>>>>>
>>>>> x<- setValues(x, v)
>>>>> plot(x)
>>>>>
>>>>>
>>>>> Best, Robert
>>>>>
>>>>> On Thu, Dec 16, 2010 at 12:26 PM,<christian.kamenik at giub.unibe.ch>
>>>>>  wrote:
>>>>>>
>>>>>> Dear all,
>>>>>>
>>>>>> I needed to convert an array into a RasterBrick object. The output did
>>>>>> not
>>>>>> need to be written to memory, as assessed by canProcessInMemory(). The
>>>>>> only
>>>>>> way to put the data into the RasterBrick that worked for me was layer
>>>>>> by
>>>>>> layer:
>>>>>>
>>>>>> for (l in 1:nlayers(x)) x
>>>>>> <-setValues(x,values=as.vector(t(xx[,,l])),layer=l)
>>>>>>
>>>>>> This was quite complicated and slow. So I am wondering if there is a
>>>>>> better
>>>>>> way of doing this.
>>>>>>
>>>>>> Many thanks, Christian
>>>>>>
>>>>>> _______________________________________________
>>>>>> R-sig-Geo mailing list
>>>>>> R-sig-Geo at r-project.org
>>>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>>>>
>>>>> _______________________________________________
>>>>> R-sig-Geo mailing list
>>>>> R-sig-Geo at r-project.org
>>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>>>
>
>
> --
> -----------------------------------------------
> Oeschger Centre for Climate Change Research, Institute of Geography&
>  Institute of Plant Sciences
> University of Bern
>
> http://www.stomatocysts.unibe.ch/kamenik
> mailto: christian.kamenik at giub.unibe.ch
>
> Postal address:
> Dr. Christian Kamenik
> Institute of Geography
> Erlachstrasse 9a, Trakt 3
> 3012 Bern, Switzerland
>
> Tel. +41 (0)31 631 5091
> Fax +41 (0)31 631 43 38
>
>



More information about the R-sig-Geo mailing list