[R-sig-Geo] Converting array into raster brick
Christian Kamenik
christian.kamenik at giub.unibe.ch
Wed Dec 22 12:06:51 CET 2010
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